我是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
我还看到一些使用Dim和Set函数创建列表的VBA脚本模板,即设置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
答案 0 :(得分:3)
<强> UPD:强>
试试这个:
Sub test()
Dim rngName As Range
Dim rngDate As Range
Dim emptyDates As Range
Dim ws As Worksheet
Dim lastrow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
With ws
Set rngName = .Range("1:1").Find(What:="Name", MatchCase:=False)
Set rngDate = .Range("1:1").Find(What:="Date", MatchCase:=False)
If Not rngName Is Nothing Then
lastrow = .Cells(.Rows.Count, rngName.Column).End(xlUp).Row
On Error Resume Next
Set emptyDates = .Range(rngDate, .Cells(lastrow, rngDate.Column)).SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not emptyDates Is Nothing Then
emptyDates.EntireRow.Delete
End If
End If
With .Sort
.SortFields.Clear
If Not rngName Is Nothing Then
.SortFields.Add Key:=rngName, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End If
If Not rngDate Is Nothing Then
.SortFields.Add Key:=rngDate, _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End If
.SetRange ws.Cells
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End Sub
注意:
Sheet1
行中的ThisWorkbook.Worksheets("Sheet1")
更改为适合您的工作表名称SortFields
,对应于该列答案 1 :(得分:-1)
按照此测试代码,使用dinam last cell的7列。通过RCC66
Sub Auto_Open()
' Order by
Dim LastRow As Integer
With ActiveSheet
intLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"Q3:Q" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"L3:L" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"O3:O" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"J3:J" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"B3:B" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"H3:H" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Invoices").Sort.SortFields.Add Key:=Range( _
"E3:e" & intLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Invoices").Sort
.SetRange Range("A1:R" & intLastRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub