我目前正在学习Excel中的VBA编程艺术,但是我试图弄清楚如何使我的宏动态化。“/ p>
我正在尝试创建一个应该对两列(V& W)进行排序的宏。 V列是名称列表,W列是库存交易的数量,我想根据交易数量(从最大到最小)对名称进行排序。每次运行宏时,名称(行)的数量都会改变,这就是我需要动态范围的原因。
这是我的静态代码:
Range("V5").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
ActiveWorkbook.Worksheets("Partner attribution").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Partner attribution").Sort.SortFields.Add Key:= _
Range("W5:W7"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Partner attribution").Sort
.SetRange Range("V5:W7")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("V5").Select
我尝试了一些解决方案,比如引用行计数功能,但由于整个W列都有公式,“空白”单元格将在顶部结束,并且交易的名称和数量在底部结束。
我希望你们中的一些人有能力使我的范围充满活力!
谢谢:-)
答案 0 :(得分:0)
尝试下面的代码,代码注释中的解释:
Option Explicit
Sub SortColW()
Dim LastRow As Long
' always use fully qualified objects instead of Select
With Worksheets("Partner attribution")
LastRow = .Cells(.Rows.Count, "W").End(xlUp).Row '<-- get last row in column "W"
.Sort.SortFields.Clear
' use the LastRow variable to define the last row dynamically
.Sort.SortFields.Add Key:=.Range("W6:W" & LastRow), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("V5:W" & LastRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
答案 1 :(得分:0)
动态设置范围
lastrow = Cells(Rows.Count, 21).End(xlUp).Row
Range("V5:W" & lastrow)
答案 2 :(得分:0)
@Shai Rado
我设法找到了以下解决方案,这似乎可以解决问题! : - )
Range("V5").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Sort key1:=Range("W5", Range("W5").End(xlDown)), _
order1:=xlDescending, Header:=xlNo
谢谢! : - )