【问题标题】:Setting Dynamic Ranges in VBA在 VBA 中设置动态范围
【发布时间】:2017-04-12 17:38:23
【问题描述】:

我在下面有以下代码。而不是使用停滞范围(即 Range("AF9:AF50") & Range(AK9:BI50")),我希望实现一个动态范围,该范围从第 9 行开始运行代码到最后一行数据列。我一直在阅读有关如何设置动态范围的信息,但我无法让它工作。非常感谢任何建议/帮助。

Private Sub Worksheet_Change(ByVal target As Range)

Dim cell As Range
Dim controlRng As Range, nRng As Range

Set cell = Range("AK9:BI50")
Set controlRng = Range("AF9:AF50")
Set nRng = Intersect(controlRng, target)

Application.EnableEvents = False

If Not nRng Is Nothing Then
    Select Case target.Value
        Case "No Promotion"
            target.Offset(, 1).Value = Range("M" & target.Row).Value
            target.Offset(, 4).Value = Range("P" & target.Row).Value
            target.Offset(, 9).Value = ""
        Case "Promotion"
            target.Offset(, 1).Value = ""
            target.Offset(, 4).Value = ""
            target.Offset(, 9).Value = 0.07
        Case "Demotion", "Partner", ""
            target.Offset(, 1).Value = ""
            target.Offset(, 4).Value = ""
            target.Offset(, 9).Value = ""
    End Select
End If

If Not Application.Intersect(cell, target) Is Nothing Then
    Select Case target.Column
        Case 37, 39, 43
            target.Offset(, 1).Value = target.Value / Range("V" & target.Row).Value
        Case 38, 40, 44
            target.Offset(, -1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2)
        Case 41, 60
            target.Offset(, 1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2)
        Case 42, 61
            target.Offset(, -1).Value = target.Value / Range("V" & target.Row).Value
    End Select
End If

Application.EnableEvents = True

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    我假设您的问题是处理范围的字母方面并试图使其动态化?如果是这样,您可能正在寻找的语法是。

    Set MyRange = MySheet.Range(MySheet.Cells(TopRow, LeftCol), MySheet.Cells(LastRow, RightCol))
    

    例如,这两个范围是等价的,但第一个可以动态生成。

    TopRow = 1
    LeftCol = 2
    LastRow = 100
    RightCol = 3
    Set MyRange = MySheet.Range(MySheet.Cells(TopRow, LeftCol), MySheet.Cells(LastRow, RightCol))
    
    Set MyOtherRange = mysheet.range("B1:C100")
    

    有几种方法可以找到一列的最后一行,有些方法在其他情况下比其他情况下效果更好。看这里https://www.thespreadsheetguru.com/blog/2014/7/7/5-different-ways-to-find-the-last-row-or-last-column-using-vba

    我经常用这个

    LastRow = sht.Cells(sht.Rows.Count, ColumnNumber).End(xlUp).Row
    

    【讨论】:

    • 嗨贾里德。我遇到的问题是数据行可能会有所不同。本质上,我需要配置代码以识别最后一行并通过最后一行数据应用请求的操作。
    【解决方案2】:

    如果我正确理解了这个问题,那么列和起始行是静态的,只需要动态的最后一行引用。

    Worksheet_Change 事件中:

    Set cell = Range("AK9:" & LastRow("BI"))
    Set controlRng = Range("AF9:" & LastRow("AF"))
    

    选择一个大于您的数据可能包含的任何行数(例如 1000)的行号。然后,在同一个模块中:

    function LastRow(strColumn as string) as long
      LastRow=range(strColumn & 1000).end(xlup).row
    end function
    

    每次引发Worksheet_Change 事件时,VBA 都会重新计算LastRow, 从而使您的范围动态化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多