Excel VBAで学ぶワークシート操作の基本
音声
目次
シートの追加・削除・コピー
今回できるようになることとして、シートの追加・削除・コピーをVBAで安全に扱えるようになります。新しいシートを追加するにはWorksheets.Addを使い、既存シートのコピーはWorksheet.Copy、削除はWorksheet.Deleteを使います。削除時はダイアログが出るためApplication.DisplayAlerts = Falseで抑えるのが一般的です。複数操作をまとめるときはエラー処理と元に戻す方法(UndoはVBAで限定的です)を考慮します。
最小マクロ:
Sub BasicSheetOps()
' シート追加
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
sh.Name = "新シート_" & Format(Now, "hhmmss")
' シートコピー(先頭に複製)
ThisWorkbook.Worksheets(1).Copy Before:=ThisWorkbook.Worksheets(1)
' シート削除(警告OFF)
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets("古いシート").Delete
On Error GoTo 0
Application.DisplayAlerts = True
End Sub
貼り付け場所は標準モジュールに貼り付けます。ThisWorkbookやシートモジュールではなく標準モジュールが使いやすいです。
実行方法は、VBE(Alt+F11)で該当モジュールを開き、カーソルを置いてF5で実行するか、ボタンに割り当てます。
確認方法は、シート一覧に新しいシート名が追加され、コピー元の複製ができていること、削除対象がいなくなっていることを目視で確認します。
シート名の取得と変更
シート名はWorksheet.Nameで取得・設定できます。名前を変更するときは既存のシート名と重複するとエラーになるため、事前に同名がないか確認すると安全です。
また、無効な文字(: \ / ? * [ ])が含まれているとエラーになるため、置換または除去を行います。インデックスで参照すると位置の変更に影響されるため、可能なら名前で扱うほうが意図が明確になります。ユーザー入力を保存する場合は前後の空白をトリムし、長さ制限も要チェックです。
よくあるミスとして、シート名に使用できない文字を含めたまま設定しようとしてエラーになることが多いです。避けたい例を回避するには、Replace関数で禁止文字を除去するか、事前の存在チェックとしてIf WorksheetExists Then ...のような処理を実装します。
シートの表示・非表示・保護
Visible プロパティで表示(xlSheetVisible)、非表示(xlSheetHidden)、超非表示(xlSheetVeryHidden)を切り替えます。
xlSheetVeryHidden は VBE からのみ復元できるため、ユーザーから隠したい設定に向きます。
保護は Worksheet.Protect メソッドでパスワードや編集可否を指定できます。
保護解除は Unprotect を使います。
自動化では一時的にシート保護を外して編集後に再度保護するフローがよく使われます。
ユーザーの権限を想定して、不要に広い編集権限を与えない設計が望ましいです。
複数シート間のデータ連携
別シートへ値を渡す基本は、Worksheets("A").Range("A1").Value = Worksheets("B").Range("B1").Value です。
ループで多数セルを扱う場合は、配列に読み込んで一括で書き戻すと高速になります。
次の例は、複数シートから集計シートへ値を転記する最小形です。
Sub CollectSummary()
Dim ws As Worksheet, tgt As Worksheet
Set tgt = ThisWorkbook.Worksheets("集計")
Dim r As Long, c As Long, outRow As Long
outRow = 2
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> tgt.Name Then
tgt.Cells(outRow, 1).Value = ws.Name
tgt.Cells(outRow, 2).Value = ws.Range("A1").Value2
outRow = outRow + 1
End If
Next ws
End Sub
使い分けの基準として、固定アドレスや複数セルを一括で扱うときは Range("A1:B10") が向いています。
一方で、ループで行列を指定する場合は Cells(row, col) が扱いやすいです。
Value と Value2 の違いは主に日付と通貨の扱いで、Value2 はより速くシリアル値(数値)を返します。
日付や通貨の表示形式を気にする場合は Value を使うか、書式を別途管理します。
Worksheetsコレクションの活用
Worksheets コレクションはブック内のすべてのワークシートを扱う基本です。
For Each で回せば追加・削除があっても処理が安定しますし、Count で枚数を取得できます。
インデックス参照(Worksheets(1))は位置に依存するため、特定シートを常に扱う場合は名前指定が堅牢です。
名前で存在確認する関数を用意しておくとエラーを防げます。
コレクションを使えばシートごとの処理の共通化や設定変更の一括適用が簡単になります。
注意(ここだけ)
- マクロを保存する際はブックを「マクロ有効ブック(.xlsm)」で保存することを忘れないでください。
要約
Worksheets.Add / Copy / Delete でシートの追加・複製・削除ができ、削除時は DisplayAlerts を使って扱います。
Worksheet.Name で取得・設定し、不正文字や重複を事前チェックすると安全です。
Visible と Protect/Unprotect で表示制御と保護が可能で、VeryHidden はVBEからのみ復元できます。
複数シート間は Range/Cells と配列利用で効率化し、Value vs Value2 の違いを理解すると高速化できます。
Worksheets コレクションは枚数取得や一括処理に便利で、名前参照が位置依存より堅牢です。