2015-02-23 106 views
0

我从本网站复制了一些代码,我认为这样可以解决我试图解决的问题。我从Using Sort in VBA for a Range that Changes 复制了原始代码我只是将更改的数据的左上角定义为单元格A3中的变化做了很少的工作。最终的代码如下运行:“运行时错误1004:排序参考无效”

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。

+2

'输入代码here' – 2015-02-23 20:21:08

+0

假设你正在使用Range.CurrentRegion你有A3内的任何空白行/列:F105?请参阅https://msdn.microsoft.com/en-us/library/office/aa214248%28v=office.11​​%29.aspx – barryleajo 2015-02-23 20:53:20

回答

0

我能够重新运行时错误1004时,我所在的地区没有包括在列F

线

tempString = "F" & CStr(upper) & ":F" & CStr(lower) 

是确定排序列的任何数据。如果您将F更改为A,我认为会将它按列A排序。

+0

您已经发现了。我意识到我的错误是多么简单(而且很愚蠢)。我认为当我复制了原始代码时,我已经修正了足以解决我的问题的代码。我感谢你和其他2位回应者提供的非常有用的学习体验,这将有助于我在未来处理排序和范围选择 – DaveP 2015-02-25 08:32:07

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但它做同样的事情。如上所述,围绕ActiveSheetWorksheets("Sheet1")存在一些混淆。您需要选择一种参考方法并坚持使用它。来回跳动只能导致冲突,而这些冲突可能无法在所有时间内自我复制(例如,仅当Sheet1是而不是活动工作表时)。

最后,让Excel 猜测不管你是否有标题行都不是好主意。你应该知道你是否做。

+0

谢谢。我想我理解了所有的评论。作为一个业余爱好者,我对我的误解进行了排序,这对我非常有帮助。在自己和其他2篇文章的帮助下,我对过去曾经愚弄过我的数据和范围选择有了很多了解。很高兴我的问题得到解决,并可以自己接近任何未来的这类问题 – DaveP 2015-02-25 08:28:51

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 
+0

谢谢。在三位响应者的帮助下,我不仅在排序方面获得了很大的进步,而且在范围定义方面也取得了重大进展。我可以将其应用于我之前由于缺乏经验而放弃了几次的一个小项目 – DaveP 2015-02-25 08:39:50