После предоставления этого ответа меня спросили, как заставить следующий код работать в случае, если у вас есть несколько ячеек (т. е. TARGET_CELL_ADDRESS должен принимать несколько значений), и каждая ячейка имеет свой собственный параметр (в данном случае PLACEHOLDER_TEXT).
Option Explicit
Const TARGET_CELL_ADDRESS As String = "C2"
Const PLACEHOLDER_TEXT As String = "My placeholder text"
Const GREY_COLOR = 10921637
Const BLACK_COLOR = 0
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Replace(Target.AddressLocal, "$", "") = TARGET_CELL_ADDRESS Then
'Clear text content
With Target
If .Value2 = PLACEHOLDER_TEXT Then
.Value2 = ""
.Font.Color = BLACK_COLOR
End If
End With
Else
'Restore placeholder text if needed
Dim Rng As Range
Set Rng = Me.Range(TARGET_CELL_ADDRESS)
With Rng
If .Value2 = vbNullString Then
.Value2 = PLACEHOLDER_TEXT
.Font.Color = GREY_COLOR
ElseIf .Value2 = PLACEHOLDER_TEXT Then
If .Font.Color <> GREY_COLOR Then
.Font.Color = GREY_COLOR
End If
End If
End With
End If
End Sub
Я подумал, что было бы лучше ответить на отдельный вопрос и попытаться сделать заголовок вопроса более общим. Надеюсь, это облегчит поиск ответа на такого рода вопросы.
В этом случае нам нужна структура данных, которая позволит нам перебирать разные ячейки и получать соответствующий текст для каждой ячейки.
Хорошим выбором для этого является скриптовый словарь, поскольку он позволит нам хранить адрес ячейки как key
и текст как value
(он же элемент).
Обратите внимание, что :
Чтобы использовать Словарь (с ранней привязкой), вам необходимо сначала добавить ссылку:
Перейдите в Инструменты->Ссылки из меню Visual Basic. Найдите «Майкрософт Scripting Runtime» в списке и установите флажок рядом с ним.
Подробнее о том, как пользоваться словарями , читайте здесь .
Получив словарь, мы сможем обернуть код, который необходимо выполнить для нескольких ячеек, вокруг цикла For Each
. Это позволит повторно использовать код с каждым key
(адресом ячейки), заменяющим константу TARGET_CELL_ADDRESS
, и соответствующим item
для замены константы PLACEHOLDER_TEXT
.
Option Explicit
Const GREY_COLOR = 10921637
Const BLACK_COLOR = 0
'Let's define the dictionary at the worksheet module level, so we can store its values in between each run of Worksheet_SelectionChange
Private CellsDict As Dictionary
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Create the dictionary to store the information (if it doesn't already exists)
If CellsDict Is Nothing Then
Set CellsDict = New Dictionary
CellsDict.Add "C9", "Text for C9"
CellsDict.Add "C21", "Text for C21"
CellsDict.Add "C58", "Text for C58"
CellsDict.Add "C96", "Text for C96"
End If
'Now let's loop over each key inside the dict to perform the same changes/checks on each cells listed inside of it.
Dim Key As Variant
For Each Key In CellsDict.Keys
''''''''''''''''''''''''''
'Here goes the code that needs to run for each cell address in the dictionary
''''''''''''''''''''''''''
If Replace(Target.AddressLocal, "$", "") = Key Then
'Clear text content
With Target
If .Value2 = CellsDict.Item(Key) Then
.Value2 = ""
.Font.Color = BLACK_COLOR
End If
End With
Else
'Restore placeholder text if needed
Dim Rng As Range
Set Rng = Me.Range(Key)
With Rng
If .Value2 = vbNullString Then
.Value2 = CellsDict.Item(Key)
.Font.Color = GREY_COLOR
ElseIf .Value2 = CellsDict.Item(Key) Then
If .Font.Color <> GREY_COLOR Then
.Font.Color = GREY_COLOR
End If
End If
End With
End If
''''''''''''''''''''''''''
Next
End Sub
Примечание. Этот код должен хорошо работать даже для дюжины ячеек, но его необходимо оптимизировать, если список ячеек на несколько порядков больше.