我从这个网站复制了一些我认为可以解决我试图解决的问题的代码。我从Using Sort in VBA for a Range that Changes复制了原始代码 我在改变方式上做的很少,只是将数据的左上角定义为在单元格A3中。最终代码如下:
Sub sortOnlySelectedArea()
Dim actSheet As Worksheet
Dim upper, lower As Integer
Dim tempString As String
Dim selectedArea As Range
Set actSheet = Application.Worksheets("Sheet1")
' here you have to put in your part to make the right
'actSheet.Range("E5:G6").Select
ActiveSheet.Range("a3").CurrentRegion.Select
Set selectedArea = Selection
upper = selectedArea.Row
lower = upper + selectedArea.Rows.Count - 1
tempString = "F" & CStr(upper) & ":F" & CStr(lower)
actSheet.Sort.SortFields.Clear
actSheet.Sort.SortFields.Add Key:=Range(tempString), _
SortOn:=xlSortOnValues, Order:=xlAscending,
DataOption:=xlSortNormal
With actSheet.Sort
.SetRange selectedArea
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我的问题是代码几乎在最后失败了。我已经逐步完成了代码,它正在正确地获取数据区域。当它到达最后但是一行(.Apply)时它会失败,然后突出显示。调试消息指示运行时错误1004:排序引用无效。 我不能很好地遵循代码来查看如何选择排序范围。理想情况下,我希望能够对C列进行排序,但如果需要,可以选择A列。我想要排序的范围是A3:F105。
答案 0 :(得分:2)
也许这更像你需要的......
Sub someSortRoutine()
Dim sortsheet As Worksheet
Dim sortArea As Range
Dim keyColumn As Range
Set sortsheet = Application.Worksheets("Sheet1")
Set sortArea = sortsheet.Range("a3").CurrentRegion
Set keyColumn = Application.Intersect(sortsheet.Range("F:F"), sortArea)
sortsheet.Sort.SortFields.Clear
sortsheet.Sort.SortFields.Add Key:=keyColumn, _
SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With sortsheet.Sort
.SetRange sortArea
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
答案 1 :(得分:0)
当我的区域在F列中不包含任何数据时,我能够重新创建运行时错误1004。
该行
tempString = "F" & CStr(upper) & ":F" & CStr(lower)
正在确定排序列。如果您将F更改为A,我认为会在A列上对其进行排序。
答案 2 :(得分:0)
我会理所当然地知道,CurrentRegion Property代表一个或多个特定单元格周围的数据孤岛。排序操作的成功与否取决于此。
我眼中最明显的潜在冲突是告诉 actSheet 代表 Sheet1 但随后告诉 actSheet 对所选当前区域进行排序ActiveSheet
。这些不一定是相同的工作表。
以下尝试在对实际排序例程使用替代编码方法时合并对工作表的引用。
Sub sortOnlySelectedArea()
With Worksheets("Sheet1").Range("a3").CurrentRegion
.Cells.Sort Key1:=.Columns(6), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
End With
End Sub
该子程序的名称是欺骗性的,因为您的原始文件选择了活动工作表的A3单元格周围的.CurrentRegion
,但它做了同样的事情。如上所述,ActiveSheet
和Worksheets("Sheet1")
存在一些混淆。您需要选择一种引用方法并坚持下去。来回弹跳只会导致可能无法在任何时候重现的冲突(例如,只有当Sheet1 不活动工作表时)。
最后,让Excel 猜测是否有标题行永远不是一个好主意。你应该知道你是否做过。