2015-02-23 109 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