VBA - 选择矩阵顶部

问题描述 投票:-3回答:1

每当选择某些范围内的单元格时,我都会使用“worksheet_selectionChange”事件来触发宏。

Public Sub Worksheet_SelectionChange(ByVal Target As Range)

    Select Case Target.Cells.Offset(-???,0).Value
        Case "LABEL_1"
            Tenor = "2W"
            Call MyLameMacro()
        Case....
    End Select
End Sub

这些范围看起来像小矩阵:

enter image description here

如果用户选择标签下面的任何单元格,我希望VBA查找标签位于顶部的任何内容。如果我确切地知道Label的行数有多少,那么使用offset会有效,但它不是常数....

还有另一种方法可以解决这个问题吗?

谢谢 - KC

excel vba excel-vba
1个回答
1
投票

除了有关布局的更多信息之外......您可以使用格式化来构建自己的搜索算法。如果它必须通过数千行(如果您的数据集很大,则找另一种方式),这将减慢速度。

您必须将“labelColor”和“notLabel”替换为标签行的背景颜色。这假设上面的图片是准确的,并且突出显示“标签”。要查找要替换它们的值,只需选择有问题的单元格,然后在VBA的即时窗口中键入“debug.print selection.interior.color”。

通过将标签值和原始地址放在跛脚宏之后的括号中,可以在宏中保留这些值。

我没试过这个。为了做到这一点,我将不得不猜测你的工作簿的设置...但这个代码的近似应该适合你。

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
i = 0
searchLoop:
    If i > 100 Then
        MsgBox ("Infinite loop.  Click OK to stop")
        Exit Sub
    End If
    If Target.Offset([-i], 0).Interior.Color = labelColor Then Call MyLameMacro(Target.Offset([-i], 0), Target.address)
    If Target.Offset([-i], 0).Interior.Color = notLabel Then
        If Target.Offset([-i], 0).Value = "Value" Then Call MyLameMacro(Target.Offset([-i], [-1]).Value, Target.address)
        i = i + 1
        GoTo searchLoop
    End If

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.