【问题标题】:Dynamic Range Used for Intersect Target用于相交目标的动态范围
【发布时间】:2019-01-20 12:26:22
【问题描述】:

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

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

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

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

谢谢

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

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

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

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

【问题讨论】:

  • 避免发布您的代码图片,因为它会导致无法复制和粘贴以供他人测试,并减少人们使用它的机会。相反,请复制代码并将其粘贴到此处,以便希望帮助您的人更容易地帮助您。
  • 感谢 Fabulous 的提示。

标签: dynamic range intersect


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多