和風スパゲティのレシピ

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

サンプルコード

セルが特定のセル範囲内にあるか判定する-Intersect

あるセルが特定のセル範囲内にあるかを判定するには、セル範囲の交差範囲を取得するIntersectメソッドを使用します。選択セルに実行するマクロならSelection、イベントマクロならTargetを引数に渡してください。

重なった図形を最前面のもの以外削除する

同じ図形が同じ場所に大量に溜まったファイルを整理する際に、最前面の図形以外を削除するコードを紹介します。タイプや位置などの複数要素の一致判定にはDictionaryを使用するのが便利です。

非表示のシートをコピー・移動する

非表示のシートをコピー・移動しようとするとエラーが発生します。これを非表示のまま解消することはできませんので、一旦再表示 → コピー/移動 → 非表示に戻すという手順を踏んで対応します。

Collectionで重複なしリストを作成する

Collectionで重複のないユニークリストを作成する方法を解説します。KeyにItemと同じものを入れてKeyを重複チェックに利用するか、Itemの存在チェック関数を自作して対応するかの2つの方法で対応します。

Accessのテーブルをワークシートに出力する

Accessのテーブルをシートに出力する方法を紹介します。ADODBのSQLによるSELECT文を使用しています。テーブル名と出力始点セルを渡せば動く関数にしましたので、本関数を中身を見ずにCallしてもOKです。

指定行より下を最終行まですべて削除する

指定行より下の行をすべて削除するコードを解説します。シートの最終行まで削除、データの最終行まで削除の2通りの処理を解説します。いずれもフィルター抽出中は正しく動かないことに注意してください。

Excelがスピルに対応したバージョンか調べる

Excelがスピル対応のバージョンか調べる方法を解説します。一発で調べる方法はありませんので、RangeオブジェクトにFormula2プロパティが存在するかで判定します。

オブジェクトに特定のプロパティが存在するか調べる

オブジェクトに特定のプロパティが存在するかを調べる方法を解説します。一発でこれを行うプロパティは存在しませんので、オブジェクト.プロパティがエラーになるかどうかを調べて判定します。

条件を満たす列を削除する - Delete/Union

特定の条件を満たす列を削除する方法を解説します。For文でStep-1を利用して最終列から1行ずつ削除していく方法と、Unionメソッドで一つのRangeオブジェクトにしてから一括で削除する方法があります。

第1行の書式を最終行までコピーする - Rows

書式のコピーにはPasteSpecialが思い浮かびますが、行ごとコピーする場合はAutoFillメソッドが使用できます。クリップボードを介さず安全高速ですので、フィルハンドルのようなコピー処理にはこちらを使用しましょう。

Collectionに要素が存在するかチェックする

Collection内に要素が存在するかチェックするには、標準機能がないため愚直にFor Each文で一致する要素があるかを判定します。DictionaryならExistsメソッド一発なので、出来ればそちらで実装しましょう。

デスクトップのフォルダパスを取得する

デスクトップのフォルダパスを取得する方法を解説します。いくつか方法がありますが、環境変数を取得するEnviron関数を使用するのが簡単です。他にWScript.Shellオブジェクトを使用する方法もあります。

Collectionを配列(Array)に変換する

Collectionを配列に変換する方法を解説します。標準機能にはないため、愚直に全要素を配列へ出力して変換します。CollectionはFor文で回すと非常に遅い性質があるため、配列への代入はForEach文で行ってください。

ブックを開いたまま移動/名前を変更する

ブックを開いたまま移動したり、名前を変更する方法を解説します。これをストレートに実行する方法はありませんので、対象のブックを名前を付けて保存したあと元のブックを削除という手順で実行します。

動的配列が初期化(ReDim)されているか判定する

動的配列が初期化されているか判定する方法を解説します。Uboundがエラーになる仕様を利用してOn Error Resume Nextを用いる方法と、ビット演算を用いた(Not Not 配列)を判定する方法の2つがあります。

1行おきに背景色を設定して縞模様にする

テーブル形式の表データに縞模様を付けるコードを紹介します。表の範囲を取得できる場合は表エリア.Rows、列のエリアを指定する場合はIntersectを利用して行ごとにRangeを取得し、偶数/奇数で判定して着色します。

結合セルの値を取得する - MargeArea/Value

結合セルの値を取得する方法を解説します。結合エリアから先頭セルの値を取得したい場合はCells(1).Valueを、結合内部セルから結合セルの値を取得したい場合はMergeArea.Cells(1).Valueをそれぞれ使用します。

表示されているシートのみをループする - Visible

表示されているシートだけをループするにはForEach文で取得したWorksheetのVisibleプロパティを調べてTrueにシートだけに処理を実行します。他の条件も判定する場合はIf文を重ねるかAnd演算子を使用します。

Nothingを受け取るUnionメソッドを作る

UnionメソッドはNothingを受け取らないため、If rng Is Nothing Thenの分岐を書かないと初回実行時に必ずエラーになります。これをいちいち書かなくて済むよう、Nothingを受け取るUnionメソッドを作りましょう。

条件を満たす行を削除する - Delete/Union

特定の条件を満たす行(データ)を削除する方法を解説します。For文でStep-1を利用して最終行から1行ずつ削除していく方法と、Unionメソッドで一つのRangeオブジェクトにしてから一括で削除する方法があります。

Rowsプロパティで複数行を指定する

Rowsプロパティで複数行を指定する方法を解説します。Rows("2:10")の形で指定が可能ですが、文字列ではなく数値で指定する場合はRange、Resize、EntireRow、Unionなどのプロパティを利用します。

複数のセル範囲が選択されているか判定する

選択セル(Selection)が複数のセル範囲を含むか判定するには、RangeオブジェクトのAreasプロパティを使用し、Countが1であるかどうかで判定します。Areas(1)とすれば、第1セル範囲だけを取得できます。

セル内の特定文字列だけを着色する - Characters

セル内の特定の文字列を着色する方法を解説します。Instr関数で文字列の位置を特定し、Charactersプロパティを用いて特定文字列だけを書式設定します。サイズ/太字/フォント/背景色なども同じように設定可能です。

特定の文字列を含むセルを検索する - Instr関数

ある文字列を含むセルを検索する方法を解説します。For文またはFor Each文でセルをループし、Instr関数で特定の文字列を含んでいるか判定します。より複雑な判定を行う場合はLike演算子を使用してください。

セル値や変数が文字列(String)か判定する

セル値や変数、配列の中身が文字列か判定するには、TypeName関数を使用します。ただしTypeName関数は"200"や"2025/4/1"なども文字列と判定するため、場合によってIsNumericやIsDateと併用してください。

"100円"も数字として合計できるSUM関数を作る

ワークシート関数をFunctionで自作してみる遊びです。今回は「100円+100円を200と計算してくれるSUM関数」を作ってみようと思います。100円(※1)の1は無視して100を取得する気遣いを処理に入れてみました。

文字列内の指定文字列を削除する - Replace関数

文字列の中から文字列を検索して削除する方法を解説します。通常はReplace関数を用いますが、n個目だけを削除したい、八謙一の前後も削除したいなどに対応する場合はSubstitute関数やInstr関数を用います。

日付から曜日を取得する - Format/Weekday

日付から曜日を取得する方法を解説します。MonやTue、月・火などの曜日名が欲しい場合はFormat関数を、曜日番号を取得してカレンダーの位置や第1日曜日などを取得したい場合はWeekDay関数を使用します。

ひらがな↔カタカナの相互変換 - StrConv関数

文字列中のひらがなをカタカナにしたり、カタカナをひらがなに変換する方法を解説します。StrConv関数を使用し、引数にvbHiragana、vbKatakanaを渡します。半角カナに対応するには別の方法が必要になります。

半角英数はそのままに半角カナを全角カナに変換する

文字列中の半角カナを全角カナに変換する場合は、StrConv関数を使用します。しかし半角⇒全角を行う引数vbWideはすべての半角文字を変換してしまうため、半角英字や半角数字をそのままにする処理が必要です。