t-hom’s diary

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

クラスモジュール活用

VBA クラスモジュールをゴミ箱代わりに使って複数列を一気に削除する方法

先日Excel方眼紙で作成された表を1データ1列の綺麗な表に変換するために、空白行を削除するというシチュエーションが発生した。以下は今回のマクロ紹介のために作成したダミー。全国の郵便番号データから無作為に100件選んだものである。 上記の表では列が結…

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

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

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

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

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

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

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

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

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

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

VBA クラスモジュールはもっと当たり前に使われるようになって欲しい

私がクラスモジュールの使い方を知るまでのエピソード 私が初めてオブジェクト指向の便利さを理解したのは、なぜかVBScriptだった。ExcelファイルをVBScriptのファイルにドラッグ&ドロップすると内容を読み取ってAccessのデータベースに登録し、ドロップさ…

VBA クラスという用語は「類(るい・たぐい)」を指す言葉である。

これまでクラスモジュールについて扱ってきたけど、言葉の意味を知らないままクラスクラス言っててもなかなかその本質的なイメージをつかむことは難しいと思う。やはり人間、なじみのない言葉で何かを覚えようというのは無理がある。そこで今回はVBAは一旦脇…

VBA モデル化の概念を理解すると、クラスモジュールの使い方が分かる

クラスモジュールを使いこなすためには、モデル化という概念をおさえておくと分かりやすい。しかしいきなりモデル化といわれても何のことかわからないと思うので、順を追って説明していく。まずプログラミングにおけるモデル化の話をする前に、モデルという…

VBA オブジェクト変数の宣言時にNewすると何がまずいのか

オブジェクト変数の宣言と使用については、以下の2パターンが存在する。■パターン1 宣言と同時にNewしてしまう方法 Dim C As New Collection■パターン2 宣言とオブジェクトのSetを分ける方法 Dim C As Collection Set C = New Collection私はこれまで大体の…

VBA Withを使ったコードをWith無しのコードに変換するマクロ ~ スタックの応用 ~

今回は、Withを使ったコードをWith無しのコードに変換するマクロを作ってみる。 何の役に立つんだというツッコミはなしで。目次 マクロの概要 実現方法を検討する 入れ子になったWithの扱い方 VBAでスタックを実装 スタックを使ったWithを外すコード 課題 マ…

VBA インターフェースを活用してコードの抽象度を上げるテクニック

以下のような注文票にマクロでデータを記入することを考えてみる。 人間が記入する場合は、次のように考えながら記入していくだろう。 「注文票の、ひとつ目の商品名は"パソコン"で、単価は10万円、個数は40個。二つ目の商品は"複合機"で、単価は150万円、個…

VBA フォームのコントロールイベントを共通化する

こちらの記事を読んだところ、同じようなChangeイベントプロシージャがコントロールの数だけできてしまうことにお悩みの様子。 kantoku.hatenablog.com面白そうなので色々調べながらやってみた。参考にしたページはこちら 3.4.3 共通イベント処理クラス - EX…

VBA クラスモジュールのデフォルトプロパティをマクロで設定する

以前、クラスモジュールをエクスポートしてテキストエディタで編集することでデフォルトプロパティを変更できるという記事を書いた thom.hateblo.jpしかし、わざわざエクスポートして書き換えるというのも面倒くさい。VBAはテキストも扱えるので、どうせなら…

VBA クラスモジュールを使用し、シェイプ同士が重なっているかどうかを判定する方法

今回の記事では、VBAでシート上のシェイプをすべて走査してどのシェイプと重なっているかを表示させるところまでを紹介する。 具体的なグループ化については今のところまだ完成していないので取り扱わないが、今回の記事がスラスラ理解できるレベルの方なら…

VBA クラスモジュールの使いどころ ~ Excelの一覧表とクラスモジュールは相性がいい

VBAには標準モジュールのほかに、クラスモジュールというものがある。 クラスモジュールについて調べようと思っても日本の書籍ではあまりきちんと解説されておらず、主にネットから情報を得ることになる。 使い方についてはまだ情報が存在するのだが、「使い…

VBA Newキーワードの使い方は2種類だけではない。 ~ With New Objectという使い方。

オブジェクトを扱うときに登場するNewキーワード。おそらく以下の2種類の使い方が一般的かと思う。まずは、変数へ新規インスタンスをセットする際に使うNew。 (以下のObjectには任意のオブジェクトが入る。例:Collection) Dim obj As Object Set obj = New O…

VBA Excelで作られたマニュアルをWordに変換する補助ツールを作成

Excelで作成されたマニュアルをWord化したい場合がある。 一旦PDFにしてから読み込んでくる手もあるが、あとで色々と機能を付け足すためにもマクロでやってみたいと思う。Excelマニュアルは、以下のように文字と画像が交互に配置されているものを想定してい…

VBA クラスモジュールを使って2つの表を比較するコードをスッキリ記述する。

Excelで2つの表を比較したいというケースがよくある。 たとえば、以下のように表Aと表Bがあり、それぞれ片側にしかないIDを抽出したい。 このとき、IDは重複がなく、昇順に並んでいるものとする。VLookupでやれば簡単だが、表の規模が大きく、頻繁に行う場合…

VBA クラスライブラリをアドインにまとめてメインマクロをスッキリさせる方法

今回は公開されている既存のライブラリ「Ariawase」を使って解説したいと思う。Ariawaseは次のページから入手できる。github.comページを開くと右下のほうにZipでダウンロードできるボタンがあるのでこちらを入手する。 zipを解凍するとbuild.batファイルが…

VBA クラスモジュールを気軽に使う その3

今取り組み中の以下の書籍で、油分け算というパズルが登場する。Excel VBAでパズルを解こう作者: 坪崎誠司出版社/メーカー: 株式会社プレスティージ発売日: 2010/07/06メディア: 単行本(ソフトカバー)この商品を含むブログを見る3リットル、5リットル、8リ…

VBA クラスモジュールを気軽に使う その2

その1ではOperatableNumberというオブジェクトを作成した。 thom.hateblo.jp似たような内容になるが、今回はOperatableStringを作成してみようと思う。 ※なお、サンプルなので変数の型などは一部省略している。クラスモジュールを追加し、以下のコードを追加…

VBA 自作のCollectionクラスをFor Eachでまわす裏ワザ

以前以下の記事で書いたものは、デフォルトプロパティの設定だった。 thom.hateblo.jpしかしその後、海外のサイトでさらにすごいテクニックを発見。 http://www.papwalker.com/ref101/ccol.htmlかいつまんで説明する。まずクラスモジュールを作成し任意のク…

VBA クラスモジュールを気軽に使う その1

先日買った以下の書籍に取り組みはじめた。アルゴリズム大事典 (I・O BOOKS)作者: 橋本英美出版社/メーカー: 工学社発売日: 2013/11/01メディア: 単行本この商品を含むブログ (3件) を見る序盤に足し算だけで掛け算をするという問題があるが、普通に書くとこ…

VBA Classモジュールを活用する

今回はベテランVBA使いの方にもあまり活用されていないと思われるClassモジュールの活用について。現在発売されている書籍でもClassモジュールについての説明がほとんど無く、パーフェクト○○とか、完全○○とか書かれた網羅系の書籍をあたると一番最後の方に申…

Excel VBAでIEを操作するクラスを作成中

ExcelでのIE操作クラスを作成中。 といってもただのIEラッパーで、読み込み完了処理を隠蔽してVBA初心者にも使いやすくするのが主目的である。私がVBAでIE操作を始めた頃はインターネット上で調べるしかなくて、まずいサイトにあたるとコードが不安定だった…

VBAの自作クラスでデフォルトプロパティを設定する方法

海外のサイトで、自作のクラスにデフォルトプロパティを設定する方法を発見した。 (リンク先は英語) http://www.cpearson.com/excel/DefaultMember.aspxデフォルトプロパティとは、クラス名だけで参照できるデフォルトの値のことである。 たとえば、ExcelのR…

VBAでインターフェースを使って引数付きのコンストラクタを実現する。

タイトルにコンストラクタとあるが、正確にはコンストラクタもどきである。先日VBAのAriawaseライブラリのCore.basに書かれたInitのコードに感銘を受けた話を書いた。 ただ、私の個人的な好みとしては、外部DLLの参照よりはVBAの基本機能だけで解決してしま…

VBAでインターフェースを使う

VBAはクラスを継承することができないが、インターフェースを作成することでポリモーフィズムを実現させることができる。元ネタはこちらのサイト 4.5 インターフェース継承による開発 - EXCEL-VBA開発講座 VBAに関しては入門者向けの情報が多いなか、高度な…

VBAでClass_Initializeに引数を渡したい。

はじめに断っておくと、実際にVBAのコンストラクタに引数を渡す裏技は無い。 タイトル詐欺で申し訳ない。 2015/2/15追記 これより後の記事で、もう少しスマートなやり方を発見している。(以下リンク) VBAでインターフェースを使って引数付きのコンストラクタ…

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