私的メモがき程度だけど手をつけ始めたので、一応メモ。
モジュール
エクセルVBAでは標準モジュール、クラスモジュール、ユーザーフォームの3種類のモジュール(※1)を作成することが出来ます。
このページではこの3つのモジュールの特徴と、どのようなときに使用するのかについて説明します。
標準モジュールの役割は、プロジェクト内のモジュールで共有して利用されるサブルーチンなどを用意することです。
フォームモジュールは、ユーザーインターフェイスのデザインとその管理がおもな役割です。実際の処理内容を標準モジュールに分けて記述することで、プロジェクトの煩雑化を抑えたり、モジュールの再利用性を高めたりします。
クラスモジュールはクラスを定義する場所です。クラスモジュール内のプロシージャを、直接 他のモジュールから呼び出したりすることはありません。
クラスモジュール
VBAのクラスモジュールを作るときの作法を思い出すための
スケルトンプログラム(といってもすこしだけ実装が入ってるが)
なので、コピペ用です。
クラスモジュールを作成したら、標準モジュールから呼べるようにするため、プロパティからオブジェクト名を設定します。(図1参照)
さすがに、ワークシート上の処理を記述したクラスモジュールをユーザーフォーム上でそのまま使うといったことはできませんが、あくまでも同じプラットフォーム上で動作することを前提にすれば、クラスモジュールの移植性は非常に高いと言えます。
たとえばユーザーフォームの初期化処理をクラスモジュールに記述しておけば、次に同じようなプログラムを作成しようとしたとき、新たにコードを書き直す必要はありません。クラスモジュールごと移植してしまえば、それでことが済むからです。
ユーザーフォーム
Excelにはワークシートがあるため、ワークシートを入力フォーム代りに使用することも可能です。しかし、本格的なVBAアプリケーションを構築する場合、ワークシートの入力では限界があります。
ユーザーフォームのもつ、膨大なイベント処理、そして各コントロールのもつ多彩なメソッドとプロパティ。Excelのユーザーフォームは、VBのフォームに引けを取らない機能と拡張性を持っています。
まずユーザーフォームを作成するところから入りましょう。
VBEのプロジェクトエクスプローラで右クリック、挿入>ユーザーフォームを選択してください。
UserForm1というフォームが挿入され、ツールボックスが表示されましたね。
ツールボックスが表示されないときは表示>ツールボックスで表示させることができます。
クラスモジュールとユーザーフォーム
一番スマートなのは、ユーザフォームに既存のインスタンスを渡すことなんですが・・・
(たとえば、ユーザフォームにPublic変数を用意しておくとか・・・)
でも、ユーザフォームのInitializeイベントで使用するなら、その手も使えないでしょうし・・・
VBAのクラスモジュール上でInterfaceを利用する
プロシージャとは
プロシージャとは、実行時に1つの単位として処理されるコードの集まりのことです。
基本手順
便利かな。サイドバーがないのでページ遷移しないといけないけど。
1.Visual Basic Editorの起動
ビジネスロジックの逆引き的なもの
リファレンス的
2013のworksheetオブジェクト
Dim LastColumn As Long, keyColumn As Long, LastRow As Long
LastColumn = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "lastc:" & LastColumn & "lastr:" & LastRow
No.8 ワークシートの最終行、最終列を取得する
With ActiveSheet.UsedRange
MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column
End With
VBA関数の一覧
EXCELマクロVBAの実用サンプル集、なるべくそのまま使えるように書いています。
セルの移動
shapeオブジェクト
画像のコピー
rangeを含むかどうか判定
EXCEL-VBA開発講座
けっこうまとまってそう
excel 2010 のマクロ
ボタンの作り方
[開発]タブは、Excel 2013・2010の場合は[Excelのオプション]ダイアログ−[リボンのユーザー設定]−[リボンのユーザー設定]欄の「開発」チェックボックスをOnにすることで、Excel 2007の場合は[Excelのオプション]ダイアログ−[基本設定]-[[開発]タブをリボンに表示する]チェックボックスをOnにすることで表示できます。
vbaメモ
コメントブロック
Debug.Print
不便さ
・バージョンの管理
・使用者へのアップデート通知とその徹底
・メンテナンスを行う人間の教育
コードの分離・アドオン
そこで考えられる案は,データは一切含まない「アプリケーションワークブック」を用意し,これにすべてのVBAコードを移管するという方式です。この場合,最初にアプリケーションワークブックを開いて機能が使える状態にし,続いてデータワークブックを開くという運用になります。アプリケーションワークブックを共有ドライブなどに置いて,すべてのユーザーが同じワークブックを開く運用とすれば,そのワークブックファイルさえ入れ替えればプログラムの更新は完了します。
バージョン管理
別解
Ariawaseを用いてファイルをテキストファイルに変更する。
https://github.com/vbaidiot/Ariawase
http://igeta-diary.blogspot.jp/2014/03/what-is-vbac.html
build.batはsrcフォルダの内容をインポートしてXLSファイルを更新する。
以下のコマンドでXLSの内容をエクスポートしてソースをテキストとして出力作成する
cscript //nologo vbac.wsf decombine
構成管理にテキストとしてソースコードを格納できることと、複数人が同時に1ファイルのソースを修正することができるのは強み。
調べてみると、同じようなことを考えている人たちがいた。
vi で書こう VBA — Text Scripting on VBA
VBAのソースファイルをバージョン管理するのを支援するvba-porter.xlaを作りました – 死ぬまでの暇潰し
これらの方法を利用してもいいのだが、 現在VBA絶賛勉強中のため、自分の学習も兼ねて、 VBAのコードをExcel内からimort/exportするコードを書いてみた。
まとめ
下記みたいな感じ?
クラスモジュール:オブジェクトの設計
標準モジュール:コントローラー・汎用関数
ユーザーフォーム:ビュー部品からのイベント制御
そういう意味では下記が印象的
方針
今回使うのはexcel 2011
クラスモジュールで整理するのは今後にして、
今回はユーザーフォーム(クラスモジュールに含まれる)のクリックイベントから処理を実行
とかで良いかな
どうかなクラスモジュールで作ってユーザーフォームから呼び出す?いやいいや