2014-05-06 18 views
0

所以我有幾個問題與下面提供的代碼。我遇到的第一個問題是,如果我在「Sheet1」中並運行代碼,則會出現運行時錯誤「Range class failed Select method」。從「Sheet2」運行代碼運行良好。我對VBA相當陌生,根據我的理解,我已經定義了表單以供選擇,所以我不確定錯誤來自哪裏。防止排序功能失敗時,沒有文字可用於排序

我遇到的第二個問題是使用排序功能。如果源選擇沒有任何文本,則排序功能會失敗,因爲沒有可以排序的東西(有意義)。我只是不知道如何添加一個函數來對選擇進行排序,如果沒有文本,並且只是傳遞它,如果沒有。

我知道我提供的代碼可能相當平庸,並且可能有更好的方法來處理同一組數據。我歡迎任何建議來更好地簡化和管理此代碼。

Sub DaysCalc() 
'Day 1 
    ToColumn Sheets("Sheet1").Range("B4:AD22"), _ 
         Sheets("Sheet2").Range("A2") 

    Sheets("Sheet2").Range("A2:A552").Select 
    Selection.sort Key1:=Sheets("Sheet2").Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ 
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ 
    DataOption1:=xlSortNormal 

    Application.DisplayAlerts = False 

    Sheets("Sheet2").Range("A2:A552").Select 
    Selection.TextToColumns Destination:=Sheets("Sheet2").Range("B2"), DataType:=xlDelimited, _ 
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _ 
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _ 
    :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _ 
    Array(7, 1)) 


End Sub 


Sub ToColumn(rngIn As Range, topCell As Range) 

    Dim rv() As Variant, n As Long, d, r As Long, c As Long 
    Dim nR As Long, nC As Long, i As Long 

    d = rngIn.Value 
    nR = UBound(d, 1) 
    nC = UBound(d, 2) 
    n = nR * nC 
    ReDim rv(1 To n, 1 To 1) 
    i = 0 
    For r = 1 To nR 
    For c = 1 To nC 
     i = i + 1 
     rv(i, 1) = d(r, c) 
    Next c 
    Next r 

    topCell.Resize(n, 1).Value = rv 
End Sub 
+0

這裏有一個關於如何避免使用'.select'的好方法:http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select –

回答

0

錯誤「選擇範圍級別的方法失敗。」當在Sheet1上運行時,這是因爲Sheets("Sheet2").Range("A2:A552").Select行試圖選擇不在活動工作表上的範圍。您不需要真正選擇要進行排序的區域,並且可以使用Sheets("Sheet2").Range("A2:A552").Sort Key1:=Sheets("Sheet2").Range("A2"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

嘗試在空白區域進行排序時,我沒有收到錯誤,但是,當我嘗試使用「文本」列功能。我建議在它之前加上On Error Resume Next以避免這個問題。