0

ワークブック内のすべてのワークシートで次のことを実行するマクロを作成しようとしています。

Range("U10").Select
    FormulaR1C1 = "=R3C2"
    Range("U10").Select
    Selection.AutoFill Destination:=Range("U10:U19"), Type:=xlFillDefault
    Range("U10:U19").Select
    Selection.Copy
    Range("V10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("V10:V19").Select
        Selection.Copy
    Range("U10").Select
    ActiveSheet.Paste
    Range("V9:V19").Select
    Selection.ClearContents
    Range("A16").Select
    Selection.ClearContents

私はもう試した:

Sub parse()

    Dim ws As Worksheet
            For Each ws In ThisWorkbook.Worksheets

   'The above code

        Next ws

End Sub

残念ながら、これは現在アクティブなシートにこのマクロを適用しているだけのようです。

範囲を適切に参照していないことに関係していると感じています(VBAは初めてなので、説明があれば解決に役立ちます!)。すなわち。ws.Range... などのようにする必要がありますか、それともまったく別のことをする必要がありますか?

4

2 に答える 2

6

あなたはかなり近いです

Sub parse()

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets

        ws.Range("U10:U19").FormulaR1C1 = "=R3C2"
        ws.Range("U10:U19").Value=ws.Range("U10:U19").value
        ws.Range("A16").ClearContents

    Next ws

End Sub

TimとGimpが述べたように、コードを圧縮できるほど、効率が高くなり、保守が容易になります。これには、ステートメントの回避.Select、不要な操作(値を貼り付けるための前後の操作など)などが含まれます。

于 2012-10-11T18:15:04.257 に答える
0

次のように組み合わせる必要があります。

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .Range("U10").Select
            FormulaR1C1 = "=R3C2"
            .Range("U10").Select
            Selection.AutoFill Destination:=.Range("U10:U19"), Type:=xlFillDefault
            .Range("U10:U19").Select
            Selection.Copy
            .Range("V10").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            .Range("V10:V19").Select
            Selection.Copy
            .Range("U10").Select
            ActiveSheet.Paste
            .Range("V9:V19").Select
            Selection.ClearContents
            .Range("A16").Select
            Selection.ClearContents
        End With
    Next ws

理由は、各範囲参照の前に、その範囲を使用するワークシートを付ける必要があるためです。これを行うには、を使用するws.Range().select each timeか、上記のようにすべてを一緒にブロックします。

そうは言っても、yoruコードの不要な行をたくさん削除することもできます。次のようになります...

Sub parse()

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .Range("U10").FormulaR1C1 = "=R3C2"
            .Range("U10").AutoFill Destination:=.Range("U10:U19"), Type:=xlFillDefault
            .Range("U10:U19").Copy
            .Range("V10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            .Range("V10:V19").Copy
            .Range("U10").Paste
            .Range("V9:V19").ClearContents
            .Range("A16").ClearContents
        End With
    Next ws
End Sub
于 2012-10-11T18:16:02.863 に答える