<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>VBA &amp; Next: VBA Lab｜GAS・Office Script移行とVBAアプリ開発</title>
  <link>http://vbafrom20260822.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://vbafrom20260822.blog.shinobi.jp/RSS/" />
  <description>VBAによる実用アプリケーションの構築、およびGAS（Google Apps Script）やOffice Scriptへのモダンな移行パスを検証・解説するテックブログ。現場で即戦力となるコードモジュールや再利用可能な実用部品を継続的に提供します。</description>
  <lastBuildDate>Sun, 23 Aug 2026 10:22:07 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>【VBA】ブック内のシート一覧を一括取得！Sheets.Countを使ったループ処理の基本</title>
    <description>
    <![CDATA[<p>Excelブック内に存在するすべてのシート名を調べてイミディエイトウィンドウに出力する、VBAの基本サンプルです。<b>Sheets.Count</b> と <b>Forループ</b> を組み合わせて全シートを順番に走査する方法を解説します。</p>
<h3 style="color: blue;">1. サンプル</h3>
<p>ブックに含まれるすべてのシートの名称を上から順番に取得して出力します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">Sub Macro1()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim i As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 1番目のシートから最後のシート（Sheets.Count）までループ<br />
&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To Sheets.Count<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print Sheets(i).Name<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next i<br />
End Sub</div>
<h3 style="color: blue;">2. プログラムの解説</h3>
<p>コードの重要なポイントを整理します。</p>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>① Sheets.Count</b><br />
現在開いているブックに含まれるシートの総数（ワークシートやグラフシートの合計）を数値で返します。これをループの終わりに指定することで、シートが増減しても自動的に全件を処理できます。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>② Sheets(i).Name</b><br />
インデックス番号（`i` 番目）を指定してシートオブジェクトを取得し、その `.Name` プロパティでシート名（文字列）を取り出しています。</div>
<h3 style="color: blue;">3. 実行結果</h3>
<p>マクロを実行すると、イミディエイトウィンドウにシートの一覧が表示されます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">Sheet1<br />
Sheet2<br />
Sheet3</div>
<br />
<br />
]]>
    </description>
    <category>VBAサンプル</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/6/</link>
    <pubDate>Sun, 23 Aug 2026 10:22:07 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/6</guid>
  </item>
    <item>
    <title>【VBA】保守性が劇的に向上するコードリファクタリング12選！綺麗で読みやすいマクロを書くための極意</title>
    <description>
    <![CDATA[<p>VBAでコードを書いていると、動くには動くけれど「後から見直すと何をしているか分からない」「修正しにくい（スパゲッティコード）」という状態になりがちです。今回は、VBAコードを美しく、バグに強く、保守しやすい状態に生まれ変わらせるための<b>リファクタリング手法12選</b>を解説します。</p>
<h3 style="color: blue;">1. リファクタリングとは？</h3>
<p>外部からの動作（結果）を変えずに、内部のコード構造を整理して読みやすく・手直ししやすくする作業のことです。「動けばいい」から一歩進んだ、プロのエンジニアへの必須スキルです。</p>
<h3 style="color: blue;">2. 実践すべき12個のリファクタリング手法</h3>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(1) メソッドの抽出（プロシージャの分割）</b><br />
一つの巨大な `Sub` プロシージャに何百行もコードを書くのは避けましょう。「1つのプロシージャは1つの役割」を原則に、処理を細かく分割して `Call` で呼び出す構造にします。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(2) コメントは「なぜ」を記述する</b><br />
「何をやるか（例：A列に値を入れる）」「どうやるか（例：Loopで回す）」というコードを見れば分かることをコメントに書くのはNGです。「なぜこの処理が必要なのか（例：旧システムとの互換性を保つため）」という<b>意図や背景</b>を書き残しましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(3) Arrayを、Objectにする</b><br />
「配列の1番目はID、2番目が名前、3番目が年齢&hellip;」とインデックス番号で管理すると、後から項目の追加・変更があった時にバグの温床になります。自作クラスやDictionaryなどの <b>Object（オブジェクト）</b> を使って、意味のあるプロパティ名で管理しましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(4) マジックナンバーを、コンスタント（定数）に置き換える</b><br />
コード内に突然出てくる謎の数値（`If status = 3 Then` の `3` など）を「マジックナンバー」と呼びます。`Const` を使って意味の分かる定数名（`Const STATUS_COMPLETE As Long = 3`）に置き換えましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(5) 条件判定を単純にする</b><br />
何重にもネストした `If` 文（ガード clauses や早期リターン等）を見直し、複雑な条件式をシンプルに整理します。条件の複雑さはそのままバグの多さに直結します。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(6) ループをコントロールするフラグをなくす</b><br />
ループを抜けるために `isFinished = True` のようなフラグ変数を用意するのではなく、適切なタイミングで <b>Exit For / Exit Do</b> や <b>Exit Sub（return的役割）</b> を利用して、スッキリとループ制御を行いましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(7) エラーコードでの処理を、例外に置き換える</b><br />
関数が成否を「戻り値の数値（例: 0や-1）」で返す古い設計ではなく、VBAの `Err.Raise` や `On Error` といった <b>例外機構</b> を使ってエラーを明確にハンドリングします。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(8) 変数の宣言を必須にする</b><br />
VBAエディタの最上部に <b>Option Explicit</b> を必ず記述し、宣言していない変数の使用を強制的にエラーにします。タイポ（打ち間違い）によるバグを瞬時に防ぐための大前提です。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(9) 変数のスコープ（有効範囲）を最小限にする</b><br />
どこからでも値を書き換えられる `Public` 変数やモジュールレベルの変数を乱用すると、プログラムの動きが追えなくなります。変数はできるだけプロシージャ内（ローカル変数）で宣言し、スコープを最小限に抑えるのが鉄則です。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(10) ループの判定位置を「前判定」に統一する</b><br />
VBAの `Do...Loop` は前判定（`Do While...Loop`）と後判定（`Loop While`）のどちらも書けますが、混在させると「条件を満たさないのに1回実行されてしまう（後判定の罠）」などのバグに繋がりやすくなります。基本は条件を先に評価する<b>前判定に統一</b>し、コードの挙動を予測しやすくしましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(11) 読みやすくなるなら GoTo も許容する</b><br />
「`GoTo` は悪」と一概に言われがちですが、VBAにおけるエラーハンドリング（`On Error GoTo ErrorHandler`）や、多重ループを一気に抜けて安全な後片付け処理へジャンプさせるための適切な `GoTo` は、かえってコードをシンプルに読みやすくしてくれます。タブー視しすぎず、可読性が上がるなら実用的に活用しましょう。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>(12) 関数の成否を戻り値で判断せず、異常時は例外を投げる</b><br />
古いスタイルの関数で「成功したら0、失敗したら-1を返す」ような設計にすると、呼び出し側で毎回 `If ret &lt;&gt; 0 Then` のようなチェックが必要になりコードが冗長化します。異常時は `Err.Raise` で明確に例外を投げ、呼び出し側は `On Error` で受け止める設計に統一しましょう。</div>
<h3 style="color: blue;">3. まとめ</h3>
<p>リファクタリングを行うことで、コードの可読性が上がり、未来の自分や他の人がメンテナンスしやすくなります。「動くコード」から「美しいコード」へステップアップしていきましょう！<br />
<br />
<br />
<br />
<br />
<br />
</p>]]>
    </description>
    <category>VBA知識</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/5/</link>
    <pubDate>Sun, 23 Aug 2026 05:13:04 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/5</guid>
  </item>
    <item>
    <title>【VBAサンプル】ブックを開く基本とエラー処理！ファイル不在を検知して安全に終了する方法</title>
    <description>
    <![CDATA[<p>VBAで他のExcelファイルを操作するために最も頻繁に使うのが <b>Workbooks.Open</b> メソッドです。今回は、ファイルを開く基本操作に加え、ファイルが存在しない場合や破損している場合にマクロが強制終了しないよう、<b>エラー処理（On Error GoTo）</b>を組み込んだ堅牢な実装方法を解説します。</p>
<h3 style="color: blue;">1. サンプル：エラー処理付きでブックを開く</h3>
<p>指定したパスのブックを開きます。ファイルが見つからないなどの問題があれば、エラー内容をコンソールに出力して安全に終了させます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">Sub OpenWorkbookWithErrorHandling()<br />
&nbsp;&nbsp;&nbsp;&nbsp;' エラーが発生したら ErrorHandler へジャンプ<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>On Error GoTo ErrorHandler</b><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim filePath As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;filePath = "c:\tmp\temp.xlsx"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ブックを開く（Filename:= は省略可能）<br />
&nbsp;&nbsp;&nbsp;&nbsp;Workbooks.Open Filename:=filePath<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub ' エラーがなければここで終了<br />
<br />
<b>ErrorHandler:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;' エラー発生時に内容をコンソールへ出力<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>Debug.Print "エラーが発生しました: " &amp; Err.Description</b><br />
End Sub</div>
<h3 style="color: blue;">2. プログラムの解説</h3>
<p>エラーに強いコードにするためのポイントです。</p>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>① On Error GoTo ErrorHandler</b><br />
このコードにより、ブックが見つからない、パスが間違っている、ファイルが破損しているといった実行時エラーが発生した際に、プログラムをクラッシュさせることなくエラー処理ブロックへ誘導します。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>② Exit Sub の重要性</b><br />
正常に処理が完了した際、エラー処理ブロックまで実行してしまわないように、必ず `Exit Sub` を入れて処理を終了させることが重要です。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9;"><b>③ Err.Description</b><br />
「ファイルが見つかりません」などのエラーメッセージをコンソール（イミディエイトウィンドウ）に出力します。これにより、マクロがどこで止まったのか、何が原因かを即座に把握できます。</div>
<h3 style="color: blue;">3. 実行結果</h3>
<p><b>■ 正常に開けた場合：</b></p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">temp.xlsxが開きます。</div>
<br />

<p><b>■ ファイルが存在しないなどエラーの場合：</b></p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">エラーが発生しました: File not found. （※実際のシステムエラー内容が出力されます）</div>
<br />
<br />
]]>
    </description>
    <category>VBAサンプル</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/4/</link>
    <pubDate>Sat, 22 Aug 2026 13:23:24 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/4</guid>
  </item>
    <item>
    <title>【VBA】1列目の最初の空白セル（最終行の次）を取得する方法！ループ処理とEnd(xlUp)関数の使い分け</title>
    <description>
    <![CDATA[<p>Excel VBAでデータ一覧の末尾（最初の空白セル）を探して新しいデータを追加する処理は、自動化マクロの基本です。今回は、1行目1列目から上から順番に探す<b>「Forループ」を使った方法</b>と、実務でよく使われる<b>「End(xlUp)関数（プロパティ）」を使って一瞬で取得する方法</b>の2通りを解説します。</p>
<h3 style="color: blue;">1. サンプルコード（Forループ版 / End(xlUp)版）</h3>
<p>1行目1列目（A列）からセルをチェックし、最初に見つかった空白セルの行番号を出力します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;"><b>'【方法1】Forループで1行ずつ確認する従来の方法</b><br />
Sub Macro2()<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 1行目1列からセルを読んで<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 最初の空白のセルを出力する<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim ll As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Sheets("temp").Select<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;For ll = 1 To Rows.Count<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Cells(ll, 1).Value = "" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'---<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'---空白ならForループを抜ける<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'---<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next ll<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'----<br />
&nbsp;&nbsp;&nbsp;&nbsp;'---- 最初に見つかった空白行<br />
&nbsp;&nbsp;&nbsp;&nbsp;'---<br />
&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print (ll)<br />
End Sub<br />
<br />
<b>'【方法2】End(xlUp) を使って一瞬で求めるスマートな方法（推奨）</b><br />
Sub Macro2_Fast()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim ll As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' A列の最終行から上にジャンプして最後のデータ行を取得し、+1 して最初の空白行を特定する<br />
&nbsp;&nbsp;&nbsp;&nbsp;ll = Sheets("temp").Cells(Rows.Count, 1).End(xlUp).Row + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' データが1件も入力されていない（A1セルも空白）場合の考慮<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Sheets("temp").Range("A1").Value = "" Then ll = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print (ll)<br />
End Sub</div>
<h3 style="color: blue;">2. プログラムの解説</h3>
<p>それぞれの書き方の特徴とポイントです。</p>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>①【方法1】Forループによる順次チェック</b><br />
1行目から最大行数（`Rows.Count`）まで順番に `Value = ""`（空白か）を判定していきます。データ群の途中に空行が混ざっている場合、<b>「最初のすき間（空白セル）」</b>を確実に特定したい時に便利です。ただし、データ量が膨大な場合は処理に少し時間がかかります。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9;"><b>②【方法2】End(xlUp) を使った最速取得（関数ライクな記述）</b><br />
キーボードの「`Ctrl` + `&uarr;`」の動きを再現するプロパティです。<br />
ワークシートの最下端（`Rows.Count`）から上に向かってデータが存在するセルを探し、その行番号（`.Row`）に `+1` することで<b>「連続したデータの一番下にある最初の空白行」</b>を一発で取得できます。ループ処理を行わないため、超高速で動作します。</div>
<h3 style="color: blue;">3. 実行結果</h3>
<p>例えば、A1〜A5セルに値が入っていてA6セルが空白の場合：</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">6</div>
<p>どちらの方法でも、最初に見つかった空白行の行番号「6」がイミディエイトウィンドウに出力されます。</p>
<br />
<br />
]]>
    </description>
    <category>VBAサンプル</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/3/</link>
    <pubDate>Sat, 22 Aug 2026 10:28:01 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/3</guid>
  </item>
    <item>
    <title>【VBAサンプル】Format関数で現在時刻を「〇〇時〇〇分〇〇秒」形式に整形する方法</title>
    <description>
    <![CDATA[<p>VBAで現在日時を取得する `Now` 関数と、日時を好みの文字列パターンに整形する `Format` 関数を組み合わせて、現在時刻を「hh時nn分ss秒」形式で出力する方法を解説します。</p>
<h3 style="color: blue;">1. サンプル</h3>
<p>現在時刻を取得する `Now` 関数を、`Format` 関数で加工します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">Sub ShowFormattedNow()<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 現在日時を「yyyy-mm-dd hh時nn分ss秒」形式に整形して出力<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>Debug.Print Format(Now, "yyyy-mm-dd hh時nn分ss秒")</b><br />
End Sub</div>
<h3 style="color: blue;">2. プログラムの解説</h3>
<p>サンプルコードで使用されている指定方法や関数のポイントです。</p>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>① Format(値, "書式パターン")</b><br />
第一引数に指定した日時データ（`Now`）を、第二引数で指定したフォーマット文字列に従って文字列に変換する関数です。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>② 分の指定に「mm」ではなく「nn」を使う理由</b><br />
VBAの `Format` 関数では、<b>「分」に `nn` を使用するのがポイント</b>です。<br />
`mm` を指定しても文脈に応じて「分」と認識される場合がありますが、`yyyy-mm-dd` のように「月」を表す `mm` と混同して誤動作するのを防ぐため、VBAでは<b>分＝`nn`</b> と明示的に書くのが確実です。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9;"><b>③ 各書式記号の意味</b><br />
・<b>yyyy</b>：年（4桁）<br />
・<b>mm</b>：月（2桁）<br />
・<b>dd</b>：日（2桁）<br />
・<b>hh</b>：時（2桁）<br />
・<b>nn</b>：分（2桁）<br />
・<b>ss</b>：秒（2桁）</div>
<h3 style="color: blue;">3. 実行結果</h3>
<p>現在時刻が、hh時nn分ss秒形式で表示されます。（※例：2026年8月22日 10時40分08秒の場合）</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">2026-08-22 10時40分08秒</div>
<br />
<br />
]]>
    </description>
    <category>VBAサンプル</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/2/</link>
    <pubDate>Sat, 22 Aug 2026 04:22:05 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/2</guid>
  </item>
    <item>
    <title>【VBAサンプル】他のBookからデータを取得する方法！エラー処理付きで安全に外部ファイルを読み込む</title>
    <description>
    <![CDATA[<p>VBAで他のBook（外部のExcelファイル）からデータを取得するプログラムです。<br />
ファイルが存在しない場合や開けないトラブルに対応するため、<br />
<b>エラー処理（On Error GoTo）を追加して、安全にエラー内容をコンソールに出力して終了する実装</b>を解説します。<br />
<br />
</p>
<h3 style="color: blue;">1. サンプル（エラー処理付き）</h3>
<p>data.xlsxというBookの、datasheetシートの、A1の値を出力します。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f9f9f9;">Sub GetDataFromOtherBook()<br />
&nbsp;&nbsp;&nbsp;&nbsp;' エラーが発生したら ErrorHandler へジャンプ<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>On Error GoTo ErrorHandler</b><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim ex As New Excel.Application ' 処理用Excel<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim workbook As workbook ' ワークブック<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim workbookPath As String ' xlsxファイルのパス<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 開くブックを指定<br />
&nbsp;&nbsp;&nbsp;&nbsp;workbookPath = "ここには、PATHを書く\data.xlsx"<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' 読み取り専用で開く<br />
&nbsp;&nbsp;&nbsp;&nbsp;Set workbook = ex.Workbooks.Open(Filename:=workbookPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' datasheetというシートのA1のセルの値を出力<br />
&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print workbook.Sheets("datasheet").Range("A1")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ブックを閉じる<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call workbook.Close<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;' Excelアプリケーションを閉じる<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call ex.Application.Quit<br />
&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />
<br />
<b>ErrorHandler:</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;' エラーが発生した場合はコンソール（イミディエイトウィンドウ）に出力して終了<br />
&nbsp;&nbsp;&nbsp;&nbsp;<b>Debug.Print "エラーが発生しました: " &amp; Err.Description</b><br />
&nbsp;&nbsp;&nbsp;&nbsp;If Not workbook Is Nothing Then Call workbook.Close<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Not ex Is Nothing Then Call ex.Application.Quit<br />
End Sub</div>
<h3 style="color: blue;">2. プログラムの解説</h3>
<p>元のプログラムに加えたエラー処理と各コードのポイントです。</p>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>① On Error GoTo ErrorHandler</b><br />
「指定したパスにファイルが存在しない」「ファイルが開けない」「指定したシート名（datasheet）が存在しない」といったエラーが発生した際、即座にプログラムを中断せず `ErrorHandler:` の行へ処理をスキップさせます。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9; margin-bottom: 15px;"><b>② Err.Description</b><br />
VBAが保持しているエラーの説明文（例：「ファイルが見つかりません」「インデックスが有効範囲にありません」など）を取得し、`Debug.Print` でコンソール（イミディエイトウィンドウ）に出力します。</div>
<div style="font-family: sans-serif; border: 1px solid #ccc; padding: 15px; background-color: #f9f9f9;"><b>③ エラー時の後片付け処理</b><br />
エラー発生時にそのまま終了してしまうと、裏でExcelアプリ（`ex`）が開いたまま残ってしまう可能性があるため、`ErrorHandler:` 内でもブックやExcelアプリを閉じる処理（`Close` / `Quit`）を実行してから安全に終了します。</div>
<h3 style="color: blue;">3. 実行結果</h3>
<p><b>■ 正常に実行できた場合：</b></p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">A1の値が出力されます</div>
<br />

<p><b>■ ファイルが存在しない・開けない場合（エラー時）：</b></p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; background-color: #f9f9f9;">エラーが発生しました: File not found.（※発生したエラー内容が出力されます）</div>
<br />
<br />
]]>
    </description>
    <category>VBAサンプル</category>
    <link>http://vbafrom20260822.blog.shinobi.jp/Entry/1/</link>
    <pubDate>Sat, 22 Aug 2026 01:19:20 GMT</pubDate>
    <guid isPermaLink="false">vbafrom20260822.blog.shinobi.jp://entry/1</guid>
  </item>

    </channel>
</rss>