和風スパゲティのレシピ

日本語でコーディングするExcelVBA

VBAの落とし穴

掛け算を置換するとワイルドカード*と認識される

あいまい検索に使用するワイルドカード「*」と、掛け算に使用する「*」は同じ文字です。よって、掛け算を置換する際に、「*」も含めた置換をすると、*の部分は任意の文字列のため、置換が暴走します。「~*」とすることで、記号をターゲットに置換できます。

Len関数は文字列長でなく変数の消費メモリを返すことがある

Len関数には、「String以外の変数を渡すと、変数のメモリ上の大きさを返す」といういらぬ仕様があります。Len関数がなぜか4を返す、文字列の切り抜きがうまくいかない、あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

セル範囲のコピー&ペーストに非表示のセルは含まれる?

セル範囲をコピーした場合、オートフィルターで抽出していないレコードはペーストされません。しかし、非表示にしている列はペーストされます。この仕様の違いは、知っている方も多いのではないでしょうか。では両方がかかっているデータをコピーすると…?

For Each ○ In Range はセルごとのループとは限らない

落ちると抜け出せなくなるVBAの落とし穴です。For EachでRangeオブジェクトをループしたとき、全セルが処理されない。Rangeオブジェクト.Countがセルの数を返さない。あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

Workbooks.Open中にShiftを押すとマクロが停止する

知らずに落ちると抜け出せなくなるVBAの落とし穴です。Wrokbooks.Open 以降が実行されない。マクロが何のエラーメッセージも出さずに静かに止まる。Exitもなく絶対実行されるはずの行が実行されない。あたりにお悩みの方は、この落とし穴を疑いましょう。

Val関数は全角(日本語入力)の「1」を0に変換する

知らずに落ちると抜け出せなくなるVBAの落とし穴です。今回の罠は超単純です。Val("全角の1") ' ← 0が返ります。という罠です。皆さん気をつけましょう。他にも罠がたくさんあるので、Val関数は正直言うと使用禁止関数です。

OnErrorResumeNextはIfの分岐をTrueとみなす

Ifの判定部分がOn Error Resume Nextでスキップされた場合、IfステートメントはTRUE側に分岐します。実はIfステートメントはTrueなら通ってよしという処理ではなく、FalseならEndIfまでジャンプという処理なので、それがスキップされるという理屈です。

Dirループ中は別関数であっても他のDirは使えない

知らずに落ちると抜け出せなくなるVBAの落とし穴です。Dir関数が途中で止まる、逆に無限ループする、「プロシージャの呼び出し、または引数が不正です。」エラーを出す、あたりにお悩みの方は、この落とし穴に落ちていないかご確認ください。

単セル.SpecialCellsはシート全体から実行とみなされる

知らずに落ちると抜け出せなくなるVBAの落とし穴です。SpecialCellsを使ったらバグった。急にシート全体の値が書き換わった。SpecialCellsでセルを絞ったつもりが、元のRangeよりなぜか広くなった。あたりにお悩みの方は、この落とし穴を疑ってください。