忍者ブログ
VBAによる実用アプリケーションの構築、およびGAS(Google Apps Script)やOffice Scriptへのモダンな移行パスを検証・解説するテックブログ。現場で即戦力となるコードモジュールや再利用可能な実用部品を継続的に提供します。

【VBA】ブック内のシート一覧を一括取得!Sheets.Countを使ったループ処理の基本

Excelブック内に存在するすべてのシート名を調べてイミディエイトウィンドウに出力する、VBAの基本サンプルです。Sheets.CountForループ を組み合わせて全シートを順番に走査する方法を解説します。

1. サンプル

ブックに含まれるすべてのシートの名称を上から順番に取得して出力します。

Sub Macro1()
    Dim i As Long

    ' 1番目のシートから最後のシート(Sheets.Count)までループ
    For i = 1 To Sheets.Count
        Debug.Print Sheets(i).Name
    Next i
End Sub

2. プログラムの解説

コードの重要なポイントを整理します。

① Sheets.Count
現在開いているブックに含まれるシートの総数(ワークシートやグラフシートの合計)を数値で返します。これをループの終わりに指定することで、シートが増減しても自動的に全件を処理できます。
② Sheets(i).Name
インデックス番号(`i` 番目)を指定してシートオブジェクトを取得し、その `.Name` プロパティでシート名(文字列)を取り出しています。

3. 実行結果

マクロを実行すると、イミディエイトウィンドウにシートの一覧が表示されます。

Sheet1
Sheet2
Sheet3


【VBAサンプル】ブックを開く基本とエラー処理!ファイル不在を検知して安全に終了する方法

VBAで他のExcelファイルを操作するために最も頻繁に使うのが Workbooks.Open メソッドです。今回は、ファイルを開く基本操作に加え、ファイルが存在しない場合や破損している場合にマクロが強制終了しないよう、エラー処理(On Error GoTo)を組み込んだ堅牢な実装方法を解説します。

1. サンプル:エラー処理付きでブックを開く

指定したパスのブックを開きます。ファイルが見つからないなどの問題があれば、エラー内容をコンソールに出力して安全に終了させます。

Sub OpenWorkbookWithErrorHandling()
    ' エラーが発生したら ErrorHandler へジャンプ
    On Error GoTo ErrorHandler

    Dim filePath As String
    filePath = "c:\tmp\temp.xlsx"

    ' ブックを開く(Filename:= は省略可能)
    Workbooks.Open Filename:=filePath

    Exit Sub ' エラーがなければここで終了

ErrorHandler:
    ' エラー発生時に内容をコンソールへ出力
    Debug.Print "エラーが発生しました: " & Err.Description
End Sub

2. プログラムの解説

エラーに強いコードにするためのポイントです。

① On Error GoTo ErrorHandler
このコードにより、ブックが見つからない、パスが間違っている、ファイルが破損しているといった実行時エラーが発生した際に、プログラムをクラッシュさせることなくエラー処理ブロックへ誘導します。
② Exit Sub の重要性
正常に処理が完了した際、エラー処理ブロックまで実行してしまわないように、必ず `Exit Sub` を入れて処理を終了させることが重要です。
③ Err.Description
「ファイルが見つかりません」などのエラーメッセージをコンソール(イミディエイトウィンドウ)に出力します。これにより、マクロがどこで止まったのか、何が原因かを即座に把握できます。

3. 実行結果

■ 正常に開けた場合:

temp.xlsxが開きます。

■ ファイルが存在しないなどエラーの場合:

エラーが発生しました: File not found. (※実際のシステムエラー内容が出力されます)


【VBA】1列目の最初の空白セル(最終行の次)を取得する方法!ループ処理とEnd(xlUp)関数の使い分け

Excel VBAでデータ一覧の末尾(最初の空白セル)を探して新しいデータを追加する処理は、自動化マクロの基本です。今回は、1行目1列目から上から順番に探す「Forループ」を使った方法と、実務でよく使われる「End(xlUp)関数(プロパティ)」を使って一瞬で取得する方法の2通りを解説します。

1. サンプルコード(Forループ版 / End(xlUp)版)

1行目1列目(A列)からセルをチェックし、最初に見つかった空白セルの行番号を出力します。

'【方法1】Forループで1行ずつ確認する従来の方法
Sub Macro2()
    ' 1行目1列からセルを読んで
    ' 最初の空白のセルを出力する
    Dim ll As Long

    Sheets("temp").Select

    For ll = 1 To Rows.Count
        If Cells(ll, 1).Value = "" Then
            '---
            '---空白ならForループを抜ける
            '---
            Exit For
        End If
    Next ll

    '----
    '---- 最初に見つかった空白行
    '---
    Debug.Print (ll)
End Sub

'【方法2】End(xlUp) を使って一瞬で求めるスマートな方法(推奨)
Sub Macro2_Fast()
    Dim ll As Long
    
    ' A列の最終行から上にジャンプして最後のデータ行を取得し、+1 して最初の空白行を特定する
    ll = Sheets("temp").Cells(Rows.Count, 1).End(xlUp).Row + 1
    
    ' データが1件も入力されていない(A1セルも空白)場合の考慮
    If Sheets("temp").Range("A1").Value = "" Then ll = 1
    
    Debug.Print (ll)
End Sub

2. プログラムの解説

それぞれの書き方の特徴とポイントです。

①【方法1】Forループによる順次チェック
1行目から最大行数(`Rows.Count`)まで順番に `Value = ""`(空白か)を判定していきます。データ群の途中に空行が混ざっている場合、「最初のすき間(空白セル)」を確実に特定したい時に便利です。ただし、データ量が膨大な場合は処理に少し時間がかかります。
②【方法2】End(xlUp) を使った最速取得(関数ライクな記述)
キーボードの「`Ctrl` + `↑`」の動きを再現するプロパティです。
ワークシートの最下端(`Rows.Count`)から上に向かってデータが存在するセルを探し、その行番号(`.Row`)に `+1` することで「連続したデータの一番下にある最初の空白行」を一発で取得できます。ループ処理を行わないため、超高速で動作します。

3. 実行結果

例えば、A1〜A5セルに値が入っていてA6セルが空白の場合:

6

どちらの方法でも、最初に見つかった空白行の行番号「6」がイミディエイトウィンドウに出力されます。



【VBAサンプル】Format関数で現在時刻を「〇〇時〇〇分〇〇秒」形式に整形する方法

VBAで現在日時を取得する `Now` 関数と、日時を好みの文字列パターンに整形する `Format` 関数を組み合わせて、現在時刻を「hh時nn分ss秒」形式で出力する方法を解説します。

1. サンプル

現在時刻を取得する `Now` 関数を、`Format` 関数で加工します。

Sub ShowFormattedNow()
    ' 現在日時を「yyyy-mm-dd hh時nn分ss秒」形式に整形して出力
    Debug.Print Format(Now, "yyyy-mm-dd hh時nn分ss秒")
End Sub

2. プログラムの解説

サンプルコードで使用されている指定方法や関数のポイントです。

① Format(値, "書式パターン")
第一引数に指定した日時データ(`Now`)を、第二引数で指定したフォーマット文字列に従って文字列に変換する関数です。
② 分の指定に「mm」ではなく「nn」を使う理由
VBAの `Format` 関数では、「分」に `nn` を使用するのがポイントです。
`mm` を指定しても文脈に応じて「分」と認識される場合がありますが、`yyyy-mm-dd` のように「月」を表す `mm` と混同して誤動作するのを防ぐため、VBAでは分=`nn` と明示的に書くのが確実です。
③ 各書式記号の意味
yyyy:年(4桁)
mm:月(2桁)
dd:日(2桁)
hh:時(2桁)
nn:分(2桁)
ss:秒(2桁)

3. 実行結果

現在時刻が、hh時nn分ss秒形式で表示されます。(※例:2026年8月22日 10時40分08秒の場合)

2026-08-22 10時40分08秒


【VBAサンプル】他のBookからデータを取得する方法!エラー処理付きで安全に外部ファイルを読み込む

VBAで他のBook(外部のExcelファイル)からデータを取得するプログラムです。
ファイルが存在しない場合や開けないトラブルに対応するため、
エラー処理(On Error GoTo)を追加して、安全にエラー内容をコンソールに出力して終了する実装を解説します。

1. サンプル(エラー処理付き)

data.xlsxというBookの、datasheetシートの、A1の値を出力します。

Sub GetDataFromOtherBook()
    ' エラーが発生したら ErrorHandler へジャンプ
    On Error GoTo ErrorHandler

    Dim ex As New Excel.Application ' 処理用Excel
    Dim workbook As workbook ' ワークブック
    Dim workbookPath As String ' xlsxファイルのパス
    
    ' 開くブックを指定
    workbookPath = "ここには、PATHを書く\data.xlsx"
    
    ' 読み取り専用で開く
    Set workbook = ex.Workbooks.Open(Filename:=workbookPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True)
    
    ' datasheetというシートのA1のセルの値を出力
    Debug.Print workbook.Sheets("datasheet").Range("A1")
    
    ' ブックを閉じる
    Call workbook.Close
    
    ' Excelアプリケーションを閉じる
    Call ex.Application.Quit
    Exit Sub

ErrorHandler:
    ' エラーが発生した場合はコンソール(イミディエイトウィンドウ)に出力して終了
    Debug.Print "エラーが発生しました: " & Err.Description
    If Not workbook Is Nothing Then Call workbook.Close
    If Not ex Is Nothing Then Call ex.Application.Quit
End Sub

2. プログラムの解説

元のプログラムに加えたエラー処理と各コードのポイントです。

① On Error GoTo ErrorHandler
「指定したパスにファイルが存在しない」「ファイルが開けない」「指定したシート名(datasheet)が存在しない」といったエラーが発生した際、即座にプログラムを中断せず `ErrorHandler:` の行へ処理をスキップさせます。
② Err.Description
VBAが保持しているエラーの説明文(例:「ファイルが見つかりません」「インデックスが有効範囲にありません」など)を取得し、`Debug.Print` でコンソール(イミディエイトウィンドウ)に出力します。
③ エラー時の後片付け処理
エラー発生時にそのまま終了してしまうと、裏でExcelアプリ(`ex`)が開いたまま残ってしまう可能性があるため、`ErrorHandler:` 内でもブックやExcelアプリを閉じる処理(`Close` / `Quit`)を実行してから安全に終了します。

3. 実行結果

■ 正常に実行できた場合:

A1の値が出力されます

■ ファイルが存在しない・開けない場合(エラー時):

エラーが発生しました: File not found.(※発生したエラー内容が出力されます)