0

ドキュメントを開き、特定の列の最後の行をコピーし、その値を問題のある別のブックの次の空のセルに貼り付けるマクロがあります。これは以前は機能していましたが、この特定のドキュメントでは、最初の行には、次の空のセルを見つけて値を貼り付けたい列 (B) を含む、結合されて中央に配置されたセルがあります。コードを実行すると、私は「この操作では、結合されたセルを同じサイズにする必要があります」というメッセージが表示されます。以下のコードでは、rowToPaste を 2 に変更しようとしました (結合されたセルで最初の行をバイパスするため)、Excel がクラッシュします。最初の空のセルをチェックしているときにマクロが最初の行をバイパスするようにするにはどうすればよいですか? または、同じサイズのセルの結合の問題を回避する別の方法を見つけるにはどうすればよいですか? 前もって感謝します。

Private Sub CommandButton1_Click()
Dim NextRow As Long, LastRow As Long
Dim vMax As Variant
Dim rowToPaste As Integer
Dim lastRowToPaste As Integer
Dim lastCheckedRow As Integer

Set wsMaster = ThisWorkbook.Sheets("FY 13 Budgets -- East Coast")
NextRow = wsMaster.Range("A" & Rows.Count).End(xlUp).Row + 1

Set wbDATA = Workbooks.Open("C:\Documents and Settings\Michael Palkovitz\My Documents\Test\PDF to excel.xlsm")
With wbDATA.Sheets("8A")
    LastRow = .Range("B" & .Rows.Count).End(xlUp).Row

    If LastRow > 1 Then
        .Range("B" & LastRow).Copy
        lastRowToPaste = LastRow + 1000
        rowToPaste = lastCheckedRow
        Do
           rowToPaste = rowToPaste + 1
           If IsEmpty(wsMaster.Range("B" & rowToPaste)) Then
               wsMaster.Range("B" & rowToPaste).PasteSpecial xlPasteValues
               wsMaster.Range("B" & rowToPaste).PasteSpecial xlPasteFormats
               lastCheckedRow = rowToPaste
               Exit Do
           End If
        Loop While (rowToPaste < lastRowToPaste)
    End If
End With

wbDATA.Close False
End Sub
4

1 に答える 1

0

私はあなたの質問にコメントで返信し始めましたが、これは回答として読みやすいと思います.

クリーンアップまたは明確化する必要があることがいくつかあります。

  1. 常に変数宣言が必要です。宣言されていませんwsMasterwbDataVBE で、[ツール] --> [オプション] に移動してこれを設定します。
  2. 一部の行変数を整数として宣言し、その他を long として宣言します。オーバーフロー エラーを避けるために、常に long を使用してください。
  3. lastRowToPasteより 1000 大きい値に設定しますLastRow。1000 の意味は何ですか?
  4. NextRow最初の文字をLastRow大文字にします。他のすべての変数の最初の文字は小文字です。一貫した命名規則を使用する必要があります。
  5. の目的はNextRow何ですか? その値を設定した後は、決して使用しません。
  6. それ自体が初期化されていない変数であるrowToPasteequal を設定します。lastCheckedRowIt's default value is 0, so rowToPasteis 0. you の最初の反復ではDo...Loop、rowToPaste を 1 ずつインクリメントするため、最初は 1 に等しくなり、これがエラーの原因です。

それを乗り越えるには、コードに次の変更を加えます。

変化する

rowToPaste = lastCheckedRow

これに:

rowToPaste = 2

そして、ループの最初ではなく最後に rowToPaste をインクリメントします。

    ...
    End If
    rowToPaste = rowToPaste + 1
Loop While (rowToPaste < lastRowToPaste)
于 2013-07-11T19:28:03.840 に答える