EXCEL VBA:自定义排序中的动态范围

EXCEL VBA:自定义排序中的动态范围,vba,excel,sorting,Vba,Excel,Sorting,我目前正在学习Excel中VBA编程的艺术,但我的头撞到了墙上,试图找出如何使宏动态化 我正在尝试创建一个宏,它应该对两列进行排序(V&W)。V列是一个名称列表,W列是股票交易的数量,我想根据交易数量(从大到小)对名称进行排序。每次运行宏时,名称(行)的数量都会改变,这就是为什么我需要动态范围 这是我的静态代码: Range("V5").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selec

我目前正在学习Excel中VBA编程的艺术,但我的头撞到了墙上,试图找出如何使宏动态化

我正在尝试创建一个宏,它应该对两列进行排序(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列都有公式,“空白”单元格将在顶部结束,交易的名称和数量将在底部结束

我希望你们中的一些人有技能,使我的范围充满活力


谢谢:-)

尝试下面的代码,代码注释中的解释:

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   
选项显式
子SORTCLW()
最后一排一样长
'始终使用完全限定对象,而不是选择
带工作表(“合作伙伴属性”)

LastRow=.Cells(.Rows.Count,“W”).End(xlUp)。Row'尝试下面的代码,在代码注释中进行解释:

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   
选项显式
子SORTCLW()
最后一排一样长
'始终使用完全限定对象,而不是选择
带工作表(“合作伙伴属性”)

LastRow=.Cells(.Rows.Count,“W”).End(xlUp)。Row'动态设置范围

lastrow = Cells(Rows.Count, 21).End(xlUp).Row
Range("V5:W" & lastrow)

动态设置范围

lastrow = Cells(Rows.Count, 21).End(xlUp).Row
Range("V5:W" & lastrow)
@谢拉多

我设法找到了以下解决方案,这似乎起到了作用!:-)

谢谢!:-)

@Shai Rado

我设法找到了以下解决方案,这似乎起到了作用!:-)


谢谢!:-)

快到了。。。现在,您想使用
工作表(“合作伙伴属性”)
限定
范围,而不是使用
选择
谢谢!但在我写给Shai的时候,名字被移到了列的底部,因为W列的公式一直到W250。然后,空白单元格被排序为“高于”与合作伙伴和数量的交易,这使他们在顶部的细胞。您有解决方案/补充方案吗?再次感谢!:-)@如果您再试试,它可能适用于u
Sort.SortFields.Add Key:=\urange(“W5”),SortOn:=xlSortOnValues
几乎就在那里了。。。现在,您想使用
工作表(“合作伙伴属性”)
限定
范围,而不是使用
选择
谢谢!但在我写给Shai的时候,名字被移到了列的底部,因为W列的公式一直到W250。然后,空白单元格被排序为“高于”与合作伙伴和数量的交易,这使他们在顶部的细胞。您有解决方案/补充方案吗?再次感谢!:-)@如果您再试试,它可能适用于u
Sort.SortFields.Add Key:=\urange(“W5”),SortOn:=xlSortOnValues
谢谢Shai。如前所述;该表支持250个合作伙伴,这意味着W列一直到W250都有VLOOKUP公式。当我运行宏时,合作伙伴得到SoTeTT,但它们被排列为“小于”空白单元格(列W中的VLoopup单元,由于缺少查找的名称而为空)。因此,合作伙伴名称移动到列的底部(W250)。你有解决这个问题的办法吗?再次感谢!:-)@AVinther这就是排序的工作原理,你希望销售数量为空的合作伙伴在哪里?如果我能上传一张图片,我会容易得多,但我尝试时总是说错误。我试着解释一下:V列是一个合作伙伴列表(大约10-50个)。这些是硬编码的。W列列出了交易数量(根据VLOOKUP公式)。由于该工作表是一个模板,因此该列表与250个合作伙伴兼容,这意味着W列的公式一直到W250左右。我通常有大约40个合作伙伴根据达成的交易数量进行排名。这将使大约210个单元空置。当我运行宏时,210个单元格的排名较高,这会将合作伙伴名称和交易数量移到底部。因为交易的名称和数量链接到工作表中的其他VLOOKUP公式,所以这些公式必须位于顶部。这就是为什么我想根据交易的数量来排序合作伙伴的名字,以及所有的空白单元格都在他们下面:-我是在胡言乱语还是这些都是可以理解的?D@AVinther对于有“helper”列Y的单元格,在其中输入公式
=IF(ISBLANK(W2),1000000,W2)
,这将在该单元格中输入非常高的值。然后可以隐藏此列,并根据此列“Y”进行排序(此列已隐藏,所有空白值都将在末尾),谢谢Shai。如前所述;该表支持250个合作伙伴,这意味着W列一直到W250都有VLOOKUP公式。当我运行宏时,合作伙伴得到SoTeTT,但它们被排列为“小于”空白单元格(列W中的VLoopup单元,由于缺少查找的名称而为空)。因此,合作伙伴名称移动到列的底部(W250)。你有解决这个问题的办法吗?再次感谢!:-)@AVinther这就是排序的工作原理,你希望销售数量为空的合作伙伴在哪里?如果我能上传一张图片,我会容易得多,但我尝试时总是说错误。我试着解释一下:V列是一个合作伙伴列表(大约10-50个)。这些是硬编码的。W列列出了交易数量(根据VLOOKUP公式)。由于该工作表是一个模板,因此该列表与250个合作伙伴兼容,这意味着W列的公式一直到W250左右。我通常有大约40个合作伙伴根据达成的交易数量进行排名。这将使大约210个单元空置。当我运行宏时,210个单元格的排名较高,这会将合作伙伴名称和交易数量移到底部。因为交易的名称和数量链接到工作表中的其他VLOOKUP公式,所以它们是r