【VBA】エラー対策

絞り込み結果が0件の場合

オートフィルタで絞り込んだ後にコピーすると 隠れている全データがコピーされてしまう。

対象データを削除するマクロだと全データが削除される

Endセルを調べる

絞り込み後のEndセルがヘッダー行だったら絞り込み結果が0件ということになる。 メッセージを表示して、Exit ForやExit Subで抜ける。

Dim n As Long
n = Cells(Rows.Count, 2).End(xlUp).Row '最終行を調べる

If n = ヘッダー行 Then 'もし最終行がヘッダー行だったら
MsgBox "絞り込み結果0件でした。"
絞り込み結果が無かった時の処理
Else
絞り込み結果があった時の処理
End If

その他の方法

▼その他の方法は以下のサイト参考

【VBA】オートフィルタ 抽出されたデータがあるかどうか

Findメソッドによる日付検索

シリアル値と文字列で異なる

シリアル値同士、文字列同士でないと検索で一致しない。

  • シリアル値:2021/7/1
  • 文字列:”2021/7/1″

▼参考Webサイト

日付を検索する

範囲コピー

エラーになる範囲コピー

Copyメソッドは先にコピー元のシートをアクティブにしておかないとエラーになる

'コピー元がアクティブではない状態で
Sheets("A").Range("A1:A5").Copy
Sheets("B").Range("A1").PasteSpecial xlPasteValues

↓ アクティブにしてからコピーすればOK

Sheets("A").Activate 'コピー元シートをアクティブにする
Sheets("A").Range("A1:A5").Copy
Sheets("B").Range("A1").PasteSpecial xlPasteValues

エラーにならない範囲コピー

Range指定の範囲コピーはコピー元シートがアクティブでなくても問題ない。

'コピー元とコピー先で同じ範囲を指定する必要がある
'.Valueは省略できない
Sheets("B").Range("A1:C5").Value = Sheets("A").Range("A1:C5").Value

同じはずですが、Cellsで指定した範囲はコピー元がアクティブでないとエラーになる。

'「シートA」がアクティブではない状態だとエラーになる
'Cellsにシート指定が入っていないことが原因でした
Sheets("B").Range(Cells(2, 2), Cells(6, 3)).Value = Sheets("A").Range(Cells(2, 2), Cells(6, 3)).Value

※↑これはCellsの前にシート指定が抜けているためのエラーでした。

OffsetとResizeならエラーにならない

'Resizeでの範囲指定
Sheets("B").Range("B2").Resize(5, 2).Value _
= Sheets("A").Range("B2").Resize(5, 2).Value

'OffsetとResizeでの範囲指定
Sheets("B").Range("C2").Offset(0, -1).Resize(5, 2).Value _
= Sheets("A").Range("C2").Offset(0, -1).Resize(5, 2).Value

FindCellやTargetで「メソッドまたはデータメンバーが見つかりません。」

Targetセルに貼り付ける場合、下記はエラーになる

ws2.Range(Cells(MinRow, i), Cells(MaxRow, i)).Copy
ws1.Target.Offset(1, 0).PasteSpecial Paste:=xlPasteValues

Targetの前のws1.が不要 Targetオブジェクト内にシートの情報もあるため

ws2.Range(Cells(MinRow, i), Cells(MaxRow, i)).Copy
Target.Offset(1, 0).PasteSpecial Paste:=xlPasteValues

これでOK

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA