Как выполнить аналогичное действие с несколькими ячейками с меняющимся параметром

После предоставления этого ответа меня спросили, как заставить следующий код работать в случае, если у вас есть несколько ячеек (т. е. 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


Я подумал, что было бы лучше ответить на отдельный вопрос и попытаться сделать заголовок вопроса более общим. Надеюсь, это облегчит поиск ответа на такого рода вопросы.

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае нам нужна структура данных, которая позволит нам перебирать разные ячейки и получать соответствующий текст для каждой ячейки.

Хорошим выбором для этого является скриптовый словарь, поскольку он позволит нам хранить адрес ячейки как 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

Примечание. Этот код должен хорошо работать даже для дюжины ячеек, но его необходимо оптимизировать, если список ячеек на несколько порядков больше.

Другие вопросы по теме