t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBAの研究・考察

VBA Debug.Print、Debug.Assertの代用クラス案

Debug.Print、Debug.Assertはいずれもデバッグ用の機能なので、リリース版のコードには不要である。 かといって消してしまうと、次にコードを修正するときに面倒なので残しておきたい。そこで代用クラスを作ってみたので紹介。まずクラスモジュールを挿入し…

VBA For Eachが順番を保証しない理由を自作のコレクションで説明

今回はVBAのFor Eachステートメントが仕様上、出力順を保証しない理由についてC#で作った自作のコレクションを使って説明してみようと思う。さて、普段ならコードから紹介して後で説明に入るスタイルを取るが、今回はちょっとややこしいのでいきなり本題の説…

VBA TRANSPOSE関数で一次元データのみの二次元配列を一次元配列に変換する。

VBAでは、セル範囲と配列の相互変換ができるが、たとえ1列分しか変換しなくても二次元配列となってしまう。参考 infoment.hatenablog.comVBAのJoin関数でひとつの文字列に加工しようと思ったら色々と工夫が必要なのだが、実はワークシート関数のTRANSPOSEを…

VBA プロシージャ呼び出しの仕組みから再帰を理解する

以前に以下の記事で再帰を説明するのに、普通の関数呼び出しに置き換えるアプローチをとった。 thom.hateblo.jp今回はそもそものプロシージャ呼び出しの仕組みから説明しようと思う。例えば以下のコードでProcedureCall1を実行してみる。 Sub ProcedureCall1…

VBA Select Case文における条件式の短絡評価活用の是非について

VBA Select Case文における条件式の短絡評価活用の是非について述べる。 前提 以下の書籍で、Select Case文の条件式短絡評価について記載されているが、そのテクニックとしての是非についてTwitter上で疑問が上がっていた。入門レベルでは決して足りない実務…

VBA バグ?Number Formatがコピーされない事象

作成中のマクロでバグっぽい事象が確認されたのでメモ。 発生した環境はExcel 2013 32bit on Windows 10 Home 64bit。マクロというよりは、手でやっても同じことになるので手作業の方を先に紹介。 新規シートを挿入する。 B1セルに時刻を入力する。 A1:B2の2…

VBA 変数宣言はIfやFor等のコードブロック中に書いても機能する

VBAでは、変数宣言をIfやFor等の制御構文の中に書くことができる。 作法としてどうなのって話は一旦置いといて、とりあえず実証してみよう。以下のマクロは正常に実行できる。 Option Explicit Sub hoge() If False Then Dim variable As Integer End If var…

VBA Publicなプロシージャをマクロの実行メニューから隠す方法

ユーザーに実行させたくないマクロを「マクロの実行」メニューから隠す方法として最も簡便なのはプロシージャをPrivateにしてしまうことだ。 しかしマクロがある程度大きくなると、複数のモジュールにプロシージャを分散させたい場合がある。他モジュールか…

プログラムコード中に値(あたい)は登場しない

VBAに限らず全てのプログラミング言語で言えることだが、コード中に値(あたい)が直接登場することは無い。 最近、「値とは何か」ということを掘り下げて考えることがあり、ようやくこの結論に行きついた。たとえば、数字の「1」。これは一般的に値だと理解さ…

VBAの知識の依存関係の整理を試みる

※今回の記事は基本的に自分用の備忘録です。VBAの学習における知識の依存関係の整理を試みた。 試みたというのは、お世辞にも成功したとは言えない為である。書籍でプログラミングを学ぶ際は、ふつう1ページずつ読み進めていく。 これに対して、実際の知識体…

VBA フォームのボタンの反応が遅い理由と対策

今回はVBAでユーザーフォームに配置したボタンの反応が遅い理由とその対策について紹介する。 検証のため、以下のようなカウンターフォームを作った。 作成方法 フォームに配置した各オブジェクトは以下のように名前を変更した。 コードは以下のとおり。 Pri…

VBAでアホな実験 ~ Not演算子は何個連続で使えるか

二重否定文…それは時に控えめな肯定を、時に強い肯定を生み出す日本語のテクニックである。控えめな肯定の例「できなくもない」 強い肯定の例「やらねばならない」なんてことを考えてたら、そういやNotって二個以上つなげても大丈夫なんかしらと、アホなこと…

VBA クラスモジュールでRangeの仕組みを説明する

昨日公開した以下の記事について、比喩ではちょっと難しいという声をいただいたので、今回はクラスモジュールを使って私が想像するRangeの仕組みを具体的なコードで解説しようと思う。 thom.hateblo.jpまずはSheetの模擬クラスとRangeの模擬クラスを用意する…

VBA Rangeオブジェクトはシートを操作するエージェント

VBAで扱える代表的なExcelのオブジェクトにWorkbook、Worksheet、Rangeなどがある。 ひとつのブックにはひとつのWorkbookオブジェクトが対応している。 ひとつのシートにはひとつのWorksheetオブジェクトが対応している。 ではひとつのセルに対応する固有の…

VBA プロシージャのオーバーロード機能(もどき)を自作する

今回のネタは@mmYYmmddさんのつぶやきから生まれた。感謝。さて、オーバーロードとは。 ふつう、Functionが取れる引数の数や型は固定されていてあまり自由が利かないのだが、引数の数や型によって処理を振り分けたい場合がある。 VariantやOptional、ParamAr…

VBA WSHとScriptingに存在するFileSystemObjectは同一のバイナリーであることが判明

VBエディタから参照設定で「Windows Script Host Object Model」と、「Microsoft Scripting Runtime」の両方にチェックを入れると、どちらのライブラリにもFileSystemObjectが存在する。 今回はこの2つが同じものなのか、それとも別物なのかを検証してみた。…

VBA マクロ、プロシージャ、メソッドなどの用語について正確に理解する

初心者向けの解説によくマクロとVBAの違いが取り上げられる。 一応違いについて説明した後、同じようなものなのであまり気にしなくて良いと締めくくるケースも多いけど、私はやはり違いを意識したほうが良いと考える。初心者は同じようなものと言ってくれた…

VBA デザインしたユーザーフォームを元にNewで複数のフォームインスタンスを作る。

VBAでユーザーフォームはふつう、単一のオブジェクトとして扱う。たとえば以下のようなフォームを作ったとしよう。 オブジェクト名は「frm成績」としたので、このフォームを表示させるコードはこうだ。 Sub hoge() frm成績.Show End Sub この時フォームは、…

VBA MsgBoxのオプションはなぜ足し算できるのか

VBAのメッセージボックスでは、以下のように適用したいスタイルを足し算できる。 Sub hoge() MsgBox "処理を続行しますか。", vbYesNo + vbQuestion + vbDefaultButton2, "確認" End Sub 上記のマクロを実行すると、このように表示される。 変な文法だと思わ…

VBA 複数の引数をとるPropertyプロシージャ

これまでProperty Getは複数の引数を受け取ることができないと思っていたが、昨日Twitterで以下のご指摘をいただいた。@thom__jp https://t.co/pgPwIa8S2pの記事で少し気になったのですが、PropertyLetは複数の引数をとれる(最後の一つが右辺、残りは左辺の…

VBA PowerPointでShapeを一気に削除するマクロ

こちらのブログで、PowerPoint VBAでFor Eachを使ってShapeを消すとうまくいかないという問題が紹介されていた。chemiphys.hateblo.jpやってみたところ、実際に1つ飛ばしで削除される。 実際に検証 Excelで検証してみた。 Sub Excel版ShapeAdd() Dim i As Lo…

VBA プロシージャ呼び出しのオーバーヘッドについて

今回はVBAでプロシージャ呼び出しにかかるオーバーヘッド時間を計測してみた。 プロシージャ呼び出しのオーバーヘッド改善はコンパイラの領分 一般的に、プログラミングではプロシージャの呼び出しにはオーバーヘッドが発生すると信じている方もいるようだけ…

VBAの標準モジュールはオブジェクトなのか

結論として、私は最近標準モジュールを「オブジェクト」と見做すようになったのだが、そのあたりの経緯と悩みをうだうだと書こうかと。 MSの公式見解によると、標準モジュールはオブジェクト モジュールではない Excel VBAでコードを書ける場所は、Microsoft…

VBA インターフェースとは、プロパティやメソッドの存在を保証する規格のようなもの

プログラミングの学習途中で、いくつか難しい概念にぶつかる。 インターフェースもその一つだと思う。このインターフェースは、フォームのボタンなどの、ユーザーインターフェースのことではない。 クラスモジュールなどで作ったオブジェクトに適用するイン…

VBA Propertyはフィールドのフリをしたメソッド ~ プロパティに値を代入するという表現は厳密には正しくない

プロパティーに値を代入するという表現をよく見かける。 私もつい最近までそのように表現していたけれど、これって厳密には間違ってるんじゃないかと思い始めている。 というのも、Propertyプロシージャを学習する際、この「代入」という表現が理解を難しく…

VBA クラスモジュールで連結リストを作成する方法

今回はクラスモジュールを使って連結リストを作成してみる。 実験ではなく、必要性があって作ることになったのでそういう意味では実用的なサンプルとして紹介できるかと思う。 連結リストとは 情報処理技術者試験などで学習したことがある人も要ると思うが、…

VBA 自作クラスのBeforeChangeイベントでCancel処理をする方法

さて、前回は自作クラスにEventを実装する方法について説明した。 thom.hateblo.jp前回紹介したマクロはMoveNextをクリックするたびにカーソルが下に移動するというものだったが、CursorオブジェクトのValueに上限・下限を設けていないためクリックし続ける…

VBA クラスモジュールに自作のEventを実装する

今回はクラスモジュールに、自作のEventを実装し、シートモジュールでクラスのイベントを受け取る処理をやってみる。 まずはEventを使用しないクラスサンプル クラスモジュールを挿入し、以下のコードを貼り付け。 ※サンプルなのでクラスモジュールのオブジ…

VBA オブジェクトとメモリの関係 ~ オブジェクトが参照型と呼ばれる理由

前回、VBAを擬人化して、変数が記号表によって管理されているというところまで書いた。※読んでない方はこちら thom.hateblo.jpさて、今回はオブジェクトがメモリ上でどう扱われるのかという話。次のコードで説明しようと思う。 Dim c As Collection Set c = …

VBA 変数とメモリの関係 ~ 値渡しと参照渡しをメモリの動きから理解する

今回は変数とメモリの関係について書こうと思う。 ちょっと「記号表」とかいろいろ難しいモノが登場するのだが、ちょっとわかりやすく説明するためにVBAを擬人化しておこうと思う。 コンパイラー君とインタープリターさんの紹介 まずあなたがVBAコードを書く…

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。