1
Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With
    .
    .
    [iterate several times]
    .
    .
    Sheets.Add().Name = "CopySheet7"
    With Sheets("BigDataSet - Copy")
        .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1")
    With Sheets("BigDataSet - Copy")
        .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1")
    With Sheets("BigDataSet - Copy")
        .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1")
    With Sheets("BigDataSet - Copy")
        .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1")
    With Sheets("BigDataSet - Copy")
        .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1")
    With Sheets("BigDataSet - Copy")
        .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1")
    With Sheets("BigDataSet - Copy")
        .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1")
    With Sheets("BigDataSet - Copy")
        .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1")
    With Sheets("BigDataSet - Copy")
        .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1")
    With Sheets("BigDataSet - Copy")
        .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1")
    End With


End Sub

これを実行しようとすると、「EndWithを期待しています」というエラーが表示されます。スクリプトの目的は、行の範囲をコピーして、それらを新しい個別のシートに配置することです(その後、最大行数を超えずにExcel 2003で読み取る個別のファイルに配置できます)。このどこかに1つ以上の追加のEndWithステートメントが必要ですか?

4

4 に答える 4

2

Withの部分を何度も繰り返す必要はありません。

With Sheets("BigDataSet - Copy")
  .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
  .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
  .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
  ' Etc
End With

「With」キーワードについては、MSDNのドキュメントを参照してください。

http://msdn.microsoft.com/en-us/library/wc500chb(v=vs.100).aspx

于 2012-07-03T16:53:51.267 に答える
1
With Sheets("BigDataSet - Copy") 
    .Range("A455006", .Range("A502750").End(xlUp)).Copy Destination:=Range("A1") 
    .Range("B455006", .Range("B502750").End(xlUp)).Copy Destination:=Range("B1") 

    .Range("C455006", .Range("C502750").End(xlUp)).Copy Destination:=Range("C1") 
    .Range("D455006", .Range("D502750").End(xlUp)).Copy Destination:=Range("D1") 
    .Range("E455006", .Range("E502750").End(xlUp)).Copy Destination:=Range("E1") 

    .Range("F455006", .Range("F502750").End(xlUp)).Copy Destination:=Range("F1") 
    .Range("G455006", .Range("G502750").End(xlUp)).Copy Destination:=Range("G1") 
    .Range("H455006", .Range("H502750").End(xlUp)).Copy Destination:=Range("H1") 
    .Range("I455006", .Range("I502750").End(xlUp)).Copy Destination:=Range("I1") 
    .Range("J455006", .Range("J502750").End(xlUp)).Copy Destination:=Range("J1") 
End With 

必要なのは1つだけです(Begin)Withmsdn reference)。これがそのブロックの要点であり、毎回親オブジェクトを含めないようにします。

于 2012-07-03T16:54:11.770 に答える
1

End Withが少なくとも1つあるだけでなく、Withステートメントがそれほど多くないようにする必要があります。

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
    With Sheets("BigDataSet - Copy")
        .Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
        .Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
        .Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
        .Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
        .Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
        .Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
        .Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
        .Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
        .Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
        .Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
    End With

End Sub

正しい構文になります。

Withステートメントは、コード行を短縮するための単なる方法です。Withステートメントは、「特定のオブジェクトに対して一連のアクションを実行する」と言い、コードの個々の行を短縮する方法です。

例:

Withステートメントがない場合、上記のコードは次のようになります。

Sub RowRangeMove()
    Sheets.Add().Name = "CopySheet"
        Sheets("BigDataSet - Copy").Range("A65000", .Range("A13000").End(xlUp)).Copy Destination:=Range("A1")
        Sheets("BigDataSet - Copy").Range("B65000", .Range("B13000").End(xlUp)).Copy Destination:=Range("B1")
        Sheets("BigDataSet - Copy").Range("C65000", .Range("C13000").End(xlUp)).Copy Destination:=Range("C1")
        Sheets("BigDataSet - Copy").Range("D65000", .Range("D13000").End(xlUp)).Copy Destination:=Range("D1")
        Sheets("BigDataSet - Copy").Range("E65000", .Range("E13000").End(xlUp)).Copy Destination:=Range("E1")
        Sheets("BigDataSet - Copy").Range("F65000", .Range("F13000").End(xlUp)).Copy Destination:=Range("F1")
        Sheets("BigDataSet - Copy").Range("G65000", .Range("G13000").End(xlUp)).Copy Destination:=Range("G1")
        Sheets("BigDataSet - Copy").Range("H65000", .Range("H13000").End(xlUp)).Copy Destination:=Range("H1")
        Sheets("BigDataSet - Copy").Range("I65000", .Range("I13000").End(xlUp)).Copy Destination:=Range("I1")
        Sheets("BigDataSet - Copy").Range("J65000", .Range("J13000").End(xlUp)).Copy Destination:=Range("J1")
End Sub

簡単に言うと、Withステートメントを使用すると、コードの個々の行をドットで開始でき、そのwithステートメント内で、コンパイラーは、withステートメントで宣言されたものを意味すると想定します。

それで

With Answerer
  ' Inside this with block, any line beginning with "." , 
  ' the compiler will assume you mean "Answerer.".   
  ' Therefore ".FirstName" is the same as "Answerer.FirstName"
  .FirstName = "David"
  .LastName = "Stratton"
End With

と同等です

Answerer.FirstName = "David"
Amswerer.LastName = "Stratton"
于 2012-07-03T16:54:27.157 に答える
0

With-End Withブロックはまったく必要ありません。最初のWithブロックがA13000:J65000の一部を取得して新しいワークシートにコピーし、次にA455006:J502750の一部を取得して2番目の新しいワークシートに貼り付けているようです。コードは次のようにリファクタリングできます。

Sub RowRangeMove()

  Dim wkshts As Excel.Sheets
  Dim targetSheet As Excel.Worksheet
  Dim sourceSheet As Excel.Worksheet

  Set wkshts = Excel.Worksheets

  Application.ScreenUpdating = False

  ' create new sheet
  Set targetSheet = Excel.Worksheets.Add
  targetSheet.name = "CopySheet"

  ' copy from source to first target
  Set sourceSheet = Excel.Worksheets("BigDataSet - Copy")
  sourceSheet.Range(sourceSheet.Cells(13000, 1).End(xlUp), _
                    sourceSheet.Cells(65000, 10)).Copy targetSheet.Range("A1")

  ' create second new sheet
  Set targetSheet = Excel.Worksheets.Add
  targetSheet.name = "CopySheet7"

  ' copy from source to second target
  sourceSheet.Range(sourceSheet.Cells(455006, 1), _
                    sourceSheet.Cells(502750, 10).End(xlUp)).Copy targetSheet.Range("A1")

  Application.ScreenUpdating = True
End Sub
于 2012-07-03T18:13:02.300 に答える