3

複雑なコピー/貼り付けの演習を行うマクロを作成しています。概念的には非常に簡単ですが、私は 1 つの場所で立ち往生しています。さまざまなデータ ブロックはすべて、さまざまな名前付き範囲で識別されます。この名前のリストを繰り返し処理し、各名前を引数として関数 (実際にはサブルーチンですが、考え方は同じです) に渡す必要があります。データのソースは 1 つのワークブックにあり、宛先は別のワークブックにあります。

これが私が持っているものです(データの1ブロックのみ):

Private Sub copyABU()
   copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
   copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
   copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
   //etc
End Sub

Private Sub copyPaste(thisRange As Range)
    Windows(someworkbook).Range(thisRange).Copy
    Range(thisRange).PasteSpecial Paste:=xlPasteValues
End Sub

残念ながら、これで実行時エラーが発生します。タイプの不一致があると思いますが、これについてはよくわからず、何が欠けているのかわかりません。なぜこれが失敗するのか誰にもわかりますか?(エクセル2010を使用しています。)

ありがとう!

4

2 に答える 2

1

ここに私の答え:

Sub init()
Windows("Book1.xlsx").Activate
Call copyPaste(2, Range(Cells(1, 1), Cells(10, 10)), "copy")
Windows("Book2.xlsx").Activate
Call copyPaste(1, Range(Cells(1, 1), Cells(10, 10)), "paste")
End Sub

Function copyPaste(wksInt As Integer, thisRange As Range, copyPasteStr As String)
    Dim workSheetRange As Range
    With Worksheets(wksInt)
        Set workSheetRange = thisRange
    End With
    workSheetRange.Select
    If copyPasteStr = "copy" Then
        Selection.Copy
    Else
        Worksheets(wksInt).Paste
    End If
End Function

これは、コピーと貼り付けの範囲が同じ次元である限り機能します。寸法が変化する場合は、workSheetRange.Selectを条件に変更し、範囲の最初のセルのみを選択して貼り付ける必要があります。PAX

于 2012-05-24T00:07:56.927 に答える
1

あなたのコードは、いくつかの小さな調整で機能します。

最初に、copyPaste への呼び出しの前に という単語を付ける必要がありますCall。(不要な方は下記をご参照ください。)

Private Sub copyABU()
   Call copyPaste(ThisWorkbook.Names("myRange1").RefersToRange)
   Call copyPaste(ThisWorkbook.Names("myRange2").RefersToRange)
   Call copyPaste(ThisWorkbook.Names("myRange3").RefersToRange)
   ' //etc
End Sub

次に、.Addressafterを追加しthisRangeます。

Private Sub copyPaste(thisRange As Range)
    Range(thisRange.Address).Copy
    thisRange.PasteSpecial Paste:=xlPasteValues
End Sub

わざわざ変数を作成したくなかったsomeworkbookので、その部分を削除しました。

注:Call引数リストを括弧で囲んでプロシージャを呼び出す場合は、キーワードを使用する必要があります。https://stackoverflow.com/a/7715070/138938

Callキーワードを使用したくない場合は、括弧を省略します。

copyPaste ThisWorkbook.Names("myRange1").RefersToRange
于 2012-05-24T01:35:06.683 に答える