【发布时间】:2014-02-25 10:40:42
【问题描述】:
我是 VBA 编码的新手,想要一个对多列进行排序的 VBA 脚本。我首先从最小到最大对 F 列进行排序,然后对 K 列进行排序。但是,我希望 Range 值基于列名而不是位置是动态的(即 F 列中的值称为“名称”,但是“名称”不会总是在 F 列中)
我希望更改宏中的所有 Range 值,并且正在考虑用 FIND 函数替换它,我在正确的轨道上吗?
即更改范围_ ("F1:F10695")
类似于Range (Find(What:="Name", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range(Selection, Selection.End(xlDown)).Select
我还看到了一些 VBA 脚本模板,它们使用 Dim 和 Set 函数来创建列表,即设置 x="Name",然后对矩阵中的 X 进行排序。这是更好的方法吗?感谢您的帮助,我在下面附上了基本的 VBA 脚本模板
Sub Macro2()
'
' Macro2 Macro
'
'
Selection.AutoFilter
Range("F1").Select
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
("F1:F10695"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("K1").Select
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
("K1:K10695"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
【问题讨论】:
-
所以,您需要始终按“名称”列排序,然后按“K”列排序吗?如果“名称”在“K”中会怎样?您需要对哪些列(我的意思是整个范围)进行排序?
-
在上面的代码中,F 列标题为“名称”,K 列标题为“日期”。所以我总是想先按“名称”排序,然后按“日期”排序,但它们并不总是在 F 列和 K 列中。我希望代码包含整个工作表。谢谢
-
听起来像是使用
Application.Match的简单问题。我认为 simoco 已经对此有了一个想法,但是如果您向我们提供整个范围覆盖范围,即使标题位置发生变化,它也会有所帮助。你的数据在哪里,即。A:AX、C:Z等等?另外,Date的排序顺序是否也在增加?您提到的`我首先对F列从最小到最大进行排序,然后对K列进行排序`这仍然有点模糊。 :) -
您能解释一下 application.match 是如何工作的吗?为澄清起见,数据范围是 A1:V1000,但这总是在变化。我提取的报告将具有不同的列和行金额/订单,但“名称”和“日期”的列标题将始终相同。它必须先对 Name 递增排序,然后再对 Date 递增排序。谢谢!