在VBA中设置动态范围

时间:2017-04-12 17:38:24

标签: excel-vba vba excel

我在下面有以下代码。而不是使用停滞范围(即范围(" AF9:AF50")和范围(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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果我正确理解了该问题,则列和起始行是静态的,仅需要动态的最后一行引用。

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

每次引发LastRow事件时,VBA都会重新计算Worksheet_Change, 从而使您的范围充满活力。