Динамический диапазон, используемый для пересечения цели

Я работаю над электронной таблицей, которая использует пользовательский ввод для заполнения таблицы. Эти данные вводятся в таблицу с многочисленными обязательными столбцами. У меня есть командная кнопка, которая создает новую строку и вставляет все проверки данных, необходимые для новой позиции (ниже приведен пример).

Таблица, которую видит пользователь

Моя проблема связана с конкретным столбцом (синий кружок), на который полагаются другие ячейки на основе строки «да» или «нет». Если в столбце стоит «да», соседние ячейки что-то делают. Если в столбце стоит «нет», соседние ячейки делают что-то другое.

По мере того, как эта таблица будет увеличиваться в строках, диапазон столбцов, на котором я сфокусирован, будет динамически меняться. Я хочу, чтобы код VBA запускался, если рабочий лист испытывает событие изменения в этом динамическом диапазоне, используя подпрограмму Worksheet_Change (ByVal Target As Range).

Прямо сейчас я определяю этот динамический диапазон в моем подразделе commandbutton_click, потому что каждый раз, когда я нажимаю кнопку, добавляется новая строка, поэтому мне нужна электронная таблица, чтобы знать, что мой диапазон изменился (см. Мой код ниже).

    Sub CommandButton1_Click()
    Application.EnableEvents = False

    Dim LastRowEntry As Long
    Dim DeviceNo As Integer
    'Dim RTUTable As Range

    'Determine the last entry row & Copy
    LastRowEntry = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    DeviceNo = Sheet1.Cells(Rows.Count, 1).End(xlUp)
    Sheet1.Cells(Rows.Count, 1).End(xlUp).EntireRow.Copy
    'Once the last row is determined, go to the next row to paste
    Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormats
    Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValidation
    'Incase the above cell has Conditional Formatting, we set the color back to "white"
    Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow.Interior.ColorIndex = 0
    Application.CutCopyMode = False
    ActiveCell.Value = DeviceNo + 1

    With RTUTable
    RTUTable = Sheet1.Range(("G7"), Sheet1.Cells(LastRowEntry + 1, "G"))
    End With

    Application.EnableEvents = True
End Sub

Затем в другом подразделе я ввожу код, который «проверит», чтобы увидеть, изменилось ли значение этого динамического диапазона с ответом «да» или «нет». Здесь я ввожу свой определенный динамический диапазон (см. мой код ниже).

Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

'This code checks to see if the Device is polled by RTU
    If Not Intersect(Target, Range(RTUTable)) Is Nothing Then

            If ActiveCell.Value = "NO" Then
               "DO SOMETHING"
            Else
              "DO SOMETHING"
            End If
    End If
Application.EnableEvents = True
End Sub

Может ли кто-нибудь помочь мне с сообщением об ошибке «Несоответствие типов», которое я получаю? Правильно ли я ввожу динамический диапазон в код пересечения?

Спасибо

****Обновление — дополнительная информация для уточнения*****

Я добавил некоторую информацию в массив, который я оцениваю. Ниже приведен снимок моей электронной таблицы.

Информация введена в электронную таблицу

Когда я перехожу в режим отладки, я просматриваю свою «таблицу Locals» и вижу, что успешно собираю свою информацию в массив.

Локальные значения в коде VBA

Мне нужно запустить команду пересечения с этим массивом


person Franklin    schedule 13.08.2018    source источник
comment
Избегайте публикации изображений вашего кода, потому что это делает невозможным копирование и вставку для проверки кем-либо и снижает вероятность того, что люди будут с ним работать. Вместо этого скопируйте код и вставьте его сюда, чтобы тем, кто хочет вам помочь, было проще.   -  person Fabulous    schedule 13.08.2018
comment
Спасибо Fabulous за подсказку.   -  person Franklin    schedule 14.08.2018


Ответы (1)


Это было решено. Ниже приведен код, который я использовал для определения динамического диапазона, а затем код оценивает этот диапазон для изменения.

Dim dyString As String
Dim dyRange As Range
Dim LastRowEntry_1 As Integer
Dim i As Integer

LastRowEntry_1 = Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(-2, 0).row + 1

dyString = "G8:G" & LastRowEntry_1
Set dyRange = Range(dyString)

If Not Intersect(Target, dyRange) Is Nothing Then
    For i = 1 To 6
        If ActiveCell.Value = "NO" Then
            Target.Offset(0, i).Interior.ColorIndex = 23
            Target.Offset(0, i).Font.Color = vbWhite
            Target.Offset(0, i).Value = "N/A"
            Target.Offset(0, i).Locked = True
        ElseIf ActiveCell.Value = "YES" And ActiveCell.Offset(0, i).Value = "N/A" Then
            Target.Offset(0, i).Value = ""
            Target.Offset(0, i).Interior.ColorIndex = 0
            Target.Offset(0, i).Font.Color = vbBlack
            Target.Offset(0, i).Locked = False

Обобщить:

  • Несмотря ни на что, мой динамический диапазон всегда будет начинаться с ячейки «G8».
  • После этого диапазон будет меняться динамически. Либо растет, либо укорачивается в зависимости от информации. Итак, мой «LastRowEntry_1» определяет, где находится эта последняя запись в ячейке. (Примечание: мне пришлось компенсировать это из-за некоторой информации нижнего колонтитула в моей электронной таблице)
  • Я создал строку, в которой я мог объединить диапазон фиксированной ячейки с динамической ячейкой.
  • Затем я установил эту строку как диапазон.
  • Затем, основываясь на том, пересекался ли целевой диапазон или нет, я запускаю цикл «For», чтобы выполнить условное форматирование.
person Franklin    schedule 23.08.2018