2017-03-24 3 views
0

2つの異なるcondiditonsに基づいて範囲をソートしようとしています。 そうするために、私は完璧に動作するマクロを記録しました。Excel VBAの並べ替え方法、実行時エラー1004、 "並べ替え参照が有効ではありません... whithin ..."

コードのマクロ行の一部を 自分の変数などに置き換えようとしたとき、コードが機能せず、いくつかの異なるエラーメッセージが表示されました。

  1. 最初の私が得たのだった:「ファイル名を指定して実行時エラー438オブジェクトは、このプロパティまたはメソッドをサポートしていません」

  2. 他のエラーメッセージがGOTがソート基準となる「ファイル名を指定して実行時エラー1004でした有効ではありません。ソートするデータの範囲内にあることを確認してください。最初のソート・バイ・ボックスは同じでも空でもありません。

    Sub CustomSort() 
    ' CustomSort Macro 
        Range("A1:H958").Select 
        ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Clear 
        ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=Range("A2:A958"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
        ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=Range("H2:H958"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
        With ActiveWorkbook.Worksheets("Run Data from Notes").Sort 
         .SetRange Range("A1:H958") 
         .Header = xlYes 
         .MatchCase = False 
         .Orientation = xlTopToBottom 
         .SortMethod = xlPinYin 
         .Apply 
        End With 
    End Sub 
    

    は、私は、コードを変更(動作しないと、「ファイル名を指定して実行時エラー438を」私を与える):ここで

は、マクロレコーダーからのコードである(それは動作します)

Dim StatusRange As Range 
    Dim PartNumber As Range 
    Dim WholeRange As Range 
    Dim wbkToRun As Workbook 
    Dim NewData As Worksheet 
    Dim LastRow As Long 

    Set wbkToRun = ThisWorkbook 
    Set NewData = Worksheets("Run Data from Notes") 
    LastRow = NewData.Cells.Find("*", searchorder:=xlByRows, SearchDirection:=xlPrevious).Row 
    Set WholeRange = NewData.Range("A2:H" & LastRow) 
    WholeRange.Select 
    ActiveWorkbook.NewData.Sort.SortFields.Clear 
    wbkToRun.NewData.Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
    wbkToRun.NewData.Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 

    With wbkToRun.NewData.Sort 
     .SetRange WholeRange 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

マクロレコーダーコードを使用しているが、範囲を動的に設定された範囲 "WholeRange"に変更すると、エラーメッセージが表示される:「実行時エラー1004。ソート参照が無効です。見たいデータ最初のソート・バイ・ボックスは同じではなく、ブランクではありません。

WholeRange.Select 
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("Run Data from Notes").Sort.SortFields.Add Key:=WholeRange, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("Run Data from Notes").Sort 
     .SetRange WholeRange 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

それは

「.Apply」に壊れる上記の私の2つのコードが動作しない理由を誰かが説明していただけますか? そして私のコードとマクロ記録されたコードとの間にはどのような違いがありますか?おかげさまで

+0

「NewData」は、「ActiveWorkbook」のメンバーではありません。 'ActiveWorkbook'から呼び出す代わりに、参照*自体を使用してください。 – Comintern

+0

ちょっと手を加えて例を挙げてください。完全に理解できなかった。ありがとう。 – Energizer1

答えて

0

コードには多くのエラーがあります。 最初に@Cominternと言ったように、範囲オブジェクトNewDataはそれ自身のオブジェクト変数です。親ワークシートのpropertyではありません。したがって、wbkToRun.NewDataActiveWorkbook.NewDataは有効なVBAではありません。

第2に、並べ替えの際に、keyパラメータを複数列の範囲にすることはできません。各キーは列であるか、列が1つしかない範囲でなければなりません。

With NewData.Sort 
    .SortFields.Clear 
    .SortFields.Add key:=.Columns("A"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal 
    .SortFields.Add key:=.Columns("H"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    .SetRange WholeRange 
    .header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 
+0

このコードは機能します。どうもありがとう! ".Columns()"は、ドットがなくても "Columns()"でなければなりません。 – Energizer1

関連する問題