首页 > 解决方案 > 用于相交目标的动态范围

问题描述

我正在制作一个利用用户输入来填写表格的电子表格。该数据被输入到需要许多列的表中。我有一个命令按钮,它创建一个新行并插入新行项目所需的所有数据验证(下面是一个示例。)

用户看到的电子表格

我的问题在于特定的列(蓝色圆圈),其他单元格依赖于“是”或“否”字符串。如果该列有“是”,则相邻单元格会执行某些操作。如果该列有“否”,则相邻的单元格会做不同的事情。

随着此表按行增长,我关注的列范围将动态变化。如果工作表使用“Worksheet_Change(ByVal Target As Range) sub.xml”在该动态范围内遇到更改事件,我希望 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

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

谢谢

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

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

输入电子表格的信息

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

VBA 代码中的局部值

我需要用这个数组运行 intersect 命令

标签: dynamicrangeintersect

解决方案


这已解决。下面是我用来确定动态范围的代码,然后代码评估该范围以进行更改。

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

推荐阅读