Excel AI Blog: VBA Tutorials, Formula Tips & Automation Guides

Expert guides on Excel formulas, VBA automation, data processing, and AI-powered productivity. Learn to master Excel with AI.

Excel VBA のコメント — コードのコメントアウト、アポストロフィのルール、そして決して実行されない理由

Excel VBA のコメント — コードのコメントアウト、アポストロフィのルール、そして決して実行されない理由

VBA のコメントは、コンパイラが必ず無視すると保証された唯一の行です。だからこそ、最も安全なデバッグ手段であると同時に、最も危険なドキュメント習慣にもなります。本記事では、アポストロフィと Rem の違い、隠れた Edit toolbar でブロック全体をコメントアウトする方法、コメントが行継続の中で生きられない理由、ソースコメントとセルの Comment オブジェクトの違い、そして本当に書く価値のあるコメントだけを解説します。

Henry
Excel VBA の Option Explicit — 静かなタイプミスを、大声のコンパイルエラーに変える

Excel VBA の Option Explicit — 静かなタイプミスを、大声のコンパイルエラーに変える

Option Explicit は VBA で最もレバレッジの高い 1 行です。これがなければ、打ち間違えた変数名はエラーではなく、静かにゼロを返す真新しい空の変数になってしまうからです。本記事では、それが潰す「静かなタイプミス」バグ、なぜモジュール単位なのか、Require Variable Declaration の設定がどう自動で追加してくれるのか、古いコードで Variable not defined が出たときの対処、そしてなぜ宣言は強制してもデータ型は強制しないのかを解説します。

Henry
Excel VBA の行継続 — アンダースコア、そのルール、そして文字列の罠

Excel VBA の行継続 — アンダースコア、そのルール、そして文字列の罠

VBA の行継続は、スペースに続くアンダースコアで、1 つの長い文を複数の物理行にまたがらせます。パーサーがコンパイル前にそれを消すので、変わるのはソースの読み方だけです。本記事では、アンダースコアの前の必須スペース、文字列リテラルの中で区切れない理由、コメントが継続を殺す理由、コロンが文をつないで正反対のことをする仕組み、そしてどんなときに使うべきかを解説します。

Henry
Excel VBA の Debug.Print — 出力が見えないウィンドウに送られる理由

Excel VBA の Debug.Print — 出力が見えないウィンドウに送られる理由

Debug.Print は 1 行をイミディエイトウィンドウに書き込み、マクロを止めずにそのまま走り続けます — だから MsgBox のポップアップの海で溺れる代わりに、ループが値を流していく様子を眺められる、ブロックしないやり方です。本記事では、Ctrl+G でイミディエイトウィンドウを開くまで Debug.Print が何もしていないように見える理由、約 200 行のバッファが最初の出力を黙って捨てる理由、式を表示すると本物の副作用が走りうる理由、MsgBox との違い、そしてウィンドウへの記録をやめてファイルに書き出すべき境目を解説します。

Henry
Excel VBA のイミディエイトウィンドウ — 尋ねたコードをその場で実行するコンソール

Excel VBA のイミディエイトウィンドウ — 尋ねたコードをその場で実行するコンソール

イミディエイトウィンドウは 2 つの道具が 1 つになったものです — Debug.Print の出力が届く場所であり、VBA を 1 行打ち込んでその場で実行できるライブコンソールでもあります。本記事では、? のショートカットがあらゆる式を評価する仕組み、関数の前に ? を付けるとその関数と副作用が実際に走ってしまう理由、マクロが break mode で一時停止していない限りローカル変数が空に見える理由、Sub や 1 行ループを手で呼び出す方法、そしてコンソールが役目を終えてロジックをモジュールへ移すべき境目を解説します。

Henry
Excel VBA のブレークポイント — マクロを凍結して 1 行ずつ実行する

Excel VBA のブレークポイント — マクロを凍結して 1 行ずつ実行する

ブレークポイントは、行が実行される前にその行でマクロを凍結し、あらゆる生きた値を読める break mode に入れてくれます。そこから F8 でコードを 1 行ずつ歩けます。本記事では、F9 でのブレークポイントの設定、Step Into と Step Over の違い、ブックを閉じるとブレークポイントが消える理由、Stop 文を絶対にユーザーへ出荷してはいけない理由、Debug.Assert が実行時には無視される条件付きブレークポイントになる仕組み、そしてコードに Debug.Print を撒き散らすよりステップ実行が勝つ場面を解説します。

Henry
Excel VBA の IsNumeric — 数値でないものにまで True と答える理由

Excel VBA の IsNumeric — 数値でないものにまで True と答える理由

IsNumeric は「これは数値か」を問う関数ではありません。問うのは「VBA が本気で変換しようとしたら数値にできるか」であり、VBA はかなり無理をしてでも変換します。本記事では、科学表記・16 進リテラル・桁区切り・前後に空白のある文字列、さらには末尾に符号の付いた値にまで True を返す理由、それが検証をすり抜けて不正なデータを通す仕組み、マシンをまたぐとデータを壊すほど地域設定に依存する点、そして IsNumeric を信じるのをやめて Like 演算子で形そのものを固定すべき境目を解説します。

Henry
Excel VBA の Like 演算子 — ワイルドカード照合と文字列全体の罠

Excel VBA の Like 演算子 — ワイルドカード照合と文字列全体の罠

VBA の Like 演算子が答えるのは、たった 1 つの Boolean の問いです — この文字列全体がこのワイルドカードの形に収まるか。本記事では、5 つのワイルドカード(アスタリスク・疑問符・ハッシュ、そして [list] と [!list] の形)、Like が文字列全体を検査するため部分文字列には前後にアスタリスクが要る理由、大文字小文字がモジュール全体の Option Compare スイッチで決まり呼び出しごとの上書きがない仕組み、角かっこでリテラルのアスタリスクに一致させる方法、そして Like が InStr と正規表現の両方に勝つ場面を解説します。

Henry
Excel VBA の Regex — RegExp オブジェクトと、一致が空で返る理由

Excel VBA の Regex — RegExp オブジェクトと、一致が空で返る理由

VBA の regex はキーワードではありません — 自分で作る VBScript RegExp オブジェクトであり、3 つのスイッチを設定して正しい出力に手を伸ばすまで、何の役にも立ちません。本記事では、遅延バインディングと参照設定の違い、Global が既定で False なので最初の一致しか取れない理由、Test と Replace と Execute の違い、取り出すには Match.Value ではなく SubMatches へ手を伸ばす必要、そしてドル記号の後方参照を持つ VBScript のパターンフレーバーを解説します。

Henry
Excel VBA の Filter — 配列を 1 回で絞り込む、そして AutoFilter ではない理由

Excel VBA の Filter — 配列を 1 回で絞り込む、そして AutoFilter ではない理由

VBA の Filter 関数は 1 次元の文字列配列を取り、指定した部分文字列を含む要素だけを収めた新しい小さな配列を返します。InStr の配列版であり、セルには一切触れません。本記事では AutoFilter(行を隠すワークシートのメソッド)との絶えない混同を解きほぐし、そのうえで Filter が壊れて見える 3 つの罠を解説します。値全体ではなく部分文字列に一致すること、vbTextCompare を渡すまで既定で大文字小文字を区別すること、そして一致がゼロのとき UBound が -1 になる 0 始まりの配列を返すことです。

Henry
Excel VBA の Join — 配列を文字列に戻す、Split のちょうど逆操作

Excel VBA の Join — 配列を文字列に戻す、Split のちょうど逆操作

VBA の Join 関数は 1 次元配列を 1 つの文字列に貼り合わせ直し、各要素のあいだに区切り文字を置きます。Split のちょうど逆操作であり、末尾に区切り文字が必ず残る連結ループを 1 行で治す薬です。本記事では、Join が 1 次元配列しか受け取らない理由(だから平坦化するまで Range.Value は失敗します)、区切り文字の既定がなしではなく空白である理由、各要素がどうテキストに変換されるか、そして 15 行のループを 1 つの式に置き換える Split-Filter-Join のパイプラインを解説します。

Henry
Excel VBA の Transpose — 配列を組み替え、列を 1 次元に平坦化する

Excel VBA の Transpose — 配列を組み替え、列を 1 次元に平坦化する

Application.Transpose は配列の行と列を入れ替えますが、VBA での本当の日常の仕事はもっと地味です。単一列の範囲を転置すると、Join と Filter がともに必要とする 1 次元配列に畳み込まれるのです。本記事では、その平坦化の技、なぜ素の Transpose ではなく Application.Transpose なのか、大きなデータで裏切る 65,536 要素の静かな上限、そして 255 文字を超える文字列やエラー値を含む配列で投げるエラーを解説します。組み替えがどこで止まり、本物のループがどこから始まるかが、正確に分かるように。

Henry
Excel VBA のピボットテーブル — 作成・更新と、古い数値が表示される理由

Excel VBA のピボットテーブル — 作成・更新と、古い数値が表示される理由

Excel VBA のピボットテーブルは、セルを直接読むのではなく、PivotCache — ピボットを作った瞬間に撮られた元データのスナップショット — を読みます。この 1 つの事実が、ピボットで最も多い不満を説明します。データを変えても、RefreshTable を呼ぶまでピボットは昨日の集計を表示し続けるのです。本記事では、PivotCaches.Create と CreatePivotTable による今どきの 2 段階の作成、4 つの Orientation でフィールドを配置する方法、正しい集計 Function でデータフィールドを追加する方法、更新の罠、そしてキャッシュを Table に向けてピボットが自ら伸びるようにすることで直せる元範囲の罠を解説します。

Henry
Excel VBA のテーブル(ListObject)— 行を追加し、最終行探しをやめる

Excel VBA のテーブル(ListObject)— 行を追加し、最終行探しをやめる

Excel VBA のテーブルは ListObject です。自分の見出し・データ本体・端を知っていて、書き込むと自動拡張する範囲であり、だからこそ最もありふれたマクロの雑用 — End(xlUp) で最終行を探すこと — を葬り去ります。本記事では、ListObjects.Add による範囲の変換、各部を名前で指定する方法(HeaderRowRange、DataBodyRange、ListColumns)、ListRows.Add による確実な行の追加、空のテーブルで DataBodyRange が Nothing になる罠、そして挿入に耐える構造化参照の数式の書き方を解説します。

Henry
Excel VBA のチャート — コードでチャートを作成する方法と、間違ったデータが描画される理由

Excel VBA のチャート — コードでチャートを作成する方法と、間違ったデータが描画される理由

Excel VBA のチャートはデータを持ちません。Range への参照を持ちます。各系列が自分の値を =Sheet1!$B$2:$B$13 のような数式として保存するからで、この 1 つの事実が、元データが動いた瞬間にチャートが黙って間違ったセルを描画する理由を説明します。本記事では、あらゆるチャートのマクロがつまずく 2 つの入れ物の区別(埋め込みの ChartObjects とチャートシート)、SetSourceData で一度にチャートを作ってデータを結び付ける方法、SeriesCollection.NewSeries で手作業で系列を追加する方法、再実行での重複チャートの罠、そして凍結アドレスではなくデータを追いかけるようチャートの元データを Table に結び付ける方法を解説します。

Henry
Excel VBA の名前付き範囲 — Names.Add と RefersTo、そして参照がずれる理由

Excel VBA の名前付き範囲 — Names.Add と RefersTo、そして参照がずれる理由

Excel VBA の名前付き範囲は、セルの別名ではなく、名前を使うたびに Excel が解決する保存された数式です。この 1 つの事実が、名前付き範囲で出会うすべての驚きを説明します。RefersTo に先頭の等号が必要な理由、ドル記号が名前を絶対参照にするか、それともアクティブセルとともにずれるかを決める理由、名前がブック全体か 1 枚のシートかというスコープを持つ理由、そして名前の下のセルを削除すると永久の #REF! エラーを指し続ける理由です。本記事では、Names.Add と 1 行で書ける Range.Name のショートカット、ブックスコープとワークシートスコープ、名前が指す値の読み方、そしてブックを肥大化させる壊れた名前の掃除を解説します。

Henry
Excel VBA の AutoFill — Destination の罠を避けて連続データや数式を埋める

Excel VBA の AutoFill — Destination の罠を避けて連続データや数式を埋める

Excel VBA の AutoFill は、コピーコマンドではなくパターンエンジンであり、この違いを押さえておくことが不意を突かれないための鍵です。Range.AutoFill は小さなシードを受け取り、それをより大きな Destination へと延長し、シードをただ繰り返すのではなく 1, 2, 3 や 1 年の各月といった連続データを続けます。これが目的そのものであると同時に、罠そのものでもあります。本記事では、誰もが遭遇する実行時 error 1004 を引き起こす Destination のルール、連続データになるかコピーになるかを決める FillType、参照が行ごとに調整されるように数式を列の下方向へ埋める方法、そして単純なコピーがほしいだけのときは FillDown や FillRight のほうがたいてい良い道具である理由を解説します。

Henry
Excel VBA の Clear — ClearContents と Clear と Delete、そして空文字列の罠

Excel VBA の Clear — ClearContents と Clear と Delete、そして空文字列の罠

Excel VBA でセルをクリアする操作は、単一のコマンドではなくメニューであり、間違った項目を選ぶことこそ、マクロが静かにテンプレートを壊したり、他の数式が依存するセルをずらしたりする原因です。セルは複数の層が積み重なったものです。値と数式、表示形式、フォントと塗りつぶし、罫線、入力規則、コメント — そして各クリアメソッドは、選ばれた一部の層を消し、残りは生き残ります。本記事では、ClearContents と Clear と ClearFormats の違い、セルに空文字列を設定することが空白にすることと同じではない理由、その下のすべてのアドレスを変えてしまう Clear と Delete の決定的な違い、そして使用範囲全体を 1 回の高速な呼び出しでクリアする方法を解説します。

Henry
Excel VBA のセルの値 — .Value の読み書きと Range を配列にするテクニック

Excel VBA のセルの値 — .Value の読み書きと Range を配列にするテクニック

Excel VBA でセルを読み書きする操作は、すべて Range の .Value プロパティを通ります。そして最も重要なのは、複数セルを扱ったときの挙動です。複数セルの範囲は 1 始まりの 2 次元 Variant 配列を返し、配列を代入し直すとブロック全体を 1 回の呼び出しで書き込めます。これが、一瞬で終わるマクロと、いつまでも待たされるマクロの分かれ目です。Cells(i, j).Value に 1 セルずつ触れるたびに、VBA から Excel への境界を越えるからです。本記事では、単一セルと範囲での .Value の違い、一括読み書きを速くする配列の往復、1 列でも配列が 2 次元になる理由、そして頼りすぎてはいけない既定プロパティのショートカットを解説します。

Henry
Excel VBA の数式 — .Formula と .FormulaR1C1 でコードから数式を書く

Excel VBA の数式 — .Formula と .FormulaR1C1 でコードから数式を書く

Excel VBA から数式を書くとは、Range の .Formula プロパティに文字列を代入することであり、誰もがつまずく唯一のルールは、.Formula がただ 1 つの固定された方言 — ユーザーの言語や地域設定に関係なく、US-English の関数名とカンマ区切り — を話すことです。=SUM(A1:A10) を代入すればどのマシンでも動き、Excel が表示をローカライズします。ドイツ語の =SUMME(A1;A10) を代入すると実行時 error 1004 になります。本記事では、.Formula とローカライズされた .FormulaLocal、範囲全体に相対数式を押し込む .FormulaR1C1、先頭の等号が必須である理由、数式文字列の中で引用符を二重にする方法、そして .HasFormula で数式を読み戻す方法を解説します。

Henry
Excel VBA の Value と Value2 と Text — どれがセルを正しく読むか

Excel VBA の Value と Value2 と Text — どれがセルを正しく読むか

Excel VBA のセルには複数の顔があり、間違った顔を読むのは静かなバグです。.Value2 は格納された生の数値を返し、.Value はその数値を対応する VBA の型に強制変換して返します(日付書式のセルは Date を、通貨のセルは Currency を返します)。.Text は画面に表示される書式済みの文字列を、読み取り専用で返します。計算のために .Text を読むと、$1,235 のような文字列や、列が狭ければ ### すら返ってきます。通貨セルを .Value で読むと大きな数値が丸められることがあり、.Value2 は速くて損失のない既定です。本記事では、3 つの読みの顔、Currency と Date の変換が精度を失う場面、.Text が表示専用で代入できない理由、そしてどの顔を選ぶべきかを解説します。

Henry
Excel VBA の Shell — 外部プログラムを起動する、そしてコードが待ってくれない理由

Excel VBA の Shell — 外部プログラムを起動する、そしてコードが待ってくれない理由

VBA の Shell 関数は外部プログラムを起動した瞬間に立ち去る、撃ちっぱなしの関数です。Shell が返すのはタスク ID であって、プログラムの終了コードでも出力でも成功フラグでもなく、次の行はプログラムがまだ起動している最中に走り出します。これが Shell コードの大半のバグ — コンバーターを Shell で起動し、まだ書き出されていないファイルを開こうとする — の正体です。この記事では、Shell が待たない理由、空白を含むパスを引用符で囲む方法、Shell が exe は起動できても PDF や URL を単独では開けない理由、そしてプログラムの完了を実際に待って出力を読むために Shell を捨てて WScript.Shell の Run や Exec に切り替える場面を解説します。

Henry
Excel VBA の Environ — ユーザーフォルダーをハードコードせずに Windows のパスを読む

Excel VBA の Environ — ユーザーフォルダーをハードコードせずに Windows のパスを読む

VBA の Environ 関数は、Windows がすべてのプログラムに渡す環境変数 — USERPROFILE、TEMP、USERNAME、APPDATA — を読み、C:\Users\John のようなハードコードなしでユーザー固有のパスを組み立てられるようにします。ハードコードは他のどのマシンでも壊れるからです。その最大の罠は静かです — 存在しない、あるいは綴りを間違えた変数はエラーではなく空文字列を返すので、名前のタイプミスは静かに空の値を返し、パスはドライブのルートに落ちます。この記事では、Environ が可搬パスの道具である理由、あらゆる結果を空になりうるものとして扱うべき理由、2 つの呼び出し形式(名前による指定と数値インデックスによる指定)、Excel 起動時に Environ が取るスナップショット、そして Environ にできないこと — 変数の設定や、起動後に変更された変数の読み取り — を解説します。

Henry
Excel VBA の CreateObject — 遅延バインディング、GetObject、そして Outlook が開いたままになる理由

Excel VBA の CreateObject — 遅延バインディング、GetObject、そして Outlook が開いたままになる理由

CreateObject は、Excel の外にあるあらゆるものへの VBA のマスターキーです — ProgID 文字列で任意の COM アプリケーションを起動します。Scripting.FileSystemObject、Scripting.Dictionary、Outlook.Application、WScript.Shell、Word.Application、どれでも同じです。その文字列による検索が遅延バインディングであり、コンパイラはそのオブジェクトについて何も知らないため、間違った ProgID やインストールされていないアプリは実行時に error 429 で初めて失敗します。この記事では、遅延バインディングと事前バインディングの本当の選択(可搬性か IntelliSense か)、CreateObject がつねに新しいインスタンスを起動する一方で GetObject が実行中のものにつなぐ理由、そして Quit と Set Nothing を忘れたときに、ヘッドレスな Outlook や Excel のプロセスがタスクマネージャーに取り残される理由を解説します。

Henry
Excel VBA の Now・Date・Time — 時計を読む、そして Date が「ステートメント」でもある理由

Excel VBA の Now・Date・Time — 時計を読む、そして Date が「ステートメント」でもある理由

VBA の日付は Double です — 整数部は 1899-12-30 からの日数、小数部はその日の時刻を表すので、Now・Date・Time は同じ時計を 3 通りに読んでいるにすぎません。Now は日付と時刻、Date は今日の 0 時、Time は時刻だけを返します。多くのコードを壊すのは、Now で保存した値を Date と比較して決して一致しないバグです。Now は小数の時刻を抱え、整数の Date は抱えないからです。さらに Date と Time は、コンピューターのシステム時計を書き換えるステートメントでもあります。この記事では Double の正体、等値比較が失敗する理由、Int や DateValue で時刻を落とす方法、そして Now が UTC ではなくローカル時刻である理由を解説します。

Henry
Excel VBA の DateAdd・DateDiff — 月の長さバグのない日付計算

Excel VBA の DateAdd・DateDiff — 月の長さバグのない日付計算

VBA の日付は Double なので、1 を足せば 1 日進み、素の足し算は正しく動きます — ただし日数のときだけです。ひと月を 30 日、1 年を 365 日として扱った瞬間に破綻します。月やうるう年は長さが一定ではないからです。DateAdd はカレンダーを知っているので、1 月 31 日に 1 か月足すと、ありえない 31 日ではなく 2 月 28 日を返します。DateDiff は経過時間ではなく越えた境界の数を数えるので、12 月 31 日から 1 月 1 日までは 1 日しか経っていなくても 1 年になります。DateSerial は年・月・日から地域差なく日付を組み立て、あふれた値を正規化するので、月末を求める定番のイディオムが書けます。この記事では素の足し算で足りる場面、つまずきやすいインターバルコード、そして DateDiff が境界の数え上げである理由を解説します。

Henry
Excel VBA の Weekday・DatePart — 日付の部品を取り出す、そして月曜日が 1 でない理由

Excel VBA の Weekday・DatePart — 日付の部品を取り出す、そして月曜日が 1 でない理由

Year・Month・Day・Hour・Minute・Second は、すでに中身の見えている Double から整数を 1 つずつ取り出すだけで、見た目どおり単純です。噛みついてくるのは Weekday です — 1 から 7 を返しますが、その番号付けは第 2 引数に左右され、既定では日曜日が 1 なので、素の呼び出しでは月曜日は 1 ではなく 2 になり、ハードコードした数値に頼った週末判定はどれも静かに間違います。DatePart は DateAdd と同じインターバルコードを使う汎用の取り出し役で、週番号や四半期のような専用関数のない部品にも届きます。ただし既定の週ルールは ISO 8601 ではありません。WeekdayName と MonthName はマシンの言語で名前を返すので、表示には向きますが読み戻しには向きません。この記事ではあらゆる部品の取り出し方と、月曜日が 1 でない理由を解説します。

Henry
VBA FreeFile と Open ステートメント in Excel — ファイル番号を取得し、テキストファイルを開く(ブックではなく)

VBA FreeFile と Open ステートメント in Excel — ファイル番号を取得し、テキストファイルを開く(ブックではなく)

組み込みの VBA では、テキストファイルは番号付きのチャネルを通して扱います — Open path For Output As #n と書くと、その番号 n は自分で選ぶのではなく FreeFile から受け取るべきハンドルになります。#1 をハードコードすると、2 つ目のファイルを開いた瞬間に error 55 File already open にぶつかり、すでにデータを持つファイルを For Output で開くと中身が空に切り詰められ、Close を忘れると Excel を終了するまでファイルはロックされたままになります。この記事では、FreeFile が変数で受け取るべきチャネル番号を渡す理由、For Output・For Append・For Input の違い、Open ステートメントが Workbooks.Open ではない理由、そしてチャネルを必ず閉じるクリーンアップのパターンを解説します。

Henry
VBA Print # と Write # in Excel — テキストファイルや CSV を書き出す(そして、あなたのファイルがすべて引用符で囲まれている理由)

VBA Print # と Write # in Excel — テキストファイルや CSV を書き出す(そして、あなたのファイルがすべて引用符で囲まれている理由)

Print # と Write # は、ディスク上のバイトがどう見えるべきかに正反対の答えを返します。Print # はテキストを見たとおりに書きます — 引用符もカンマもなく、レイアウトはあなたが組み立てます — だからレポートや手作りの CSV に向いています。Write # はマシン形式を書きます — すべての文字列を引用符で囲み、値の間にカンマを入れ、日付をハッシュで囲む — 人や Excel ではなく Input # に読み戻させるための形式です。この記事では、あなたの CSV が引用符だらけになる原因が Write # である理由、Print # リストの中のカンマが CSV のカンマではなくプリントゾーンを挿入する理由、For Output が切り詰める一方で For Append が追加する仕組み、小数点カンマのロケールの罠、そして組み込みの書き込みが UTF-8 ではなく ANSI である理由を解説します。

Henry
VBA Read Text File in Excel — Line Input と Input #、そして行を落とさない EOF ループ

VBA Read Text File in Excel — Line Input と Input #、そして行を落とさない EOF ループ

VBA でテキストファイルを読むには 3 つの道具があり、間違ったものを選ぶとデータが混線します。Line Input # は 1 行の生の行を文字列に読み込み、分割は自分で行うので、予測可能です。Input # は区切られたフィールドをそのまま変数に解析します — Write # が作ったファイルには速いのですが、引用符のないカンマや余計な引用符でつまずきます。Input(LOF(f), #f) はファイル全体を 1 つの文字列に一気に読み込みます。この記事では、すべての行をちょうど一度ずつ読む EOF ループ、Input # が Write # の双子で Line Input # が Print # の双子である理由、error 62 を発生させる off-by-one を避ける方法、そして CSV を手で解析するよりブックとして開くほうがよいのはいつかを解説します。

Henry
VBA MkDir in Excel — フォルダーを作る、そして入れ子のパスを作れない理由

VBA MkDir in Excel — フォルダーを作る、そして入れ子のパスを作れない理由

VBA の MkDir ステートメントはフォルダーをちょうど 1 階層だけ作り、パス全体は作りません — 親が存在しないパスに対する MkDir は error 76 を、すでに存在するフォルダーに対する MkDir は何もしない代わりに error 75 を発生させます。だから、このフォルダーを作るという日常の仕事は、実際には足りない階層をすべて、しかも欠けている場所にだけ作ることなのです。この記事では、MkDir が 1 階層しか作らない理由、FileSystemObject.CreateFolder もまた再帰しない理由、フルパスを安全に組み立てる存在ガード付きのループ、そして裸のフォルダー名がブックのフォルダーではなく CurDir の下に着地する理由を解説します。

Henry
VBA RmDir in Excel — フォルダーを削除する、ただし空のときだけ

VBA RmDir in Excel — フォルダーを削除する、ただし空のときだけ

VBA の RmDir ステートメントは、フォルダーが完全に空のときにだけそれを削除します — まだファイルやサブフォルダーを含むフォルダーに向けると error 75 を発生させます。これは、どんなファイルも容赦なく削除する Kill のちょうど鏡像です。だから、このフォルダーを削除するは、実際にはまず空にしてから取り除くことなのです。この記事では、RmDir が空でないフォルダーを拒む理由、フォルダーは削除してもファイルは決して削除しない理由、RmDir の前に Kill でフォルダーを空にする方法、そして FileSystemObject.DeleteFolder が 1 回の呼び出しでツリー全体を消し去るのはいつか — ごみ箱もなく取り消しもなく — を解説します。

Henry
VBA CurDir & ChDir in Excel — 相対パスが間違ったフォルダーに着地する理由

VBA CurDir & ChDir in Excel — 相対パスが間違ったフォルダーに着地する理由

VBA では、相対パスは CurDir、つまりカレントディレクトリに対して解決されるまで何の意味も持ちません — そして Excel では、そのディレクトリはあなたが制御できない移ろいやすい設定であって、ブックが保存されているフォルダーではありません。だから MkDir Reports や Open data.csv は実行のたびに別の場所に着地しかねません。ファイルを開くダイアログが CurDir を無言で動かすからです。この記事では、CurDir が ThisWorkbook.Path ではない理由、ChDir が ChDrive なしにドライブを変えられない理由、そして間違ったフォルダーのバグをまるごと取り除くたった一つの習慣 — すべてのパスを ThisWorkbook.Path に固定すること — を解説します。

Henry
Excel VBA でファイルをコピーする — FileCopy、FileSystemObject.CopyFile、そして開いているブックをコピーできない理由

Excel VBA でファイルをコピーする — FileCopy、FileSystemObject.CopyFile、そして開いているブックをコピーできない理由

VBA でファイルをコピーするのは 1 行ですが、どの 1 行を使うかはファイルが開いているかどうかで決まります。FileCopy は参照設定のいらない組み込みで、コピー先を無言で上書きしますが、開いているファイルはコピーできず、いちばんバックアップしたいブックに対して error 70 Permission denied を投げます。この記事は 3 つの状況に対応する 3 つのコピー道具の線引きを示します — ディスク上の閉じたファイルには FileCopy、ワイルドカードと明示的な上書きフラグには FileSystemObject.CopyFile、たった今開いているブックには SaveCopyAs。そして、コピー先がファイル名を含むフルパスでなければならない理由、対象フォルダーがあらかじめ存在していなければならない理由、そしてコピーしてから削除するとどうして移動になるのかを解説します。

Henry
Excel VBA でファイルを削除する — Kill、FileSystemObject.DeleteFile、そして取り消しができない理由

Excel VBA でファイルを削除する — Kill、FileSystemObject.DeleteFile、そして取り消しができない理由

VBA の Kill ステートメントはファイルを完全に削除します — ごみ箱なし、確認なし、取り消しなし。このたった一つの事実こそが目的そのものであり、危険そのものでもあり、ファイル削除に関するほかのあらゆるルールは、その取り返しのつかない一線を守るための工夫です。この記事では、ファイルが存在しないときや開いているときに Kill が何もしないのではなくエラーになる理由、Temp フォルダー内の *.tmp のようなワイルドカードが一致するすべてを確認なしで一度に消し去る仕組み、Kill がフォルダーを削除できず RmDir と DeleteFolder がその仕事をどう分担するのか、そして読み取り専用ファイルには Force フラグ付きの FileSystemObject.DeleteFile がより安全な選択になるのはいつかを解説します。

Henry
Excel VBA でファイルの名前を変更する — 移動もこなし、上書きを拒む Name ステートメント

Excel VBA でファイルの名前を変更する — 移動もこなし、上書きを拒む Name ステートメント

VBA の Name ステートメントはファイルの名前を変更しますが、実際にはリネーム兼移動のステートメントです — 新しいパスを別のフォルダーに向ければ、VBA はその場で名前を変えるのではなくファイルをそこへ移動します。そしてディスク上のほぼすべてのものと違い、Name は上書きを拒み、対象がすでに存在すると error 58 を発生させます。無言で上書きする FileCopy とはちょうど正反対です。この記事では、Name がリネームだけでなく移動もする理由、ドライブをまたげない理由とその場合を FileCopy と Kill あるいは FileSystemObject.MoveFile がどう処理するか、そして既存ファイルでのエラーが無人マクロを止めないようコピー先をガードしなければならない理由を解説します。

Henry
Excel VBA の Dir — フォルダー内のファイルをループする、そして噛みついてくるステートフルなイテレーター

Excel VBA の Dir — フォルダー内のファイルをループする、そして噛みついてくるステートフルなイテレーター

Dir は関数のように見えて、隠れた記憶を持つイテレーターのように振る舞います。Dir(path) は最初に一致したファイル名を返し、引数なしの Dir() が次を返し、フォルダーを使い切ると空文字列を返します。身を守るたった一つのルールは、Dir ループの途中で二度目の Dir を呼ばないこと。二度目の Dir は新しい検索を始めて最初の検索をリセットし、ファイルが飛ばされたり無限ループになったりするナンバーワンの原因になるからです。フォルダー内の全 .xlsx をループする方法、Dir がパスではなく名前だけを返す理由、サブフォルダーへ再帰できない理由、そしてファイルに触れる前に名前を配列へ集めるべきタイミングを学びましょう。

Henry
Excel VBA の FileSystemObject — CreateObject 対 参照設定、サブフォルダー、そしてなぜブックを開けないのか

Excel VBA の FileSystemObject — CreateObject 対 参照設定、サブフォルダー、そしてなぜブックを開けないのか

FileSystemObject はディスクをオブジェクトモデルに変えます。Dir の単一の隠れたカーソルの代わりに、For Each でループしてプロパティを読めるフォルダーとファイルです。身を守るたった一つの判断は、Dim fso As New FileSystemObject ではなく CreateObject(Scripting.FileSystemObject) を選ぶこと。遅延バインディングは参照設定なしでどのマシンでも動くのに対し、事前バインディング版は Microsoft Scripting Runtime のチェックが入っていない PC でコンパイルできなくなるからです。FSO が Dir に勝つ場面、SubFolders による再帰、Size と DateLastModified の読み方、そして FSO がテキストは開くのにブックを決して開かない理由を学びましょう。

Henry
Excel VBA でファイルの存在を確認する — Dir 対 FileSystemObject.FileExists(そして Dir ループの中の罠)

Excel VBA でファイルの存在を確認する — Dir 対 FileSystemObject.FileExists(そして Dir ループの中の罠)

VBA でファイルの存在を調べる正しいやり方は二つ、そして間違った反射がひとつあります。反射とは、とにかく開いてエラーを捕まえること。遅いうえに、本当の失敗を隠してしまいます。正しい答えは Dir(path)(組み込みの 1 行)と fso.FileExists(path)(状態を持たず、より明快)です。身を守るルールは、Dir チェックを Dir ループの中で使わないこと。Dir はひとつの隠れたカーソルを共有しており、存在テストがファイルの列挙を無言でリセットしてしまうからです。FileExists がより安全な既定である理由、Dir がフォルダーパスや末尾のバックスラッシュを取り違える理由、そしてチェックしてから開いてもなおエラーガードが必要な理由を学びましょう。

Henry
Excel VBA でブックを開く — Workbooks.Open、戻り値を受け取ること、そしてなぜ Workbook_Open とは別物なのか

Excel VBA でブックを開く — Workbooks.Open、戻り値を受け取ること、そしてなぜ Workbook_Open とは別物なのか

Workbooks.Open は、いま開いたブックを返す関数です。だから身を守るたった一つのルールは Set wb = Workbooks.Open(path) — その戻り値を受け取り、フォーカスが移った瞬間に変わってしまう ActiveWorkbook ではなく、つねに wb を通して操作すること。自分で呼ぶメソッド Workbooks.Open と、自動で走るイベント Workbook_Open の違い、存在しないパスを実行時エラー 1004 ではなくメッセージにするガードの掛け方、すでに開いているファイルの扱い、そして無人マクロを無言でダイアログ待ちにしてしまうパラメーターを学びましょう。

Henry
Excel VBA でブックを保存する — Save 対 SaveAs、FileFormat の罠、そしてマクロが消える理由

Excel VBA でブックを保存する — Save 対 SaveAs、FileFormat の罠、そしてマクロが消える理由

.Save は、いま持っているファイルをその場で、ダイアログなしに上書きします。.SaveAs は新しいファイルや別の形式を書き出し、そして罠は FileFormat の番号です — マクロ入りブックを xlOpenXMLWorkbook(51、xlsx 形式)として保存すると、Excel はあなたの VBA を一行残らず無言で捨てます。xlsm には xlOpenXMLWorkbookMacroEnabled(52)が必要です。Save・SaveAs・SaveCopyAs の使い分け、まっさらな新規ブックへの Save が名前を付けて保存ダイアログを出して無人マクロをハングさせる理由、DisplayAlerts が上書きプロンプトを事前承認に変えるしくみ、そして wb.Saved = True が何も書き込まずにブックを変更なしと印づける理由を学びましょう。

Henry
Excel VBA でブックを閉じる — SaveChanges、マクロをハングさせるプロンプト、そして保存せずに閉じる方法

Excel VBA でブックを閉じる — SaveChanges、マクロをハングさせるプロンプト、そして保存せずに閉じる方法

未保存の変更があるブックへの wb.Close は、モーダルの「変更を保存しますか」ダイアログを突きつけ、無人マクロではそのダイアログが永遠に待ち続けます。それにはコードで、SaveChanges 引数を使って答えます — wb.Close SaveChanges:=False は破棄し、SaveChanges:=True は先に保存し、省略するとプロンプトが出ます。引数を付けずに閉じることがスケジュールされたマクロの終わらないナンバーワンの原因である理由、閉じた瞬間にオブジェクト変数が死ぬ理由、Close が Application.Quit とどう違うか、そして最後のブックを閉じると見えない EXCEL.EXE が走り続けかねない理由を学びましょう。

Henry
Excel VBA の Application.Wait — Excel が固まる理由と、代わりに Sleep を使うべきとき

Excel VBA の Application.Wait — Excel が固まる理由と、代わりに Sleep を使うべきとき

Application.Wait はストップウォッチではなく目覚まし時計です。カウントダウンする秒数ではなく、起きるべき壁時計の瞬間を渡すので、Application.Wait 5 はほとんど何もせず、正しい一行は Application.Wait Now + TimeValue("0:00:05") になります。刻めるのは秒単位だけで、待っている間は Excel を完全に固めるため、画面の再描画もステータスバーの更新もユーザーのキャンセルもできません。目覚まし時計のモデル、誰もがつまずく絶対時刻の引数、なぜ 1 秒未満の停止には Sleep が要るのか、そして Excel を生かしたままの停止はなぜ DoEvents ループになるのかを学びましょう。

Henry
Excel VBA の Sleep — Windows API 呼び出し、64 ビットの PtrSafe の罠、そして Wait と Sleep

Excel VBA の Sleep — Windows API 呼び出し、64 ビットの PtrSafe の罠、そして Wait と Sleep

Sleep は VBA のキーワードではありません。Declare 文で借りてくる Windows の kernel32 関数で、マクロをミリ秒数だけ一時停止させます。だからこそ Application.Wait には出せない 1 秒未満の精度が得られます。落とし穴は宣言そのものです。コピペされた古い Declare Sub Sleep の行は、VBA7 の条件付きコンパイルのガードの中で PtrSafe 属性を足すまで、64 ビット Excel でコンパイルエラーを投げます。借りもの API のモデル、正確な 64 ビット対応の直し方、ミリ秒が正確でない理由、そして Sleep もやはり Excel を固めるので応答的な停止は代わりに DoEvents ループになる理由を学びましょう。

Henry
Excel VBA の Timer — マクロの処理時間を測る(そしてスケジューラではない理由)

Excel VBA の Timer — マクロの処理時間を測る(そしてスケジューラではない理由)

VBA の Timer 関数は、カウントダウンタイマーではなくストップウォッチです。名前に反して、N 秒後に何かを起こすことは決してなく、コードを止めることも決してありません。ただ深夜 0 時からの経過秒数を返すだけで、それを二度読んでコードのかたまりにかかった時間を測ります。だからこそ、当て推量ではなく、ScreenUpdating = False が本当にマクロを速くしたと証明する道具になります。ストップウォッチのモデル、タイマーを探す人がたいてい本当は Application.OnTime を欲しがっている理由、負の経過時間を生む深夜 0 時またぎのバグ、そして 100 分の 1 秒という分解能を学びましょう。

Henry
Excel VBA の DoEvents — Excel の「応答なし」を止める(そしてマクロが二重に走ってしまう理由)

Excel VBA の DoEvents — Excel の「応答なし」を止める(そしてマクロが二重に走ってしまう理由)

DoEvents はマクロを一瞬だけ止め、コードが走っている間に溜まったクリック・キー入力・再描画を Excel に処理させます。これがウィンドウを灰色の「応答なし」へ落ちるのを防ぎ、機能するキャンセルボタンを可能にします。ただし Excel を生かすその同じ譲りが、マクロの途中で制御をユーザーへ返しもするので、ユーザーは同じボタンをもう一度押し、一つ目のマクロの中で二つ目のコピーを走らせてしまえます。本当の危険は性能ではなく、その再入です。DoEvents をどこに置くか、実行中フラグで再入をどう防ぐか、なぜ間引かなければならないか、そしてなぜマルチスレッドではないのかを学びましょう。

Henry
Excel VBA の StatusBar — UserForm なしでマクロの進捗を見せる(そして永遠に固まって残るメッセージ)

Excel VBA の StatusBar — UserForm なしでマクロの進捗を見せる(そして永遠に固まって残るメッセージ)

Application.StatusBar を使うと、Excel ウィンドウ下部のバーに自分のテキストを書き込めます。UserForm もちらつきもなく、実行中のマクロの進捗を見せるいちばん軽い方法です。誰もが忘れる一行がリセットです。最後に書いたテキストはマクロが終わってもそこに貼り付いたまま残ります。Application.StatusBar を False にするまで Excel はバーを取り返さないからです。しかもタイトなループの中では、Excel に描き直す間を与えないかぎり見た目が更新されません。そこで DoEvents の出番です。書いて戻すパターン、空文字列より False が良い理由、進捗パーセントの定石、そして本格的なプログレスバーが手間に見合う場面を学びましょう。

Henry
Excel VBA の DisplayAlerts — 無人マクロの確認ダイアログを止める(そして危険な操作ほど勝手に承認してしまう理由)

Excel VBA の DisplayAlerts — 無人マクロの確認ダイアログを止める(そして危険な操作ほど勝手に承認してしまう理由)

Application.DisplayAlerts を False にすると、マクロの実行中は Excel の確認・警告ダイアログを表示しないよう伝えられます。だから無人マクロが、誰かの「OK」クリックを待って止まることがありません。ただしこれは警告を黙らせるというより、Excel の既定の応答で代わりに答えてしまうもので、シートを削除する・ファイルを上書きするといったプロンプトでは既定が「実行する」です。マクロが終われば勝手に True へ戻るので、本当の罠は切りっぱなしにすることではなく、あなたを守っていた警告を抑止してしまうことです。効く場面、窓を狭くするルール、エラー処理とは別物である理由、そして ScreenUpdating や Calculation との組み合わせ方を学びましょう。

Henry
Excel VBA の ScreenUpdating — ちらつきを止めてマクロを速くする(そして遅いマクロは直せない理由)

Excel VBA の ScreenUpdating — ちらつきを止めてマクロを速くする(そして遅いマクロは直せない理由)

Application.ScreenUpdating を False にすると、マクロの実行中は画面の再描画を止め、最後に一度だけ描き直すよう Excel へ伝えられます。これでちらつきが消え、ほどよく速くなります。ただし効くのは、コードがセルへ書き込む、選択する、スクロールするときだけで、計算が重いマクロに付けても何も得られません。肝心なルールは、クラッシュすると画面がフリーズして灰色のまま固まりうること、だから自動で戻るのを当てにせず、エラーハンドラーの中で必ず戻すことです。効く場面と効かない場面、入れ子の復元によるちらつきの罠、そして Calculation や EnableEvents と組む CleanExit パターンを学びましょう。

Henry
Excel VBA の Calculation — 計算を手動にして高速化する(そして切ったまま忘れる静かな罠)

Excel VBA の Calculation — 計算を手動にして高速化する(そして切ったまま忘れる静かな罠)

Application.Calculation を xlCalculationManual にすると、書き込みのたびに再計算するのをやめ、まとめて一度で計算するよう Excel へ伝えられます。これが数式の多いブックでの本当の高速化です。ただし VBA でもっとも危険なスイッチでもあります。失敗が静かだからです。手動のまま放置すると、数式は何の見た目の変化もなく更新を止め、合計は古いままで誰も気づきません。肝心なルールは、計算状態を保存しておくこと、後の処理が結果を必要とするときは Application.Calculate で明示的に再計算すること、そして Automatic を決め打ちせず、保存した状態をエラーハンドラーの中で復元することです。手動モードの落とし穴、ブックが開いていないときの error 1004、そして CleanExit パターンを学びましょう。

Henry
Excel VBA の EnableEvents — マクロが自分のイベントを引き起こすのを止める(そしてクラッシュがイベントを殺す理由)

Excel VBA の EnableEvents — マクロが自分のイベントを引き起こすのを止める(そしてクラッシュがイベントを殺す理由)

Application.EnableEvents を False にすると、マクロの書き込みが Worksheet_Change のようなイベントハンドラーを引き起こさなくなります。これは、ハンドラーがセルを編集して自分自身を再発火させる無限ループを断ち切るスイッチです。速度ではなく、正しさのためのスイッチです。肝心なルールは、EnableEvents がアプリケーション全体のプロパティで、自動では戻らないこと。False のままクラッシュすると、開いているすべてのブックのあらゆるイベントが、Excel を再起動するまで死んだままになります。ユーザーが「ボタンが動かなくなった」と言うのは、たいていこれが原因です。再帰する Worksheet_Change の直し方、CleanExit による復元、そしてこのスイッチが他の二つ以上に重要な理由を学びましょう。

Henry
Excel VBA の SpecialCells — 空白・可視セル・定数を選択する(そして 1 つも見つからないとエラーになる理由)

Excel VBA の SpecialCells — 空白・可視セル・定数を選択する(そして 1 つも見つからないとエラーになる理由)

SpecialCells は、アドレスではなく種類でセルを選ばせます。すべての空白、すべての可視行、すべての数式、すべての定数を Excel が代わりに拾います。条件を選択してジャンプ(Go To Special)のコード版です。命綱となる唯一のルールは、1 つも見つからないとき SpecialCells が error 1004 を投げることで、無防備な呼び出しは時限爆弾になります。成熟した書き方は必ず On Error Resume Next と If Not result Is Nothing を添えます。使うべきセルの種類、空白埋めと可視行コピーのパターン、そして結果が複数エリアの参照になる理由を学びましょう。

Henry
Excel VBA の Union — 離れた範囲を 1 つの参照にまとめる(そしてなぜ重複を取り除かないのか)

Excel VBA の Union — 離れた範囲を 1 つの参照にまとめる(そしてなぜ重複を取り除かないのか)

Union は、散らばった長方形を 1 つの参照に貼り合わせ、離れた複数のブロックを色づけ・消去・コピーする操作を一度で行えるようにします。複数のエリアを Ctrl を押しながらクリックすることのコード版です。誰もがつまずくルールは、Union が連結するだけで重複を取り除かないことです。重なったセルは二重に数えられるので .Count は嘘をつき、Union は集合の和ではなくバッチのリストになります。Union of Nothing エラーを避ける蓄積パターン、なぜセルごとのループではなく参照ごとに 1 回の操作なのか、そして Union が Intersect とどう違うのかを学びましょう。

Henry
Excel VBA の Intersect — 2 つの範囲が重なる場所を見つける(そして誰もが使う Worksheet_Change のガード)

Excel VBA の Intersect — 2 つの範囲が重なる場所を見つける(そして誰もが使う Worksheet_Change のガード)

Intersect は、2 つの範囲が共有するセルだけを返し、触れ合わないときは Nothing を返します — そしてその Nothing こそが肝心な点です。一番の用途は Worksheet_Change のガードで、If Not Intersect(Target, Range) Is Nothing と書けば、シート上のあらゆる編集でイベントが発火するのを止められます。命綱となるルールは、重なりがなければ Nothing が返ることで、Is Nothing の確認なしにプロパティへ触れると error 91 でクラッシュします。EnableEvents を使った完全なイベントガード、マクロを対象エリアに限定する方法、そして Intersect が Union とどう違うのかを学びましょう。

Henry
Excel VBA の Cells と Range — セルを数値で参照する(そしてなぜ Cells(1, 2) は A2 ではなく B1 なのか)

Excel VBA の Cells と Range — セルを数値で参照する(そしてなぜ Cells(1, 2) は A2 ではなく B1 なのか)

Cells は Range を数値でアドレス指定したものです。Range(A1) は列の文字・行番号の順、つまり目で読む順でセルを指し、Cells(row, column) は Excel が格納する順、まず行・次に列で 1 つのセルを指します。だから Cells(1, 2) は A2 ではなく B1 になります。Cells と Range の使い分け、Range(Cells, Cells) で計算した角からブロックを組む方法、添字なしの Cells がシート全体を意味する理由、そして Cells をワークシートで修飾すべき理由を学びましょう。

Henry
Excel VBA の Resize — アンカーから範囲を作り直す(そしてなぜデルタではなく総数なのか)

Excel VBA の Resize — アンカーから範囲を作り直す(そしてなぜデルタではなく総数なのか)

Resize は範囲の左上のアンカーを固定したまま、長方形を新しいサイズに描き直します。Offset のように参照を移動させず、何も選択もしません — 同じ角から始まる新しい範囲を返します。誰もがつまずくルールは、Resize(rows, columns) が加える差分ではなく、最終サイズを表す 1 始まりの絶対的な総数だということです。だから Range(A1).Resize(5, 3) は A1:C5 になり、Resize(0) は error 1004 を投げます。引数を省いて片方の次元をそのままにする方法、アンカーが常に左上である理由、そして見返りの大きい 2 つのパターン — Offset と Resize で見出しを落とす、そして配列を収まるブロックへ書き戻す — を学びましょう。

Henry
Excel VBA の CurrentRegion — データブロック全体を 1 行で取得する(そして空白行がそれに何をするのか)

Excel VBA の CurrentRegion — データブロック全体を 1 行で取得する(そして空白行がそれに何をするのか)

CurrentRegion は、あるセルを囲む連続したセルのブロックです。Excel はそのセルから外へ広がり、完全に空白の行と完全に空白の列にぶつかるまで拡張して、その途切れない島を囲む最小の長方形を返します — ちょうど Ctrl+Shift+アスタリスク で選択されるものです。端は自分で計算しません。Excel が見つけます。罠は、たった 1 本の完全に空白の行や列が壁となってブロックを静かに分断することで、エラーもなくデータの半分だけが返ってきます。CurrentRegion が見出しを含む理由と Offset・Resize で落とす方法、UsedRange や End(xlUp) との違い、そしていつ本物のテーブルを使うべきかを学びましょう。

Henry
Excel VBA の罫線 — コードでセルの罫線を引く(そしてブロック全体が枠で囲まれてしまう理由)

Excel VBA の罫線 — コードでセルの罫線を引く(そしてブロック全体が枠で囲まれてしまう理由)

Excel VBA における罫線は、セルのスイッチではなく、辺のプロパティです。範囲にはアドレス指定できる罫線が 8 本あり — 4 つの外周の辺、2 組の内側のグリッド線、そして 2 本の対角線 — 素の Range.Borders コレクションはその全部を一度に指します。だから Range.Borders.LineStyle = xlContinuous は 1 本の外枠を引く代わりに、すべてのセルを囲んでしまいます。外枠だけが欲しいときに BorderAround を使う場面、LineStyle・Weight・Color の組み合わせ方、xlEdgeBottom で 1 辺だけを設定する方法、そして xlLineStyleNone で罫線を消す方法を学びましょう。

Henry
Excel VBA のセルの結合 — コードで結合・解除する(そして、たいていやめておくべき理由)

Excel VBA のセルの結合 — コードで結合・解除する(そして、たいていやめておくべき理由)

Excel VBA でセルを結合することは書式設定ではなく、グリッドそのものへの構造的な変更です。Range(A1:C1).Merge は 3 つのセルを 3 列にまたがる 1 つのセルに融合し、左上の値だけが残って、ほかは消去されます。だから結合セルは、並べ替え・Range の計算・列の挿入・ループを静かに壊します。Merge・UnMerge・MergeCells・MergeArea、熟練者が代わりに Center Across Selection に手を伸ばす理由、そして結合セルをコードで安全に見つけて片付ける方法を学びましょう。

Henry
Excel VBA の列幅と行の高さ — コードでサイズ変更と AutoFit(そしてつまずかせる単位)

Excel VBA の列幅と行の高さ — コードでサイズ変更と AutoFit(そしてつまずかせる単位)

Excel VBA でセルのサイズを変えることは列や行の全体に働き、2 つの寸法は異なる単位を使います — ColumnWidth は標準フォントの文字数で、RowHeight はポイントで測ります。この食い違いこそ、幅 10 と高さ 10 がまったく似ていない理由です。もう 1 つの罠は AutoFit です。これは列や行の全体でしか動かず、表示されたテキストを測るので、結合セルを静かに無視します。ColumnWidth と読み取り専用の Width の違い、RowHeight と折り返し、EntireColumn.AutoFit、そして幅をゼロにするのが列を隠す間違ったやり方である理由を学びましょう。

Henry
Excel VBA の Font — コードで色・太字・サイズを設定する(そして ColorIndex の罠)

Excel VBA の Font — コードで色・太字・サイズを設定する(そして ColorIndex の罠)

Font オブジェクトは Excel VBA におけるセルのテキスト層です — 色、太字、斜体、サイズ、フォント名、そのどれも下にある値には触れません。厄介なのは色です。設定方法は 3 通りあり、それぞれ違う数の空間を使います。Range.Font.Color は 24 ビットの RGB 値を、Range.Font.ColorIndex は 1〜56 のパレット番号を取り、この 2 つは互換ではありません。どちらを使うか、Characters でセルの一部だけを太字にしたりサイズを変えたりする方法、値に基づく色付けが条件付き書式の担当である理由、そしてフォント色を間違った数値なしで読み戻す方法を解説します。

Henry
Excel VBA のセルの色 — コードで背景の塗りを設定する(そして色がデータでない理由)

Excel VBA のセルの色 — コードで背景の塗りを設定する(そして色がデータでない理由)

Range.Interior は Excel VBA におけるセルの塗り層です — テキストの背後にあるペンキです。Interior.Color と RGB で設定し、Interior.ColorIndex を xlNone にして消します。そして白い塗りは、塗りなしと同じではないと知っておきましょう。より深い要点は、色の付いたセルは何のデータも持たないことです。SUM も SUMIF もそれを無視するので、色で分類しているなら、数式が読めない場所に情報を隠していることになります。色のプロパティ、古びるループなしで条件によってハイライトする方法、そして多くの範囲を素早く塗る方法を学びましょう。

Henry
Excel VBA の NumberFormat — 値を変えずに数値の表示を変える

Excel VBA の NumberFormat — 値を変えずに数値の表示を変える

Range.NumberFormat は Excel VBA におけるセルの表示層です。格納された数値が画面上でどう読めるかを変えるだけで、数値そのものは決して変えません。だから、5.4999 を保持するセルを 5 と表示させる書式設定は丸めではなく、合計は依然として 5.4999 を使います。見た目と値の対立が実際に牙をむくのがここです。日付とは、実のところ衣装をまとったシリアル値だからです。書式コードの言語、NumberFormat が Format 関数とどう違うか、NumberFormatLocal というロケールの罠、そして代わりに Round が必要なときを学びましょう。

Henry
Excel VBA で WorksheetFunction を使う — Excel 自身の関数をコードから呼ぶ(そして 2 通りの失敗の仕方)

Excel VBA で WorksheetFunction を使う — Excel 自身の関数をコードから呼ぶ(そして 2 通りの失敗の仕方)

Application.WorksheetFunction を使えば、SUM や VLOOKUP、COUNTIF をループで書き直す代わりに、VBA から Excel の 450 を超える組み込み関数を借りられます。落とし穴は呼び出し方が 2 通りあり、失敗の仕方が違うことです。WorksheetFunction.X は一致がないと実行時エラーを発生させ、Application.X は IsError でテストできるエラー値を返します。どちらの呼び出し方を使うか、なぜ結果を Variant で受けなければならないか、この方法で呼んではいけない関数はどれか、そして 1 セルずつループする代わりに範囲全体を渡すのはいつかを解説します。

Henry
Excel VBA で Remove Duplicates を使う — 1 行で重複を削除(そしてなぜ元に戻せないのか)

Excel VBA で Remove Duplicates を使う — 1 行で重複を削除(そしてなぜ元に戻せないのか)

Range.RemoveDuplicates はコード 1 行で Excel の重複の削除ボタンを実行しますが、ループにはない形で破壊的です。行をその場で削除し、最初の出現を残し、マクロが動いたあとは元に戻せません。誰もがつまずく引数が Columns で、その数値はシートの列文字ではなく範囲内のオフセットです。範囲オフセットの罠、Header xlYes が大事な理由、最初ではなく最後の行を残す方法、そして代わりに Advanced Filter や Dictionary に手を伸ばすのはいつかを解説します。

Henry
Excel VBA で Advanced Filter を使う — 一意な値を抽出し、新しい範囲へフィルターする(ループなしで)

Excel VBA で Advanced Filter を使う — 一意な値を抽出し、新しい範囲へフィルターする(ループなしで)

Range.AdvancedFilter は、ビューではなくデータを出力する唯一のフィルターです。一意なリストや条件に一致した行の集合を、ループなしで、何も削除せずに、1 回の呼び出しで別の場所へ引き出せます。異質に感じる部分は、その WHERE 句がセルの中に置かれること、つまり見出しがデータと正確に一致しなければならない条件範囲です。xlFilterInPlace と xlFilterCopy の違い、条件範囲の仕組み、Unique True が非破壊的に重複を除く方法、空の出力を返す見出し不一致の罠、そして AutoFilter や Remove Duplicates とどう違うかを解説します。

Henry
Excel VBA で Find を使う — セルを正しく検索する(返すのは位置ではなく Range)

Excel VBA で Find を使う — セルを正しく検索する(返すのは位置ではなく Range)

VBA の Range.Find はコードから使う Excel の Ctrl+F で、位置を表す数値ではなく Range オブジェクト(一致がなければ Nothing)を返すため多くの人がつまずきます。error 91 のクラッシュを防ぐたった 1 つのチェック、実行のたびに Find の挙動が変わる「引数を記憶する」罠、LookAt xlWhole と xlPart が完全一致と部分一致をどう決めるか、そして無限ループにせず FindNext で全一致を取得する方法を解説します。

Henry
Excel VBA で AutoFilter を使う — コードで行をフィルターする(非表示は削除ではない)

Excel VBA で AutoFilter を使う — コードで行をフィルターする(非表示は削除ではない)

VBA の AutoFilter はコードから表をフィルターしますが、隠された行は消えていません — SUM にはやはり数えられ、コピーにも付いてきて、範囲の中にそのまま残ります。定番のバグを防ぐ考え方、可視行だけに触れるにはなぜ SpecialCells xlCellTypeVisible を通す必要があるか、条件と演算子の仕組み、2 回目の実行でフィルターがオフになるトグルの罠、そして大量の行を高速に消す「フィルターしてから削除」パターンを解説します。

Henry
Excel VBA で Sort を使う — Range.Sort と Sort オブジェクト(元の並び順を取り戻す方法)

Excel VBA で Sort を使う — Range.Sort と Sort オブジェクト(元の並び順を取り戻す方法)

VBA のソートは Ctrl+Z の効かない恒久的な並べ替えなので、最初のルールは手をつける前に元の並び順を守ることです。ビューとミューテーションを分ける考え方、Header xlYes が大事な理由(さもないと見出しがデータに紛れ込む)、手軽な Range.Sort と無制限の Sort オブジェクトの違い、古いソートキーを引き継ぐ SortFields.Clear の罠、そして文字列として保存された数値が誤った順序で並ぶ理由を解説します。

Henry
Excel VBA で行を削除する — 行・空白行・条件による削除(ループは逆順で!)

Excel VBA で行を削除する — 行・空白行・条件による削除(ループは逆順で!)

VBA で行を削除するのは、値の消去ではなく構造の変更です。削除した行の下はすべて 1 行ずつ上へ詰まるため、順方向ループは行を飛ばします。直す唯一のルール(下から上へループする、または Union でまとめて削除する)、EntireRow.Delete がセルの消去とどう違うか、空白行を高速に取り除く方法、そして参照数式やデータを壊さずに条件で行を削除する方法を解説します。

Henry
Excel VBA で行・列を挿入する — グリッドを正しくずらす(ループ挿入で崩さないコツ)

Excel VBA で行・列を挿入する — グリッドを正しくずらす(ループ挿入で崩さないコツ)

挿入は削除の鏡像です。既存の行を下へ(列なら右へ)押しやって場所を空けるので、削除ループを壊すのと同じずれが挿入ループも壊します。EntireRow.Insert と Shift 引数を使った部分範囲の挿入の違い、CopyOrigin が新しい行にどの隣の書式を継承させるか、ループ内で安全に挿入する向き、そして多数の行を 1 回の呼び出しでまとめて追加する方法を解説します。

Henry
Excel VBA で列・行を非表示にする — 非表示は削除ではない(なぜ合計が変わらないのか)

Excel VBA で列・行を非表示にする — 非表示は削除ではない(なぜ合計が変わらないのか)

VBA で列を非表示にするのは、削除でもフィルターでもありません。データはそのまま残り、すべての SUM に含まれ、範囲コピーでも一緒にコピーされ、ただ表示幅がゼロになるだけです。なぜ .Hidden が EntireColumn と EntireRow に属するのか、なぜ非表示のセルも数式で数えられるのか、動かなくなったシートを救う「すべて再表示」の 1 行、そして手動で隠した行が AutoFilter で隠れた行とループ時にどう違うのかを解説します。

Henry
Excel VBA の Worksheet_BeforeDoubleClick — ダブルクリックをアクションに変える(そして編集モードを抑制する)

Excel VBA の Worksheet_BeforeDoubleClick — ダブルクリックをアクションに変える(そして編集モードを抑制する)

Worksheet_BeforeDoubleClick は、セルをダブルクリックした瞬間に — 編集モードに入る前に — Excel が発火させるイベントで、Target セルと Cancel フラグを手渡してくれます。Cancel を True にすれば編集モードを抑制し、代わりに自分のアクションを走らせられます — チェックマークを切り替える、行を完了にする、明細へドリルダウンする。Intersect で 1 列に絞る方法、Cancel を忘れるとセルが編集モードに落ちる理由、そしてコードを置くべき場所を解説します。

Henry
Excel VBA の Worksheet_BeforeRightClick — 右クリックメニューを置き換える(そして無効化がセキュリティでない理由)

Excel VBA の Worksheet_BeforeRightClick — 右クリックメニューを置き換える(そして無効化がセキュリティでない理由)

Worksheet_BeforeRightClick は、セルを右クリックした瞬間に — コンテキストメニューが現れる前に — Excel が発火させるイベントで、Target セルと Cancel フラグを手渡してくれます。Cancel を True にすれば組み込みメニューを抑制し、代わりに自分のアクションを走らせたり独自のメニューを出したりできます。Copy や Paste を潰さないよう Intersect でスコープを絞る方法、右クリックの無効化が保護ではなく UX の選択である理由、そしてコードを置くべき場所を解説します。

Henry
Excel VBA の Workbook_BeforePrint — 印刷をブロックし、ヘッダーを刻み、印刷プレビューの落とし穴

Excel VBA の Workbook_BeforePrint — 印刷をブロックし、ヘッダーを刻み、印刷プレビューの落とし穴

Workbook_BeforePrint は、ブック内の何かが印刷される前に Excel が発火させるイベントで、Cancel フラグを手渡してくれます。Cancel を True にすれば印刷はブロックされます — 印刷前に検証する、あるいは草案が出ていくのを止める。印刷プレビューでもこのイベントが発火する理由(だから重い処理はプレビューを遅くする)、シートごとではなくブック全体で一度だけ走る理由、無言の Cancel がバグである理由、そしてコードを置くべき場所を解説します。

Henry
Excel VBA の Workbook_BeforeClose — 閉じる操作を取り消し、保存を促し、コードを置くべき場所

Excel VBA の Workbook_BeforeClose — 閉じる操作を取り消し、保存を促し、コードを置くべき場所

Workbook_BeforeClose は、誰かがファイルを閉じようとした瞬間に — 何も破棄される前に — Excel が発火させるイベントで、Cancel フラグを手渡してくれます。Cancel を True にすれば、閉じる操作は取り消されます。閉じる際の後始末を走らせる方法、Saved プロパティで Excel が二重に保存を尋ねるのを止める方法、クラッシュ時には決して発火しない理由、そしてコードを置くべき場所を解説します。

Henry
Excel VBA の Workbook_BeforeSave — 保存を検証・ブロックし、SaveAsUI が本当に伝えていること

Excel VBA の Workbook_BeforeSave — 保存を検証・ブロックし、SaveAsUI が本当に伝えていること

Workbook_BeforeSave は、保存が要求された瞬間に — ディスクに何かが書き込まれる前に — Excel が発火させるイベントで、SaveAsUI と Cancel という 2 つのフラグを手渡します。必須セルが空のときに保存をブロックする方法、誰がいつ保存したかを自動で刻む方法、ハンドラーの中で Save を呼ぶと永遠にループする理由、そして SaveAsUI でファイル名を強制する方法を解説します。

Henry
Excel VBA の Worksheet_Activate と Deactivate — シートを切り替えたときにコードを走らせる(そして離脱を取り消せない理由)

Excel VBA の Worksheet_Activate と Deactivate — シートを切り替えたときにコードを走らせる(そして離脱を取り消せない理由)

Worksheet_Activate はシートがアクティブになったときに発火し、Worksheet_Deactivate はそのシートを離れる直前に発火します — シートの到着と出発のイベントです。両者を定義づける勘所は — BeforeClose や BeforeSave と違い、どちらも Cancel を渡さないので、シートの切り替えを見ることはできても、それをブロックすることはできません。表示時にリフレッシュするパターン、押し戻しの回避策、そしてシートレベルとブックレベルのハンドラーを解説します。

Henry
Excel VBA のクラスモジュール — 自分だけのオブジェクトを作る(設計図 vs インスタンス、そして As New の罠)

Excel VBA のクラスモジュール — 自分だけのオブジェクトを作る(設計図 vs インスタンス、そして As New の罠)

VBA のクラスモジュールを使うと、データと振る舞いをまとめた設計図として自分だけのオブジェクト型を定義でき、New で独立したインスタンスをいくつでも作り出せます。誰もがつまずく落とし穴は、オブジェクトが参照型であること。Set b = a は両方の名前を同じインスタンスに向け、Dim x As New は遅延インスタンス化の罠を隠します。モジュール名がそのまま型名になる仕組み、Type よりクラスが勝る場面、そして New にまつわる典型的な落とし穴の避け方を解説します。

Henry
Excel VBA の Type — 関連するフィールドを 1 つの変数にまとめる(ユーザー定義型 vs クラス)

Excel VBA の Type — 関連するフィールドを 1 つの変数にまとめる(ユーザー定義型 vs クラス)

VBA の Type は Type ... End Type で宣言するユーザー定義型で、関連する複数のフィールドを 1 つの変数にまとめます。Name、Age、Salary を 3 本の平行配列ではなく 1 つの変数として一緒に運べます。Type は値型なので、ある Type 変数を別の変数に代入するとすべてのフィールドがコピーされ、共有されるオブジェクトとは対照的です。宣言をどこに書くべきか、コピーと共有の違いがなぜ重要か、そしてクラスモジュールに切り替えるべき正確な境目を解説します。

Henry
Excel VBA の Property — Get・Let・Set(クラスのフィールドへのアクセスを制御する)

Excel VBA の Property — Get・Let・Set(クラスのフィールドへのアクセスを制御する)

Property Get・Let・Set は、クラスのフィールドをゲートに変えます。外部が読み書きするたびにあなたのコードが走る小さなプロシージャなので、入力を検証したり、値をその場で計算したり、フィールドを読み取り専用にしたりできます。誰もがつまずく区別が Let と Set です。Let は値を代入し、Set はオブジェクトを代入します。取り違えるとコンパイルエラーか実行時エラーになります。バッキングフィールドのパターン、素の Public 変数こそが正直な選択になる場面、そして読み取り専用プロパティの作り方を解説します。

Henry
Excel VBA の ActiveCell — カーソルのある唯一のセル(ActiveCell と Selection の違い、そして壊れるとき)

Excel VBA の ActiveCell — カーソルのある唯一のセル(ActiveCell と Selection の違い、そして壊れるとき)

ActiveCell は、いまカーソルがある1つのセルを指すライブなポインターです — つねにちょうど1つのセル、アクティブシート上、そして現在の Selection の内側にあります。Selection との違い、.Value と .Offset での読み書き、そして壊れる一番の理由 — ユーザーが残したシートとカーソルにそのまま従うので、ユーザーの現在地に関係しないコードには不向きだということ — を解説します。

Henry
Excel VBA の Selection — ハイライトされたものを扱う(そして、なぜつねに Range とは限らないのか)

Excel VBA の Selection — ハイライトされたものを扱う(そして、なぜつねに Range とは限らないのか)

Selection は、いまハイライトされているものを指すライブなポインターです — ふつうはセルの範囲ですが、グラフやシェイプ、あるいは何もない場合もあります。だからこそ Selection を範囲だと決めてかかるコードは、グラフが選択された瞬間にクラッシュします。選択セルのループ、.Areas による複数エリア選択の扱い、TypeName によるガード、そして Selection を完全に避けて範囲を名指しすべきときを解説します。

Henry
Excel VBA の Select と Activate — マクロ記録の .Select 癖を断ち切る

Excel VBA の Select と Activate — マクロ記録の .Select 癖を断ち切る

マクロ記録は、あなたのマウスがすることをそのまま書きます — シートを Select し、セルを Select し、Selection に作用する — それが人の働き方であって、コードのあるべき姿ではないからです。Select(1つまたは複数のセルをハイライト)と Activate(唯一のアクティブセルを設定)の本当の違い、ほぼすべての .Select が削除できる遅く脆い回り道である理由、本当に選択が必要になるまれな場面、そして記録されたコードを、修飾された範囲参照へ直接作用するようリファクタリングする方法を解説します。

Henry
Excel VBA の Workbook_Open — ファイルを開いた瞬間にマクロを自動実行する(そしてコードを置くべき場所)

Excel VBA の Workbook_Open — ファイルを開いた瞬間にマクロを自動実行する(そしてコードを置くべき場所)

Workbook_Open は、ファイルが開き終わった瞬間に Excel が発火させるイベントです — ボタン不要で、自分から走るコード。ただし発火するのは、コードが ThisWorkbook オブジェクト(標準の Module ではなく)に置かれ、かつユーザーがマクロを有効にしている場合だけ。コードをどこに置くべきか、なぜ無言で走らないのか、Workbook_Open と Auto_Open の違い、そして速く落ちにくく保つ方法を解説します。

Henry
Excel VBA の Worksheet_Change — セルが編集されたときにコードを走らせる(そして避けるべき無限ループ)

Excel VBA の Worksheet_Change — セルが編集されたときにコードを走らせる(そして避けるべき無限ループ)

Worksheet_Change は、シート上でユーザーがセルを編集するたびに Excel が発火させるイベントで、変更されたセルを Target として手渡してくれます。誰もがはまる罠 — ハンドラーがセルに書き込むと、その書き込みがまたイベントを発火させ、Excel は永遠にループします。Application.EnableEvents による解決策、Intersect で対象を絞る方法、なぜ数式の再計算を無視するのか、そしてコードを置くべき場所を解説します。

Henry
Excel VBA の Worksheet_SelectionChange — カーソルが動いたときにコードを走らせる(もたつきなしでアクティブ行をハイライト)

Excel VBA の Worksheet_SelectionChange — カーソルが動いたときにコードを走らせる(もたつきなしでアクティブ行をハイライト)

Worksheet_SelectionChange は、カーソルが動くたび — クリック、矢印キー、Enter — に Excel が発火させるイベントです。新しい選択範囲を Target として手渡すので、アクティブ行のハイライトのような、カーソルを追う小技が可能になります。ただし絶えず発火するため、重いコードはシート全体をもたつかせます。正しいアクティブ行ハイライトのパターン、なぜループしうるのか、そして羽のように軽く保つ方法を解説します。

Henry
Excel VBA の For Each — インデックスに触れずコレクションをループする(そして隠れた罠)

Excel VBA の For Each — インデックスに触れずコレクションをループする(そして隠れた罠)

For Each は「すべての要素にこれをせよ」と伝えるだけで、順序と境界の面倒は VBA が引き受けます — カウンターも、1 つずれるバグもありません。しかしその手軽さは 3 つの手強いルールを隠しています:ループ変数はオブジェクトか Variant でなければならず、配列のループは読み取り専用で、走査中のコレクションから要素を削除してはいけません。For Each が For…Next に勝る場面と、静かに裏切る場面を解説します。

Henry
Excel VBA の Collection — 順序を保ち、伸びるリスト(そしてなぜ Dictionary ではないのか)

Excel VBA の Collection — 順序を保ち、伸びるリスト(そしてなぜ Dictionary ではないのか)

VBA の Collection は、Add するたびに伸びる順序付きのリストです — ReDim も、サイズの当て推量も要りません。しかし初心者が毎回ぶつかる 4 つの鋭い角があります:0 始まりではなく 1 始まり、要素を上書きできない(Add/Remove だけ)、重複キーはエラー 457 を投げ、組み込みの Exists チェックがない。Collection が Array や Dictionary に勝る場面と、静かに代償を求める場面を解説します。

Henry
Excel VBA の With ステートメント — オブジェクトを一度だけ書く(そして成否を分ける先頭のドット)

Excel VBA の With ステートメント — オブジェクトを一度だけ書く(そして成否を分ける先頭のドット)

With ステートメントは、オブジェクトに一度だけ名前を付け、そのメンバーに先頭のドットだけで触れさせてくれます — 打つ量が減り、コードは速く、ブロックはすっきり。しかしその先頭のドットこそがすべてです:忘れると .Font は Font になり、あなたのオブジェクトではなくアクティブシートに無言でバインドされます。With が実際に最適化するもの、ドット抜けの罠、そして With が For Each とどう組むのかを解説します。

Henry
Excel VBA の Dim — 変数の宣言、Option Explicit、そしてタイプミスが生む「空の箱」

Excel VBA の Dim — 変数の宣言、Option Explicit、そしてタイプミスが生む「空の箱」

Dim は使う前に名前付きの箱を確保します。しかし変数を宣言する本当の理由は、名前を打ち間違えた瞬間に VBA が新しい空の Variant を無言で作ってしまうことにあります。Option Explicit がなぜ VBA で最も価値ある 1 行なのか、Dim a, b As Long の罠、そして Set が必要になる場面を解説します。

Henry
Excel VBA のデータ型 — String、Long、Double、Variant(値ごとに正しい箱を選ぶ)

Excel VBA のデータ型 — String、Long、Double、Variant(値ごとに正しい箱を選ぶ)

VBA のデータ型とは、変数の箱の形と大きさのこと — そしてそれを選ぶことは、実は何が壊れうるかを選ぶことです。なぜ Integer は 32,767 でオーバーフローするのか(Long を使う)、なぜ Variant はバグを隠す怠惰な既定なのか、なぜお金には Double でなく Currency が要るのか、そして型が一致しませんとオーバーフローのエラーの読み方を解説します。

Henry
Excel VBA の Const — マジックナンバーに名前を付ける(そして値がずれない理由)

Excel VBA の Const — マジックナンバーに名前を付ける(そして値がずれない理由)

VBA の定数とは、コンパイル時に値へ固定された名前 — コードじゅうに散らばったマジックナンバーの処方箋です。なぜ Const は値のずれを止めるのか、なぜ定数への代入がコンパイルエラーになるのか(それが機能なのです)、なぜ Const はコンパイル時のリテラルでなければならないのか、そしていつ Enum に手を伸ばすべきかを解説します。

Henry
Excel VBA の Offset — セルからの相対移動(Offset と Resize、そして 1 つずれる罠)

Excel VBA の Offset — セルからの相対移動(Offset と Resize、そして 1 つずれる罠)

Range.Offset は (行, 列) だけずらした新しい範囲を返します — 移動するだけでサイズは変えず、Offset(1,0) は 1 行目ではなく 1 行下を意味します。考え方の軸、見出しを飛ばす定番イディオム Offset(1).Resize(n-1)、そして VBA のメソッドが OFFSET ワークシート関数とどう違うかを解説します。

Henry
Excel VBA の UsedRange と CurrentRegion — データブロック全体を取得する(どちらを信じるべきか)

Excel VBA の UsedRange と CurrentRegion — データブロック全体を取得する(どちらを信じるべきか)

UsedRange と CurrentRegion はどちらも「ブロック全体」を取得しますが、答えている問いが違います。UsedRange は Excel がキャッシュした外接矩形で、過大に報告し縮まりません。CurrentRegion はセルの周囲でその場で計算され、空白行で止まります。どちらをいつ信じるべきかを解説します。

Henry
ExcelのAVERAGE関数 — 空白とゼロで平均が変わる理由

ExcelのAVERAGE関数 — 空白とゼロで平均が変わる理由

ExcelのAVERAGEは合計÷個数ですが、対象は見つけた数値だけ。空白と文字列は飛ばし、本物の0は数えます。だから「売上なし」を0で記録するか空白のままにするかで、同じデータの平均が静かに変わり、数式は何も警告しません。空白とゼロの罠、AVERAGEAがほぼ役に立たない理由、そして「平均の平均」が間違った問いになる場面を解説します。

Henry
Excelの加重平均 — SUMPRODUCT ÷ SUM(そして「平均の平均」が嘘をつく理由)

Excelの加重平均 — SUMPRODUCT ÷ SUM(そして「平均の平均」が嘘をつく理由)

Excelに加重平均の専用関数(WEIGHTEDAVG)はなく、正しい加重平均は =SUMPRODUCT(values, weights)/SUM(weights) です。大事なのは数式そのものではなく、それが直す誤り。規模の違うグループを要約した数字を素のAVERAGEにかけると全グループが等しい重みになり、注文3件の地域が300件の地域と同じ発言権を持ってしまいます。重みが影響力を再配分する考え方、SUM(weights)で割る理由、重みが1のときの短縮形、GPA・ポートフォリオ・混合単価の例、そして条件の付け方を解説します。

Henry
Excel GEOMEAN・TRIMMEAN・HARMEAN — 平均が嘘をつくときの平均たち

Excel GEOMEAN・TRIMMEAN・HARMEAN — 平均が嘘をつくときの平均たち

素のAVERAGEが間違った、あるいは誤解を招く答えを出す場面のための、3つの専門的な平均。GEOMEANは成長率とリターンのための正しい平均で、+50%の年と−50%の年の平均は0%になりません。TRIMMEANは平均する前に極端な高値と安値を落とします——オリンピックの採点と同じやり方です。HARMEANは速度やPERのような割合のための正しい平均です。それぞれがどの嘘を直すか、本当のCAGRを出すGEOMEAN(1+r)−1のパターン、3つの平均が常に調和≤幾何≤算術に並ぶ理由、そして#NUM!の罠を解説します。

Henry
Excel PRODUCT 関数 — 範囲まるごとを掛け合わせる(そして単なる * ではない理由)

Excel PRODUCT 関数 — 範囲まるごとを掛け合わせる(そして単なる * ではない理由)

Excel の PRODUCT 関数は範囲を 1 回の呼び出しで掛け合わせますが、* 演算子ではなくこれを選ぶ本当の理由は、文字列と空白セルの扱いにあります。PRODUCT はそれらを読み飛ばす一方、* は文字列でエラーになるか、空セル 1 つで結果を静かに 0 にしてしまいます。考え方(PRODUCT は SUM の掛け算版)、成長率を合成する =PRODUCT(1+range) のテクニック、PRODUCT と SUMPRODUCT の違い、そして * のチェーンのほうが実際に適している場面を解説します。

Henry
Excel の階乗(FACT)— n!・FACTDOUBLE・MULTINOMIAL(そして 171! のオーバーフロー)

Excel の階乗(FACT)— n!・FACTDOUBLE・MULTINOMIAL(そして 171! のオーバーフロー)

Excel の FACT 関数は階乗を計算します — =FACT(5) は 5×4×3×2×1 = 120 です — が、まず理解すべきは階乗が何を意味するかです。それは n 個の異なるものを並べる方法の数です。FACT(0) が 1 になる理由、FACT(171) が #NUM! を返す理由(Excel で計算できる最大の階乗は 170!)、FACTDOUBLE と MULTINOMIAL の違い、そして FACT があらゆる組み合わせ・順列関数の土台となる最小単位である理由を解説します。

Henry
Excel COMBIN・PERMUT — 組み合わせと順列(順番は関係する?)

Excel COMBIN・PERMUT — 組み合わせと順列(順番は関係する?)

Excel の COMBIN と PERMUT は、どちらも n 個から k 個を選ぶ方法が何通りあるかを数えます — 違いは順番が関係するかどうかです。PERMUT は順序付きの並べ方(表彰台、暗証番号)を数え、COMBIN は順序なしの選び方(宝くじ、委員会)を数え、常により小さい数になります。毎回正しい関数を選ぶ 2×2 の表(順序 × 重複 → PERMUT / PERMUTATIONA / COMBIN / COMBINA)、宝くじの確率の例 =COMBIN(49,6)、そして選び間違えてもエラーが出ず、k! 倍だけずれた数が返る理由を解説します。

Henry
Excel TIME・HOUR・MINUTE・SECOND — 時刻の裏にある小数を読み取り、組み立てる

Excel TIME・HOUR・MINUTE・SECOND — 時刻の裏にある小数を読み取り、組み立てる

Excel の時刻は、1 日(24 時間)を 1 とした小数です —— 6:00 AM は文字どおり 0.25。HOUR・MINUTE・SECOND はその小数から各パーツを読み取り、TIME は数値から小数を組み立てて深夜 0 時をまたぐと静かに折り返します。TIMEVALUE はテキストの時刻を小数に解析します。基本となる考え方、30 時間の経過時間で HOUR が 30 ではなく 6 を返す理由、TIME(25,0,0) が 1:00 AM になる仕組み、90 分の足し方、そして代わりに算術で計算すべき場面を解説します。

Henry
Excel で時刻を小数の時間に変換する —— ×24 のコツ(と労働時間の計算)

Excel で時刻を小数の時間に変換する —— ×24 のコツ(と労働時間の計算)

Excel の時刻は 1 日を 1 とした小数なので、8:15 は 8.25 ではなく 0.34375 として格納されます。小数の時間にするには 24 を掛けます —— 時間関連で最も検索される数式です。時間 × 時給が 24 倍小さく出る理由、(終了 − 開始)× 24 で労働時間が求まる仕組み、深夜 0 時をまたぐ夜勤のための MOD のコツ、無給休憩の差し引き、そして請求対象時間を 15 分単位に丸める方法を解説します。

Henry
Excel で 24 時間を超える時間を合計する —— 合計がリセットされる理由(と [h]:mm での解決)

Excel で 24 時間を超える時間を合計する —— 合計がリセットされる理由(と [h]:mm での解決)

時刻の列を合計したのに、合計が 25:30 ではなく 1:30 と出る —— SUM は正しく、書式が嘘をついています。Excel の既定の h:mm はまる 1 日を差し引いた余りしか表示しないので、24 時間で折り返します。解決策はユーザー定義書式 [h]:mm で、角かっこが Excel に折り返さず累積するよう伝えます。負の時刻が ####### になる理由、小数の合計の求め方、そして時刻書式のチートシートを解説します。

Henry
Excel SIN・COS・TAN — =SIN(30) が 0.5 にならない理由(ラジアンの落とし穴)

Excel SIN・COS・TAN — =SIN(30) が 0.5 にならない理由(ラジアンの落とし穴)

Excel の SIN・COS・TAN は角度をラジアンで測り、度ではありません。だから =SIN(30) は 0.5 ではなく -0.988 を返し、しかも Excel はエラーとして知らせてくれません。間違った三角関数の答えをすべて直すたった 1 つの考え方(度は RADIANS で包む)、TAN が 90° 付近でエラーにならず巨大な数に発散する理由、そしてシート全体で角度の単位を統一する方法を解説します。

Henry
Excel RADIANS・DEGREES・PI — 角度の単位変換(そして PI() が関数である理由)

Excel RADIANS・DEGREES・PI — 角度の単位変換(そして PI() が関数である理由)

RADIANS と DEGREES は、あなたが考える角度の単位(度)と Excel の三角関数が要求する単位(ラジアン)を橋渡しします。どちらの変換器をどこに置くか(SIN/COS/TAN の前に RADIANS、逆関数の後に DEGREES)、PI() がカッコを必要とし、省くと #NAME? になる理由、そして 3.14159 を決して直書きしてはいけない理由を解説します。

Henry
Excel ATAN・ATAN2 — 逆正接(アークタンジェント)と X,Y から求める角度

Excel ATAN・ATAN2 — 逆正接(アークタンジェント)と X,Y から求める角度

逆三角関数 ASIN・ACOS・ATAN・ATAN2 は比を角度に戻します — そして角度をラジアンで返すので、DEGREES で包みます。ATAN が象限を判別できない理由、ATAN2 がそれをどう解決するか、Excel の ATAN2(x, y) があらゆるプログラミング言語と引数の順序が逆になっている有名な落とし穴、そして ASIN/ACOS で -1〜1 の外を渡すと #NUM! になる理由を解説します。

Henry
ExcelのPMT関数 — ローンと住宅ローンの返済額を計算する(元金・利息の内訳も)

ExcelのPMT関数 — ローンと住宅ローンの返済額を計算する(元金・利息の内訳も)

PMT は、ローンをちょうど返し切る一定額の返済額を1つ求めます——そしてわざと負の数を返します。符号の規約(出ていくお金は負)、最大のミス(年利なのに月次の期間を渡す)、5つの引数、IPMT と PPMT が各回の返済を利息と元金に分ける仕組み、そして返済予定表の作り方を解説します。

Henry
ExcelのFV・PV関数 — 将来価値・現在価値と「5の法則」

ExcelのFV・PV関数 — 将来価値・現在価値と「5の法則」

FV と PV は、PMT と同じ貨幣の時間価値の方程式を、別の未知数について解いたものです。変数は5つ——rate、nper、pmt、pv、fv——で、未知数ごとに関数が1つ:どれか4つがわかれば5つ目が求まります。積立プランの将来価値、支払いの流れの現在価値、同じ符号の規約(入れるお金は負)、期首払い年金のための type 引数、そして RATE と NPER を使う場面を解説します。

Henry
ExcelのNPV・IRR — 割引キャッシュフローと収益率

ExcelのNPV・IRR — 割引キャッシュフローと収益率

NPV と IRR は、PMT や FV では扱えないキャッシュフロー——現実のプロジェクトの、でこぼこで不規則なもの——を扱います。最大のミス、そして本記事を読む理由のすべて:Excel の NPV は最初の値が1期先に届くと仮定するので、時点ゼロの投資は NPV の呼び出しの外に置かなければなりません。正しい NPV、IRR とそれが #NUM! を返す理由、複数 IRR の罠、そして XNPV と XIRR(実際の日付)こそアナリストが本当に使うものである理由を解説します。

Henry
ExcelのDSUM・DCOUNT関数 — 条件表に一致した行を合計・カウントする

ExcelのDSUM・DCOUNT関数 — 条件表に一致した行を合計・カウントする

DSUM と DCOUNT は「条件に一致した行を合計(またはカウント)する」に答えますが、条件は数式の中ではなくシート上の小さな表として書きます。3つの引数、database に見出し行を含めなければならない理由、条件範囲が AND と OR を表す仕組み、DCOUNT が文字列を無視する理由(文字列も数えるなら DCOUNTA)、そして目に見える条件ブロックが SUMIFS に勝る場面を解説します。

Henry
ExcelのDGET関数 — レコードを1件だけ取り出し、なければ堂々とエラーにする

ExcelのDGET関数 — レコードを1件だけ取り出し、なければ堂々とエラーにする

DGET は条件範囲を使ってテーブルから1つの値を取り出します——その真骨頂は、わざとエラーを出すこと:一致が複数あれば #NUM!、1つもなければ #VALUE!。これはバグではなく、VLOOKUP が黙って飛ばす一意性チェックが組み込まれているのです。3つの引数、補助列なしの複数条件検索、そして DGET が XLOOKUP に勝つ場面(と勝たない場面)を解説します。

Henry
Excelのデータベース関数 — DAVERAGE・DMAX・DMIN と条件範囲を使いこなす

Excelのデータベース関数 — DAVERAGE・DMAX・DMIN と条件範囲を使いこなす

12個の D関数——DSUM、DCOUNT、DGET、DAVERAGE、DMAX、DMIN ほか——はすべて、1つの構文と1つのスキル、すなわち条件範囲を共有します。条件ブロックが AND と OR を表す仕組み、1つのフィールドに範囲を掛けるとなぜ見出しが2回要るのか、数式条件の使い方(成否を分ける見出しのルール)、先頭一致の過剰マッチという罠、そして D関数・SUMIFS・FILTER の使い分けを解説します。

Henry
ExcelのGROUPBY関数 — 1つの数式でデータをグループ集計する

ExcelのGROUPBY関数 — 1つの数式でデータをグループ集計する

GROUPBY(行フィールド, 値, 関数) は行をグループ化し、1つのスピルする数式で集計します——UNIQUE + SUMIFS パターンの、そして多くのレポートではピボットテーブルそのものの、現代的な置き換えです。誰もがはまる落とし穴は、関数を名前で渡すこと(SUM() ではなく SUM)——グループごとに適用されるラムダだからです。3つの必須引数、ピボットテーブルが古びる場面でもなぜライブ再計算するのか、総計や集計値での並べ替えの付け方、そして必要なバージョンを解説します。

Henry
ExcelのPIVOTBY関数 — 数式でピボットテーブルを作る

ExcelのPIVOTBY関数 — 数式でピボットテーブルを作る

PIVOTBY(行フィールド, 列フィールド, 値, 関数) は、2つ目の次元を加えた GROUPBY です——データを行×列のグリッドにクロス集計し、更新不要でライブ再計算する1つのスピル数式として表したピボットテーブルです。4つの必須引数、行フィールドと列フィールドが入れ替え可能でない理由、両軸に合計を加える方法、そして従来のピボットテーブルとの本当のトレードオフ(生きていて参照できるが、ドラッグ操作の対話性はない)を解説します。Excel 365 が必要です。

Henry
GROUPBY・PIVOTBY 応用編 — 構成比、複数指標、カスタム集計

GROUPBY・PIVOTBY 応用編 — 構成比、複数指標、カスタム集計

GROUPBY と PIVOTBY が共有する省略可能な引数こそ、ピボットテーブルを置き換えるだけでなく上回り始める場所です:PERCENTOF で構成比を一語で、複数の値列で複数の指標を一度に、関数スロットの LAMBDA でピボットテーブルにはできない加重平均を、そして filter_array で欲しい行だけを集計。名前だけで渡す関数(イータ簡約)の文法、構成比の落とし穴、そしてどの引数が間違っているかを教えるエラー(#CALC!、#FIELD!、#SPILL!)を解説します。

Henry
ExcelのROWとCOLUMN関数 — セルの「値」ではなく「位置」を取得する

ExcelのROWとCOLUMN関数 — セルの「値」ではなく「位置」を取得する

ROW([参照]) は行番号を、COLUMN([参照]) は列番号を返します — セルの「位置」であって、中身の「値」ではありません。引数を省略すると、それぞれ数式が入っているセルの座標を返します。「セルがどこにあるか」と「セルに何が入っているか」を切り分ける考え方の軸、ROW() からアンカーを引いて作る自己修復型の連番、MOD(ROW(),n) が縞模様やグループ分けを動かす仕組み、そして COLUMN の「数値か列文字か」という落とし穴を解説します。

Henry
ExcelのROWSとCOLUMNS関数 — 範囲の「位置」ではなく「サイズ」を数える

ExcelのROWSとCOLUMNS関数 — 範囲の「位置」ではなく「サイズ」を数える

ROWS(配列) は範囲の行数を、COLUMNS(配列) は列数を返します — 位置ではなく、サイズです。ROWS(A1:A10) は 10、COLUMNS(A1:C1) は 3 です。複数形が ROW や COLUMN とどう違うか、COLUMNS() で自動調整される VLOOKUP の列インデックスという決定的な使い方、FILTER が返した行数の数え方、そして ROWS(A:A) が 1,048,576 になる「列全体」の落とし穴を解説します。

Henry
Excel HYPERLINK 関数 — 自分で更新されるクリック可能なリンクを作る

Excel HYPERLINK 関数 — 自分で更新されるクリック可能なリンクを作る

HYPERLINK(link_location, [friendly_name]) は、クリック可能なジャンプ — セル、シート、ファイル、Web ページ、メールへ — を作る数式で、その飛び先は他の数式で計算できます。静的なリンクを作る「挿入 > リンク」メニューとは別物です。ブック内をジャンプする # プレフィックス、ADDRESS と MATCH による動的な飛び先、なぜこのリンクが値を取ってくるのではなくクリックで移動するのか、そしてなぜ friendly_name を常に渡すべきかを解説します。

Henry
Excel RAND & RANDBETWEEN — 乱数を作る(そして勝手に変わるのを止める)

Excel RAND & RANDBETWEEN — 乱数を作る(そして勝手に変わるのを止める)

RAND() は 0 以上 1 未満のランダムな小数を返し、RANDBETWEEN(bottom, top) は両端を含む範囲のランダムな整数を返します。この 2 つはどちらも揮発性で、編集のたびに振り直されるという考え方、それが「乱数が勝手に変わる」ナンバーワンの落とし穴である理由、形式を選択して貼り付けで固定する方法、RANDBETWEEN が値を繰り返す理由、そしてランダムな小数を作る =a+(b-a)*RAND() の数式を解説します。

Henry
Excel RANDARRAY — 数式 1 本で乱数のグリッドまるごと

Excel RANDARRAY — 数式 1 本で乱数のグリッドまるごと

RANDARRAY([rows],[cols],[min],[max],[whole_number]) は数式 1 本で乱数のブロックをスピルします — RAND と RANDBETWEEN を統合して強化したものです。whole_number フラグの既定が FALSE である理由(だから整数を指定しない限り小数になる)、依然として揮発性である理由、いつ #SPILL! を投げるのか、そして SORTBY(list, RANDARRAY(...)) のシャッフル技を解説します。

Henry
Excel で行をランダムに選ぶ・抽出する・シャッフルする方法

Excel で行をランダムに選ぶ・抽出する・シャッフルする方法

Excel のあらゆるランダム抽出の裏にある唯一の技:各行にランダムな数を付け、その数で並べ替えるだけです。最新の 1 行 TAKE(SORTBY(data, RANDARRAY(...)), n)、古典的な RAND 補助列の方式、標本を台無しにする復元抽出と非復元抽出の決定的な違い、そして並べ替える前にランダム列を固定しなければならない理由を解説します。

Henry
Excel POWER & SQRT — べき乗・累乗根と演算子優先順位の落とし穴

Excel POWER & SQRT — べき乗・累乗根と演算子優先順位の落とし穴

POWER(x,n) と ^ 演算子は数値をべき乗し、SQRT(x) は ^(1/2) すなわち平方根の専用ショートカットです。累乗根は分数の指数にすぎないという考え方、=-3^2 が 9 を返し =27^1/3 が 9 を返す理由(どちらも優先順位の落とし穴)、負数の SQRT が #NUM! になる理由、そして POWER 一本で CAGR を求める方法を解説します。

Henry
Excel ABS & SIGN — 絶対値・大きさ、そして捨て去る符号

Excel ABS & SIGN — 絶対値・大きさ、そして捨て去る符号

ABS(x) は数値の大きさ(0 からの距離)を返し、SIGN(x) はその向きだけを -1・0・+1 で返します。あらゆる数値は大きさ × 向きだという考え方、許容差チェックに A-B ではなく ABS(A-B) が必要な理由、恒等式 x = SIGN(x)*ABS(x)、そして ABS は向きが本当にどうでもよいときのための道具であって、予期しなかった符号に貼る絆創膏ではない理由を解説します。

Henry
Excel EXP, LN & LOG — 対数・成長率、そして「既定の底」の落とし穴

Excel EXP, LN & LOG — 対数・成長率、そして「既定の底」の落とし穴

EXP(x) は e をべき乗し、LN・LOG10・LOG はその逆関数です。対数とはべき乗を逆向きに走らせたもの(指数を求める操作)だという考え方、底を省いた LOG(x) が自然対数ではなく底 10 になる理由、LN(0) と負数の LOG が #NUM! になる理由、そしてビジネスで実際に必要な 2 つの数式 — 幾何平均 = EXP(AVERAGE(LN)) と目標到達までの期間 = LN(target)/LN(rate) — を解説します。

Henry
ExcelのFORMULATEXT & ISFORMULA — セル内の数式を読み取り、監査する

ExcelのFORMULATEXT & ISFORMULA — セル内の数式を読み取り、監査する

FORMULATEXT(reference) はセルの数式をテキストとして返し、ISFORMULA(reference) はセルが数式を保持していれば TRUE を返します。考え方の軸——これらはシートを監査する関数であって、計算はしない——、数式でないセルで返る #N/A、すべての数式セルを強調表示する条件付き書式のテクニック、そして「数式の表示」の代わりにこれらを使うべき場面を解説します。

Henry
ExcelのCELL関数 — セルのアドレス・書式・種類・ファイル名を取得する

ExcelのCELL関数 — セルのアドレス・書式・種類・ファイル名を取得する

CELL(info_type, [reference]) はセルの値ではなく、そのメタデータ——アドレス、行、列、表示形式、内容の種類、ブックのファイル名——を返します。考え方の軸、なぜ info_type がキーワード文字列なのか、いまも唯一無二に得意な仕事(ファイルパスとシート名の取得)、そして結果が誤って見える再計算の罠を解説します。

Henry
ExcelのTYPE & N関数 — 値が本当は何なのかを診断する

ExcelのTYPE & N関数 — 値が本当は何なのかを診断する

TYPE(value) はセルが保持する値の種類をコードで返します——1 数値、2 テキスト、4 論理値、16 エラー、64 配列——、N(value) は値を数値に強制変換します。考え方の軸、TYPE が「文字列として保存された数値」をどう突き止めるか、なぜ N は何を渡してもエラーにせず 0 を返すのか、そして数式の中にコメントを埋め込む古典的な N() のテクニックを解説します。

Henry
ExcelのSWITCH関数 — ネストしたIFを平坦で読みやすい数式に置き換える

ExcelのSWITCH関数 — ネストしたIFを平坦で読みやすい数式に置き換える

SWITCH は1つの式を「完全一致する値のリスト」と照合し、最初に一致した結果を返します:=SWITCH(expr, val1, res1, val2, res2, default)。考え方の軸、なぜ完全一致だけなのか(そしてそれが SWITCH と IFS の境界線である理由)、default 引数を忘れると #N/A が返る罠、範囲を扱う SWITCH(TRUE()) のテクニック、そしてネストした IF の代わりに使うべき場面を解説します。

Henry
ExcelのCHOOSE関数 — 位置でN番目の項目を選ぶ(そして隠れた必殺技)

ExcelのCHOOSE関数 — 位置でN番目の項目を選ぶ(そして隠れた必殺技)

CHOOSE はリストから位置でN番目の項目を返します:=CHOOSE(index_num, value1, value2, …)。考え方の軸、なぜ一致ではなく位置で選ぶのか(CHOOSE と SWITCH の境界線)、インデックスが範囲外のときに出る #VALUE!、そして使われていない必殺技——範囲まるごとを返してシナリオを切り替えたり、左方向ルックアップのために列を並べ替えたりする使い方——を解説します。

Henry
ExcelのMAXIFS & MINIFS関数 — 配列数式なしの条件付き最大・最小

ExcelのMAXIFS & MINIFS関数 — 配列数式なしの条件付き最大・最小

MAXIFS と MINIFS は、1つ以上の条件を満たす値のうち最大・最小のものを返します:=MAXIFS(max_range, criteria_range1, criteria1, …)。考え方の軸、SUMIF ユーザーがつまずく引数の順序、なぜ古い {=MAX(IF())} 配列数式を置き換えるのか、そして一致する行がないときに返る「静かな 0」の罠を解説します。

Henry
ExcelのCOUNT・COUNTA・COUNTBLANK — 数値・非空白・空白セルを数える

ExcelのCOUNT・COUNTA・COUNTBLANK — 数値・非空白・空白セルを数える

COUNTは数値だけを、COUNTAは空でないセルすべてを、COUNTBLANKは空のセルを数えます——1つの「いくつ?」に見えて、実は3つの別々の問いに3つの関数が答えます。テキストのIDが並ぶ列に =COUNT を使うと0が返る理由、空文字列を返す数式までCOUNTAが数えてしまう理由、そしてCOUNTAとCOUNTBLANKの合計が必ずしもセル総数と一致しない理由を解説します。

Henry
ExcelのCOUNTIF関数 — 1つの条件に合うセルを数える(そして条件の書き方の罠)

ExcelのCOUNTIF関数 — 1つの条件に合うセルを数える(そして条件の書き方の罠)

COUNTIFは1つの条件を満たすセルを数えます——`=COUNTIF(範囲, 条件)`——そして条件とは、テキストで書いた小さなテストです。演算子を引用符の中に入れる理由、& でセルの値をしきい値にする方法、テキスト照合のワイルドカード、長い数値での15桁の罠、そしてCOUNTIFSへ切り替えるべきタイミングを解説します。

Henry
Excelでユニークな値を数える方法 — 今どきのやり方と昔ながらの式

Excelでユニークな値を数える方法 — 今どきのやり方と昔ながらの式

Excelには COUNTUNIQUE 関数がないため、重複を除いた値を数える方法は2つに分かれます。今どき(365/2021)の `=COUNTA(UNIQUE(範囲))` と、古いバージョン向けの昔ながらの `=SUMPRODUCT(1/COUNTIF(範囲,範囲))` です。空白が数を1増やす理由、FILTER で空白を除く方法、昔ながらの式が #DIV/0! を出す理由、そして重複を除いた値と1回だけ現れる値の違いを解説します。

Henry
Excel の TRIM と CLEAN — 照合を狂わせる「見えないゴミ」を取り除く

Excel の TRIM と CLEAN — 照合を狂わせる「見えないゴミ」を取り除く

TRIM と CLEAN はどちらも取り込んだテキストから見えないゴミを取り除きますが、対象が違います。TRIM は余分なスペース(ASCII 32)を、CLEAN は印刷されない制御文字(0〜31)を削除します。どちらも Web や PDF の貼り付けで紛れ込む改行なしスペース CHAR(160) は消せません。これが『TRIM が効かない』最大の原因です。考え方と、すべてを一括で片づける唯一の数式を解説します。

Henry
Excel の UPPER・LOWER・PROPER — データを壊さずに大文字小文字を変える

Excel の UPPER・LOWER・PROPER — データを壊さずに大文字小文字を変える

UPPER・LOWER・PROPER はテキストの大文字小文字を変えますが、Excel における大文字小文字は表示やエクスポートの問題であって、照合の問題ではありません。= 比較も VLOOKUP も、そもそも大文字小文字を区別しないからです。本当の落とし穴は PROPER です。すべての単語の先頭を大文字にするため、McDonald を Mcdonald に、iPhone を Iphone に壊してしまいます。大文字小文字が本当に効いてくる場面と、PROPER が仕上げではなく出発点にすぎない理由を解説します。

Henry
Excel の LEN 関数 — 文字数を数え、見えないゴミをあぶり出す

Excel の LEN 関数 — 文字数を数え、見えないゴミをあぶり出す

LEN はセル内の文字数を数えますが、その真価は診断にあります。末尾のスペースや印刷されない文字まで含めてすべての文字を数えるため、『Apple』に見えるセルが実は 6 文字の『Apple 』であることを LEN が証明してくれます。検証、LEN 引く LEN の出現回数カウント術、動的な抽出、そして LEN が表示形式を無視する理由を解説します。

Henry
ExcelのVLOOKUP関数 — 使い方と、それを壊す第4引数

ExcelのVLOOKUP関数 — 使い方と、それを壊す第4引数

VLOOKUP はテーブルの左端の列を上から下へ探し、そこから右へN列数えるだけ——その一方通行の設計こそ、すべてのバグの元凶です。なぜ第4引数(range_lookup)はほぼ常に FALSE でなければならないのか、なぜ VLOOKUP は左を見られないのか、なぜ列番号をベタ書きすると列を挿入した瞬間に静かに壊れるのか、そして「見つからない」を意味する #N/A の直し方を解説します。

Henry
ExcelのINDEX & MATCH — VLOOKUPに勝つ、2つの関数による検索

ExcelのINDEX & MATCH — VLOOKUPに勝つ、2つの関数による検索

INDEX と MATCH は検索を2つの仕事に分けます:MATCH が位置を見つけ(「どの行?」)、INDEX がその位置の値を返します(「そこに何がある?」)。検索と取得を切り離すことこそ、INDEX/MATCH に VLOOKUP が欠くすべてを与えます——右と同じくらい簡単に左を見て、挿入された列に耐え、真の二次元検索をこなします。パターン、match_type の罠、そしてそれでも XLOOKUP に勝つ場面を学びましょう。

Henry
ExcelのHLOOKUP & LOOKUP — 水平検索と、引退させるべきレガシー関数

ExcelのHLOOKUP & LOOKUP — 水平検索と、引退させるべきレガシー関数

HLOOKUP は VLOOKUP を90度回転させたもの——最初の行を探して下へ読みます。LOOKUP は VLOOKUP の先祖で、その致命的な欠陥は完全一致オプションがないこと:常に近似し、ソート済みデータを要求します。水平レイアウトが HLOOKUP を正解にする場面、古典的な LOOKUP(2,1/…) の技が今も古いシートに現れる理由、そしてなぜ両者がほぼ XLOOKUP に道を譲るのかを学びましょう。

Henry
ExcelのAND & OR関数 — 条件を正しく組み合わせる(そしてExcelがショートサーキットしない理由)

ExcelのAND & OR関数 — 条件を正しく組み合わせる(そしてExcelがショートサーキットしない理由)

AND と OR は判断をしません——複数の TRUE/FALSE 判定を1つの結論にまとめ、それを IF やルールやフィルターへ渡すだけです。なぜ AND は IF の第1引数の中に入れる(ネストしたIFを包むのではなく)べきなのか、素の =AND(...) がなぜ TRUE という文字を表示するだけなのか、なぜ Excel はすべての引数を評価する(ショートサーキットしないので #DIV/0! を起こしうる)のか、そして配列マスクの +/* に切り替えるのはいつかを解説します。

Henry
ExcelのNOT & XOR関数 — 条件を反転する、そして多くの人が誤解する「1つだけ例外」のロジック

ExcelのNOT & XOR関数 — 条件を反転する、そして多くの人が誤解する「1つだけ例外」のロジック

NOT は1つの TRUE/FALSE の結論を反転し、XOR は AND や OR では表せない排他的論理和です。なぜ NOT は引数をちょうど1つしか取らない(だから複合条件には NOT(AND(...)) と書く)のか、NOT が実は <> の変装にすぎないのはいつか、ド・モルガンの法則こそ NOT の真の武器である理由、そして誰も警告しない XOR の意外な点——入力が3つ以上だと「ちょうど1つ」ではなく TRUE の個数が奇数のとき TRUE を返す——を解説します。

Henry
ExcelのIS関数 — ISNUMBER・ISTEXT・ISBLANK・ISERROR・ISNA(壊れる前に数式を守る)

ExcelのIS関数 — ISNUMBER・ISTEXT・ISBLANK・ISERROR・ISNA(壊れる前に数式を守る)

IS ファミリーはセルを調べて TRUE/FALSE の結論を返します——分類はしますが、決して変換はしません。なぜ ISBLANK は「空に見える」より厳密なのか(数式の空文字列は空白ではない)、なぜ ISERROR は本物のバグを隠し ISNA や IFNA の方がたいてい安全なのか、なぜ IF(ISERROR(x),…,x) は x を二度計算するのか、そして ISNUMBER の切り札——SEARCH をきれいな部分一致テストに変える——を解説します。

Henry
Excel TEXT 関数 — 数値を書式付きの文字列に変換する(そして合計できなくなる罠)

Excel TEXT 関数 — 数値を書式付きの文字列に変換する(そして合計できなくなる罠)

TEXT 関数は、書式コードを使って数値や日付を書式付きのテキスト文字列に変換します。=TEXT(1234.5,"$#,##0.00") は "$1,234.50" を返します。基本となる考え方(書式を実際の文字列に焼き込むのか、セルの表示専用の表示形式にするのか)、最大の罠(出力はテキストなので SUM が無視する #VALUE! の遠因)、数値と日付の書式コード速習、先頭ゼロとロケール、そしてセルの表示形式・CONCAT・ROUND のほうが適している場面を解説します。

Henry
Excel VALUE と NUMBERVALUE — テキストを計算できる数値に戻す

Excel VALUE と NUMBERVALUE — テキストを計算できる数値に戻す

VALUE は数値に見えるテキスト文字列 —— "1,234.50" や "$9.00" —— を、合計・並べ替え・グラフ化できる本物の数値に解析します。TEXT の逆関数です。基本となる考え方、現実世界での最大の原因(インポートや貼り付けの後に文字列として格納された数値)、なぜ VALUE はシステムのロケールに従うのか、そしてヨーロッパ式の "1.234,56" を NUMBERVALUE がどう解決するか、より速い数式なしの解決策(*1、二重単項マイナス、区切り位置)、そして最新の Excel が一部のテキストを暗黙変換しても SUM は決してしない理由を解説します。

Henry
Excel DATEVALUE と TIMEVALUE — テキストとして閉じ込められた日付と時刻を救い出す

Excel DATEVALUE と TIMEVALUE — テキストとして閉じ込められた日付と時刻を救い出す

Excel の日付は、実は日付書式をまとったシリアル値です。テキストとして到着した日付は、並べ替えも引き算も DATEDIF への受け渡しもできない偽者です。DATEVALUE はテキストの日付をそのシリアル値に、TIMEVALUE はテキストの時刻を 1 日の端数に解析します。基本となる考え方、テキスト日付の症状、03/04/2026 という地域依存の曖昧さの罠、日付と時刻の結合方法、DATEVALUE が文字列を解析できない場面、そして DATE(LEFT,MID,RIGHT) と区切り位置という代替手段を解説します。

Henry
Excel INDIRECT 関数 — 文字列を「生きた参照」に変える(そしてなぜ揮発性なのか)

Excel INDIRECT 関数 — 文字列を「生きた参照」に変える(そしてなぜ揮発性なのか)

INDIRECT は "A1" や "Sheet2!B3" のような文字列を、生きたセル参照に変えます。考え方の軸、最大の落とし穴(文字列は自動追従しないため、シート名を変更するとすべての INDIRECT が #REF! で壊れる)、なぜ揮発性で Excel の依存関係トレーサーから見えないのか、閉じたブックで #REF! になる罠、唯一の決定的な用途(セルに書かれたシート名から値を引く)、そしてテーブル・3D 参照・CHOOSE の方が良い場面までを解説します。

Henry
Excel OFFSET 関数 — 動く参照(そして INDEX の方が良い場面)

Excel OFFSET 関数 — 動く参照(そして INDEX の方が良い場面)

OFFSET はアンカーから決まった行数・列数だけ離れた参照を返し、必要ならブロック全体へリサイズできます。考え方の軸、なぜ値ではなく参照を返すので SUM に渡せるのか、揮発性という代償、定番の動的名前付き範囲の技とテーブルやスピル範囲が今やそれに勝る理由、端を越えると #REF! になる罠、そして肝心の判断(範囲へのインデックス取り出しには非揮発性の INDEX を使い、OFFSET は本当に動く窓のためだけに残す)を解説します。

Henry
Excel ADDRESS 関数 — セル番地を「文字列」として組み立てる(値ではない)

Excel ADDRESS 関数 — セル番地を「文字列」として組み立てる(値ではない)

ADDRESS はセル番地のテキストを組み立てます — =ADDRESS(1,1) は A1 の中身ではなく、文字列 "$A$1" を返します。考え方の軸(INDIRECT の入力側の逆)、値ではなく文字列を返すという最大の誤解、$ ロックを制御する abs_num 引数、INDIRECT や OFFSET と違ってなぜ揮発性でないのか、本当の用途(MATCH でどこに値があるか報告する・INDIRECT へ渡す参照を組み立てる)、そして現代の Excel でどれほどニッチかについての率直な見解を解説します。

Henry
Excel SUMPRODUCT関数 — 掛けてから足す、SUMIFSでは書けない条件まで

Excel SUMPRODUCT関数 — 掛けてから足す、SUMIFSでは書けない条件まで

SUMPRODUCTは配列を要素ごとに掛け合わせ、その結果を合計します。1つのセルで内積を計算する関数です。次元不一致による#VALUE!の落とし穴、なぜANDでは真偽値配列を掛け算しORでは足し算するのか(AND()/OR()を使ってはいけない理由)、二重マイナス(--)が必要になる場面、そしてSUMIFSでは今なお手が届かない加重合計と列をまたぐORの仕事を解説します。

Henry
Excel SUBTOTAL関数 — フィルターを尊重する集計(と9 vs 109の落とし穴)

Excel SUBTOTAL関数 — フィルターを尊重する集計(と9 vs 109の落とし穴)

SUBTOTALはフィルターを認識する集計です。フィルターで非表示になった行をスキップするので、リストの末尾の数字がフィルターに合わせて更新されます。function_numの一覧表、1〜11 vs 101〜111の落とし穴(手動で行を隠しても集計が変わらない理由)、SUBTOTALが他のSUBTOTALを無視して総合計が二重計上にならない仕組み、そしてエラーをスキップできない理由 — それこそAGGREGATEが作られた目的 — を解説します。

Henry
Excel AGGREGATE関数 — エラーも無視できるSUBTOTALの上位互換

Excel AGGREGATE関数 — エラーも無視できるSUBTOTALの上位互換

AGGREGATEはSUBTOTALに2つの強化を加えたものです。関数が11個ではなく19個になり、エラー値・非表示行・ネストした集計を無視できるoptions引数が付きました。function_num + optionsのグリッド、最も使われていない技 — IFERRORで掃除せずに #N/A を含む列を合計する技 — そして余分なk引数を必要とする配列形式の関数(LARGE、SMALL、PERCENTILE)を解説します。

Henry
Excel FIND・SEARCH — 内容で文字を探す(FIND と SEARCH の違い、そして

Excel FIND・SEARCH — 内容で文字を探す(FIND と SEARCH の違い、そして

FIND と SEARCH は、ある文字列が別の文字列の中で始まる位置を返します。これは MID や LEFT に渡すアンカーです。本当に重要な2つの違い(FIND は大文字小文字を区別しワイルドカード不可、SEARCH は区別せずワイルドカード可)、一致がないとなぜ両方とも #VALUE! を投げるのか、そして ISNUMBER(SEARCH()) の「含むか」判定テクニックを解説します。

Henry
Excel SUBSTITUTE・REPLACE — 内容で置き換えるか、位置で置き換えるか

Excel SUBSTITUTE・REPLACE — 内容で置き換えるか、位置で置き換えるか

SUBSTITUTE と REPLACE はどちらもテキストを置き換えますが、考え方が違います。SUBSTITUTE は内容で一致させ(すべての 'x' を、あるいは N 番目だけを置換)、REPLACE は位置で動きます(5文字目から9文字目を上書き)。どちらを使うか、なぜ SUBSTITUTE が大文字小文字を区別するのか、そして LEN 引く LEN の出現回数カウントのテクニックを解説します。

Henry
Excel ROUND 関数 — ROUND・ROUNDUP・ROUNDDOWN と「表示形式は四捨五入ではない」理由

Excel ROUND 関数 — ROUND・ROUNDUP・ROUNDDOWN と「表示形式は四捨五入ではない」理由

ROUND は格納されている値そのものを指定した小数桁に丸めますが、セルの表示形式は見た目を変えるだけです。この差が請求合計を1円ずれさせる理由、num_digits の使い分け(正・ゼロ・負)、ROUNDUP と ROUNDDOWN が ROUND とどう違うか、そしてなぜ「上下」ではなく「ゼロからの距離」で丸めるのかを解説します。

Henry
Excel MROUND・CEILING・FLOOR — 小数ではなく、最も近い倍数に丸める

Excel MROUND・CEILING・FLOOR — 小数ではなく、最も近い倍数に丸める

MROUND・CEILING・FLOOR は、小数の桁数ではなく、ある数の最も近い倍数 — 5セント、15分、1カートン丸ごと — に丸めます。第2引数が桁数ではなく倍数である理由、古い CEILING が負の数で #NUM! を出す理由、CEILING.MATH と FLOOR.MATH が安全な現代の選択肢である理由、そしてそれぞれをいつ選ぶかを解説します。

Henry
Excel INT・TRUNC・MOD — 小数を落とし、余りを求める

Excel INT・TRUNC・MOD — 小数を落とし、余りを求める

INT と TRUNC はどちらも小数を落としますが、INT はマイナス無限大の方向に丸め、TRUNC は単にゼロへ向けて切り落とすため、負の数で結果が分かれます。MOD は余りを返し、Excel では余りは数値ではなく除数の符号を引き継ぎます。1だけずれるワナ、日付と時刻の分離、シマ模様パターンを解説します。

Henry
ExcelのIF関数 — Yes/Noの分かれ道は一つ、ネストはどこで止めるか

ExcelのIF関数 — Yes/Noの分かれ道は一つ、ネストはどこで止めるか

IFは一つのYes/Noを問い、2つのうち1つの答えを返します。3つ目の引数を省くとFALSEが出る理由、ネストしたIFのピラミッドが2段を超えると崩れる理由(代わりにIFSやルックアップを使う)、ネストせずにAND/ORで条件をまとめる方法、IFの文字列比較が大文字小文字を無視する理由を解説します。

Henry
ExcelのIFS関数とSWITCH関数 — ネストIFのピラミッドなしで多分岐ロジックを

ExcelのIFS関数とSWITCH関数 — ネストIFのピラミッドなしで多分岐ロジックを

IFSは条件のリストを上から下へ確認し、最初に一致したものを返します。SWITCHは1つの値を複数のケースと照合します。バグの大半を生む2つの罠——IFSには既定値(else)がなく、振り分けを忘れると #N/A になること、そして先勝ちなので順序が命であること——に加え、IFS・SWITCH・ルックアップ表の使い分けを解説します。

Henry
ExcelのIFERROR関数 — バグを隠さずにエラーを受け止める(IFERROR vs IFNA)

ExcelのIFERROR関数 — バグを隠さずにエラーを受け止める(IFERROR vs IFNA)

IFERRORは数式のエラーをフォールバック値に置き換えますが、あらゆる種類のエラーを捕まえます——だから #REF! や #NAME? のような本物のバグまで静かに隠します。なぜルックアップにはたいてい IFNA が正しい道具なのか、すべてを IFERROR で包むのがアンチパターンである理由、そして XLOOKUP の if_not_found が両者に勝る理由を解説します。

Henry
ExcelのCOUNTIF & COUNTIFS — 条件に合う行を数える(そして ">"&A1 の罠)

ExcelのCOUNTIF & COUNTIFS — 条件に合う行を数える(そして ">"&A1 の罠)

COUNTIFSはすべての条件を満たした行を数えますが、条件を間違えるとエラーも出さずに「もっともらしいが間違った数」を返します。セルと比較するときは演算子を連結する正しい書き方、ANDは標準でORは別という仕組み、2つの日付の間を数える方法、そして重複を除いた数にはCOUNTIFSではなくUNIQUEが要る理由を解説します。

Henry
ExcelのSEQUENCE関数 — 数値・日付・連番の「生きた」配列を生成する

ExcelのSEQUENCE関数 — 数値・日付・連番の「生きた」配列を生成する

SEQUENCEは数値の配列を何もないところから生み出します。フィルハンドルの代わりではなく、動的配列の連番・日付シリーズ・グリッドを支える「エンジン」です。引数の順番(行、列、開始、増分)、生きたカレンダーの作り方、#SPILL!の直し方、ドラッグやROW()を置き換える場面を解説します。

Henry
Excel VBA の Trim — 空白が消えない理由と Chr(160) の対処法

Excel VBA の Trim — 空白が消えない理由と Chr(160) の対処法

VBA の Trim は両端だけを削り、内側の空白には触れません。さらに、Web や PDF からの貼り付けで紛れ込む非改行スペース Chr(160) も無視します。考え方の軸、使うべき正規化関数 1 つ、そしてどの関数がどの場面で勝つか。Excel 365 / 2021 / 2019 で検証済み。

Henry
VBA InputBox — 2つの InputBox と使い分け

VBA InputBox — 2つの InputBox と使い分け

VBA の InputBox は1つではなく2つあります。単純な InputBox で足りる場面、Type を付けた Application.InputBox が勝つ場面、そして両方を静かに壊す「キャンセルの落とし穴」まで。コピペで動く例、Excel 365 / 2021 / 2019 で動作確認済み。

Henry
VBA UserForm — 本格的な入力フォームを作る

VBA UserForm — 本格的な入力フォームを作る

VBA UserForm を正しく作る方法。イベント駆動の考え方、.Show のあとコードが「消える」理由、そして入力した値を読めるかどうかを決める Unload と Hide のルールまで。コピペで動くイベントコード、Excel 365 / 2021 / 2019 で動作確認済み。

Henry
Excel VBA Whileループ — Excelを固めずにループする方法

Excel VBA Whileループ — Excelを固めずにループする方法

VBAのWhileループは「必ず終わる」という約束であり、それを守るのはあなた。すべてのWhileループに必要な3つの部分、なぜDo WhileがWhile...Wendより良いのか、そして二度とExcelを固めない方法を、コピペ実例とともに。Excel 365 / 2021 / 2019で動作確認済み。

Henry
ExcelのUserFormにおけるSetFocusの完全ガイド:効率的なフォーム制御の実現方法

ExcelのUserFormにおけるSetFocusの完全ガイド:効率的なフォーム制御の実現方法

主要ポイント 1. 基本的な実装方法 UserForm_Activateでの初期フォーカス設定が重要 SetFocusメソッドを効果的に活用 TabIndexによる適切な移動順序の設定 2. 重要な改善点 エラーハンドリングの実装 パフォーマンス最適化 ユーザビリティの向上 3. 実装時の注意点 モードレスフォームでの特別な対応 イベント制御の適切な管理 フォーカス制御のタイミング

Rosa Rugosa
Excel VBAでヘッダーを配列に格納し、検索する方法

Excel VBAでヘッダーを配列に格納し、検索する方法

本記事では、Excel VBAを用いてシートのヘッダー情報を配列に格納し、さまざまな検索・管理手法を実践的に紹介しました。具体的には、MATCH関数で特定の表頭列を特定する方法、正規表現を用いた複雑な文字列マッチング、Dictionaryオブジェクトによるキーと値のペア管理などを解説しています。また、日本語ヘッダーを扱う際の注意点や、大規模データ処理を高速化するためのテクニック(スクリーン更新の停止や計算モードの最適化)も取り上げ、日々のExcel作業をより効率的かつ信頼性高く行うための実践的ノウハウを提供しています。

Rosa Rugosa