在过去的三天里我一直在为这个问题苦苦挣扎,所以请帮忙...
我想做的是当我运行 Macro1 时(为了论证):
- 将弹出窗口以选择应排序的单元格范围
- 通过选择的最后一列(或第五列)对这些进行排序(从最低数字到最高数字)
这里的问题是所选区域每次都会改变(我在Excel中创建了类似树的东西),因此它不能是需要按所选区域的最后一个(或本例中的第五个)排序的特定列(在下面的代码我不知道如何更改 I11:I15)
我得到的但不起作用:
Sub RangeSelectionPrompt()
Dim rngStart As Range
Set rngStart = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
Set rngStart = Selection
rngStart.Select
ActiveWorkbook.Worksheets("CALCULATION").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("CALCULATION").Sort.SortFields.Add Key:=Range( _
"I11:I15"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("CALCULATION").Sort
.SetRange rngStart
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
你可以得到最后一列rngStart
作为范围:
rngStart.Columns(rngStart.Columns.Count)
Using a With
要整理此内容,您可以执行以下操作:
With rngStart
ActiveWorkbook.Worksheets("CALCULATION").Sort.SortFields.Add Key:= _
.Columns(.Columns.Count), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
End With
你还可以整理一下ActiveWorkbook.Worksheets
而是采取Parent
of rngStart
.
最后,您希望捕获如果用户单击“取消”而不是选择范围时会发生的错误。有很多种方法可以做到这一点,但我想到的第一个方法是使用On Error..
trap.
这是整个代码:
Sub RangeSelectionPrompt()
Dim rngStart As Range
Dim WS As Worksheet
On Error Resume Next
Set rngStart = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
Err.Clear
On Error GoTo 0
If rngStart Is Nothing Then
MsgBox "User cancelled"
Else
Set WS = rngStart.Parent
WS.Sort.SortFields.Clear
With rngStart
WS.Sort.SortFields.Add Key:= _
.Columns(.Columns.Count), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
End With
With WS.Sort
.SetRange rngStart
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)