和風スパゲティのレシピ

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

2025-01-01から1ヶ月間の記事一覧

1/28(火)21:00~ VBA勉強会「第2回 スパゲティコード添削会」

「スパゲティコード添削会」と称してVBA勉強会を開催します!今回は「Sub・Functionの分割」をテーマに2題を添削します。 プロシージャ分割の入門も交えて行いますので興味のある方は是非ご参加ください!

Dictionaryを用いたデータ集計 - ItemにもDictionary版

Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「ItemにもDictionaryを格納」パターンを紹介します。

Dictionaryを用いたデータ集計 - Itemにクラス版

Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに自作クラスを格納」パターンを紹介します。

Dictionaryを用いたデータ集計 - Itemに配列版

Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「Itemに一次元配列を格納」パターンを紹介します。

Cells(○, ○). の入力候補を出す小技

Cells(R, C).の入力候補が出てくれない対策として「Cells.」から入力を始める技があります。さらにこの技は「Worksheets("○○"). Cells」とドットとCellsを離すことで、Worksheets.の問題にも対応できます。

テスト用コードの実行をフラグ定数で管理する

マクロをテストする際、Debug.Printなど表示機能を使ったり、作業シートを削除せず残したりします。これをPublic定数を使って「If Isデバッグモード Then」で分岐することで、一括で実行管理することができます。

配列を新規シートに出力して中身を確認する

配列をマクロに利用する際、中身を確認するのにひと手間かかるのですが、「新規シートに配列を出力する」マクロを用意することで対策ができます。フィルターを設置することでデバッグ作業の効率が上がります。

ジャグ配列(配列の配列)を二次元配列に変換する

配列の中に配列が入っている、いわゆるジャグ配列を、ただの二次元配列に変換するコードを紹介します。DictionaryのItemに配列を入れた際、Itemsで生成されるジャグ配列をセルに一括出力するなどに活用できます。

Transpose関数と愚直な配列代入の速度比較

Transpose関数と、同じ処理を愚直にFor文で代入する方法の速度比較を行いました。結果は愚直に代入した方が早かったですが、両方とも十分高速なため、よほどの規模を相手にしない限りは誤差の範囲と思ってよいようです。

色(RGB値)の操作を補助するクラスを作る

クラスモジュールづくりのサンプルとして「色の操作を補助するクラス」を作ってみました。Property Get&Letプロシージャの勉強にピッタリな題材なので、練習がてらコードを眺めてみてください。

0,1始まりでない配列(Array)をセルに出力する

例えば「インデックスが2~5の配列」を全然違う番地のセル範囲に吐き出してみても、特にはありません。両者の大きささえ一致していれば、配列インデックスとセル番地は一致している必要はありません。

Transposeは65,537番以降を無告知で破棄する

Transpose関数は配列の要素数が65,537を超えると要素をエラーもなく破棄してしまう仕様があります。配列をセルに出力したときなぜか#N/Aエラーになる現象などはこの仕様による不具合を疑ってください。

配列をセル範囲(Range)に一括出力する

配列をセル範囲に一括で出力する方法を紹介します。横方向に出力する場合はRange.Value=配列、縦方向に出力する場合はRange.Value=Transpose(配列)、二次元配列の場合はRange.Value=二次元配列で実行できます。

配列の要素数を取得する - Ubound・Lbound関数

配列の要素数を求める方法を解説します。最大要素番号を求めるUbound関数と、最小要素番号を求めるLbound関数を用いて、「Ubound - Lbound + 1」で求めます。二次元配列の場合は各次元を第2引数で指定します。

同じ文字を繰り返した文字列を作る - String関数

「あああ」や「AAA」など同じ文字を繰り返した文字列を作りたいときは、String(繰り返し回数, 繰り返す文字)で生成できます。繰り返す文字が複数の場合は、WorksheetFunction.Rept関数の方を使用してください。

配列の開始番号を設定する - Option Base 1

配列を何番始まりにするかを設定するOption Base ステートメントを解説します。ただしこのステートメントは「配列を取得するほとんどの関数・メソッドに無視される」ため、あまり使用はおすすめできません。

Dictionaryを用いたデータ集計 - 列ごとにDictionary作成版

Dictionaryの活用例として、データ集計マクロを作成してみます。Itemに値を保管する手段としてDictionary/配列/クラスなどがありますが、本ページでは「列ごとにDictionaryを作成する」パターンを紹介します。

Range("A1") Is Range("A1") = False

Rangeオブジェクトには「取得ごとに違うオブジェクトを用意する」という性質があり、全く同じセルを指していたとしてもIsによる比較がFalseを返します。同一セル判定を行うには、Addressプロパティを使用してください。

Dictionaryに渡すセル「.Value」は省略できない

Dicitonaryのkey/ItemはVariant型のため、値でもオブジェクトでも入れることができます。このためセル⇒セル.Valueの自動読替はできませんので、値をkeyにするには.Valueを明示する必要があります。

クラスのメンバーに配列(Array)を定義する

クラスモジュールのメンバーに配列(Array)を定義する方法を解説します。Variant変数で定義することはできますが、そのままでは要素の書き換えが出来ないため、入出力用のPropertyプロシージャを作成して対応します。

2025年 あけましておめでとうございます

明けましておめでとうございます!今年もどうぞよろしくお願いいたします!2025年はブログの100日連続投稿と合わせて、Excel-Fun.xls*の500名突破も目標としたいと思います。皆さまどうぞよろしくお願いします。