我有一个时不时使用的宏。它成功删除了我想要的列,但它没有按我想要的方式对列进行排序。当我调试 VBA 时,我看到它引用了我用来创建宏的原始 Excel 电子表格。
当我在与原始文件相同的同一文件中的不同工作表上播放此宏时,什么也没有发生。
我必须对 VBA 进行哪些更改才能使其在任何工作表上运行?
这是 VBA:
Sub HF_weekly_file()
'
' HF_weekly_file Macro
'
'
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
Columns("C:N").Select
Selection.Delete Shift:=xlToLeft
Columns("D:H").Select
Selection.Delete Shift:=xlToLeft
Columns("J:Q").Select
Selection.Delete Shift:=xlToLeft
Columns("L:Y").Select
Selection.Delete Shift:=xlToLeft
Columns("M:M").Select
Selection.Delete Shift:=xlToLeft
Range("A2").Select
ActiveWorkbook.Worksheets("Leads_1464523080").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Leads_1464523080").Sort.SortFields.Add Key:=Range( _
"F2:F73"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Leads_1464523080").Sort.SortFields.Add Key:=Range( _
"G2:G73"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Leads_1464523080").Sort.SortFields.Add Key:=Range( _
"D2:D73"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Leads_1464523080").Sort.SortFields.Add Key:=Range( _
"I2:I73"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Leads_1464523080").Sort
.SetRange Range("A1:M73")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
答案1
您已正确识别问题:您对工作表的引用是硬编码的,即您在代码中使用工作表的名称,而不是对工作表的动态引用。因此,当您运行代码时,它会影响名为“Leads_1464523080”的工作表,而不是活动工作表。
要使代码对活动工作表进行排序,您需要更改每个实例
ActiveWorkbook.Worksheets("Leads_1464523080")
到
ActiveSheet
这将使排序命令应用于 Excel 中的活动工作表。
答案2
以下代码用于选择一列,然后将其删除。它与在宏开头找到的代码相同。要编辑此代码,请将列字母更改为所需的列。
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
注意:删除第一列时,其他所有列都会移动。例如:如果您要删除 A 列和 C 列,如果删除 A 列,C 列会移动到 B 列,因此您需要删除 B 列。如果您从右向左删除列,则可以简化此过程,因为移动不会产生影响。