1

列 Z の分散を計算するスプレッドシートがあります。月末に値をコピーして同じスプレッドシートの別の列に貼り付け、月ごとの分散を追跡したいと考えています。

列 Z から列 BK にコピーするマクロがあります。

マクロを実行するたびに、列 Z から値をコピーし、次のスケジュールを使用して新しい列に貼り付けたいと思います。

  • 月 1 = 列 BK に値を貼り付ける必要があります
  • 月 2 = 列 BL に値を貼り付ける必要があります
  • 月 3 = 列 BM に値を貼り付ける必要があります
  • 月 4 = 列 BN に値を貼り付ける必要があります
  • 月 5 = 列 BO に値を貼り付ける必要があります
  • 月 6 = 列 BP に値を貼り付ける必要があります
  • 月 7 = 列 BQ に値を貼り付ける必要があります
  • 月 8 = 列 BR に値を貼り付ける必要があります
  • 月 9 = 列 BS に値を貼り付ける必要があります
  • 月 10 = 列 BT に値を貼り付ける必要があります
  • 月 11 = 列 BU に値を貼り付ける必要があります
  • 月 12 = 列 BV に値を貼り付ける必要があります

12回目の繰り返しの後、列Zの値を列BK(開始点)にコピーしたいと思います。これはループを使用して実行できると思いますか?

ループ ロジック/コーディングを思いつくのに苦労しています。

Sub copyCurrentToPrevious()

    Dim ans As String

    On Error Resume Next

    Application.ScreenUpdating = False

    Sheets("Direct Materials").Activate

    ans = MsgBox("Are you sure you want to copy Previous Month Variance to YTD Variance Tracking?  This action can not be undone." & vbNewLine _
      & vbNewLine & "Select Yes to proceed with the copy/paste operation or Select No to cancel.", vbYesNo + vbExclamation, "Product Costing")

    If ans = vbNo Then Exit Sub

    Range("Z9:Z220").Copy
    Range("BK9").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z226:Z306").Copy
    Range("BK226").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z311:Z471").Copy
    Range("BK311").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Range("Z476:Z524").Copy
    Range("BK476").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

    Application.CutCopyMode = False

    Range("A1").Select

    MsgBox "Copy / paste operation is complete.  Select OK to continue.", vbOKOnly + vbInformation, "Product Costing"

    Application.ScreenUpdating = True

End Sub
4

1 に答える 1

1

コードのリファクタリング、必要なオフセットの追加、および他の多くの問題への対処を次に示します。

  • に正しいデータ型を使用するans
  • 使用しないでくださいResume Next。つまり、エラーが発生したかどうかは気にせず、とにかく続行してください。次に何が起こるかは誰にもわからない
  • Activateorは使用しないでくださいSelect(特に必要がある場合を除きます)。WorkbookWorksheet、およびRangeオブジェクトを代わりに使用してください。Worksheets("Direct Materials")暗黙の発言であることに注意してくださいActiveworkbook.Worksheets("Direct Materials")
  • あなたは実際にCopy/する必要はありませんPaste。代わりにを使用しVariant Arrayてください。.Valueこれは高速で、クリップボードを使用する他のアプリによる中断に対して脆弱ではありません。また、あらゆる面で役立つので、習慣化するのも良いでしょう。

Sub copyCurrentToPrevious()
    Dim ans As VbMsgBoxResult
    Dim rng As Range

    On Error GoTo EH

    ans = MsgBox("Are you sure you want to copy Previous Month Variance to YTD Variance Tracking?  This action can not be undone." & vbNewLine _
        & vbNewLine & "Select Yes to proceed with the copy/paste operation or Select No to cancel.", vbYesNo + vbExclamation, "Product Costing")

    If ans = vbNo Then Exit Sub
    Application.ScreenUpdating = False

    With Worksheets("Direct Materials")
        Set rng = .Range("Z9:Z220")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z226:Z306")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z311:Z471")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value

        Set rng = .Range("Z476:Z524")
        rng.Offset(0, Month(Now()) + 36).Value = rng.Value
    End With

    MsgBox "Copy / paste operation is complete.  Select OK to continue.", vbOKOnly + vbInformation, "Product Costing"

    Application.ScreenUpdating = True
Exit Sub
EH:
    MsgBox "Something went horribly wrong!"
End Sub
于 2013-02-05T23:46:34.210 に答える