我在下面有以下代码。而不是使用停滞范围(即范围(" 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
答案 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
,
从而使您的范围充满活力。