用于相交目标的动态范围

时间:2018-08-13 17:54:54

标签: dynamic range intersect

我正在处理一个电子表格,该电子表格利用用户输入来填写表格。此数据输入到具有许多列的表中。我有一个命令按钮,用于创建新行并插入新订单项所需的所有数据验证(以下是示例)。

Spreadsheet the user sees

我的问题与其他单元格基于“是”或“否”字符串所依赖的特定列(蓝色圆圈)有关。如果该列为“是”,则相邻的单元格会执行某项操作。如果该列为“否”,则相邻的单元格将执行其他操作。

随着该表在行中的增长,我关注的列范围将动态变化。如果工作表使用“ Worksheet_Change(ByVal Target As Range)”子项在该动态范围内遇到更改事件,我希望VBA代码能够运行。

现在,我在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

有人可以帮助我解决我收到的错误消息“类型不匹配”吗?我是否将动态范围正确输入到相交代码中?

谢谢

****更新-有关澄清的更多信息*****

我已在要评估的数组中添加了一些信息。下面是我的电子表格的快照。

Info entered into the spreadsheet

进入调试模式时,我正在查看“本地表”,并看到我已成功将信息捕获到数组中。

Local Values in the VBA code

我需要对此数组运行相交命令

1 个答案:

答案 0 :(得分:0)

此问题已解决。下面是我用来确定动态范围的代码,然后该代码评估该范围的变化。

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”循环来执行 我的条件格式。