LoginSignup
25
33

More than 5 years have passed since last update.

VBAのお勉強

Last updated at Posted at 2014-12-17

私的メモがき程度だけど手をつけ始めたので、一応メモ。

モジュール

 エクセル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

クラスモジュールで整理するのは今後にして、
今回はユーザーフォーム(クラスモジュールに含まれる)のクリックイベントから処理を実行
とかで良いかな
どうかなクラスモジュールで作ってユーザーフォームから呼び出す?いやいいや

25
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
33