【发布时间】:2020-07-02 21:24:37
【问题描述】:
过去 3 天我一直在努力解决这个问题,所以请帮助...
我想要做的是当我运行一个宏1时(为了论证):
- 将弹出窗口以选择应排序的单元格范围
- 按照选择的最后一列(或第 5 列)(从最低到最高的数字)对这些进行排序
这里的问题是所选区域会改变 eveytime(我在 excel 中创建了类似树的东西),因此它不能是需要按最后一个(或本例中的第 5 个)排序的特定列选中(在下面的代码中我不知道如何更改 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 中提取结束列并使用它来设置排序的 Key。您还需要处理用户不选择任何内容或取消的情况。
-
我不建议以这种方式嵌套,但您可以使用 Dim endCol As String 获取列: endCol = Split(Split(rngStart.Address, ":")(1), "$") (1) 然后与标题行连接以创建键,例如范围(endCol & 1)
-
你的
rngStart变量一开始就被搞砸了。您首先通过选择它来获取范围,当您按 OK 时,所选范围将保存在变量中,并且实际选择的单元格返回到您运行代码之前选择的任何内容。然后下一行告诉它将所选单元格保存在变量中 - 因此它保存在代码开始之前选择的任何内容。然后下一行告诉它选择变量中的任何内容 - 这将始终是当前选择,因此该行不做任何事情。不过,提供的答案似乎可以解决这个问题。 :)