※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Visual Basic Editor(VBE)の起動方法

  • Alt+F11
  • ワークシートのタブを右クリックメニューからコードの表示
  • ツールメニューのマクロからVisual Basic Editer
  • 開発タブでVisual Basicボタン、またはコードの表示
開発タブ表示方法 2007
OfficeボタンのExcelオプションの基本設定の開発タブをリボンに表示する
開発タブ表示方法 2010
Officeボタンのオプションのリボンのユーザー設定で開発を選択する

VBE内のウィンドウ

プロジェクトエクスプローラー
プロジェクトを管理するためのウィンドウ。モジュールの追加や削除などの基本操作を行うことができる
コードウィンドウ
実際のコードの作成や編集を行うことができるウィンドウ
プロパティウィンドウ
オブジェクトのプロパティ管理を行うことができるウィンドウ
イミディエイトウィンドウ
DebugオブジェクトのPrintメソッドを使った出力や、直接式やプロシージャーを入力して値を表示するなどデバッグで利用できるウィンドウ
ローカルウィンドウ
あらかじめブレークポイントを設定しておけばその時点のモジュールの変数などの状態が一覧で見ることができるウィンドウ
ウォッチウィンド
あらかじめ右クリックメニューからウォッチ式の追加をしておけば、その式(変数など)の値を表示したり、値が変化したら中止するなどの操作ができるウィンドウ。もちろんブレークポイントと組み合わせて利用することもできる

VBEの基本操作

コードの実行

  • ツールメニューから実行
  • ツールバーの実行アイコン
  • F5

ブレークポイント

コードウィンドウでブレークポイントを挿入したい行の左端をクリックし設定する。複数設定可能。
ブレークした場合は、再度実行することで続きを実行できる

コメント

  • 「'」シングルクォートを先頭に追加
  • ツールアイコンの編集内のコメントをクリック

ステートメント

  • 複数のステートメントを一行に書く場合はコロンでつなぐ
A=1 : B=2 : C=3
  • 一つのステートメントを複数行に書く場合はアンダーバーを挿入する
MsgBox("i=" + i + ",j=" + j)

MsgBox("i=" + i _
    + ",j=" + j)

モジュールの種類

自分では勝手に以下のように考えてます
標準モジュール
プロシージャのみで構成される。そのためオブジェクトの作成はできない
クラスモジュール
プロパティ、メソッドを持つクラスを作成できる
フォームモジュール
画面系に特化したクラスモジュール

モジュールの再利用

エクスポート
プロジェクトエクスプローラーにて対象モジュールを右クリックしファイルへエクスポート
インポート
プロジェクトエクスプローラーでプロジェクトを右クリックしてファイルをインポート

プロシージャ

プロシージャの種類

Subプロシージャ
引数を受け取るが戻り値は返さない
Functionプロシージャ
引数を受け取り戻り値を返す。ワークシート関数として利用することができる

プロシージャの定義

  • コードウィンドウに手で記入する
  • ツールバーの挿入からプロシージャから作成する

サンプル
Sub Test()
   num = 1
   Call SubTest(num)
   
   num = FuncTest(num)
   MsgBox CStr(num)
End Sub

Sub SubTest(ByVal num As Integer)
   MsgBox CStr(num)
End Sub

Function FuncTest(ByVal num As Integer) As Integer
   num = num + 1
   FuncTest = num
End Function

引数

値渡し
ByVal 引数名 As データ型
参照渡し
ByRef 引数名 As データ型

プロシージャの呼び出し

引数を伴わないSubプロシージャ
プロシージャ名、もしくはCall プロシージャ名
引数を伴うSubプロシージャ
Call プロシージャ名(引数1, 引数2, ...)
引数を伴わないFunctionプロシージャ
変数名 = Functionプロシージャ名、もしくはCall Functionプロシージャ名
引数を伴うFunctionプロシージャ
変数名 = Functionプロシージャ名(引数1, 引数2, ...)

コードウィンドウにおけるプロシージャ定義へのカーソル移動

  • コードウィンドウの上部で目的のプロシージャを選択

変数と定数

定義方法

定数
[スコープ] Const 定数名 [As データ型] = 値
変数
[スコープ] 変数名 [As データ型]

スコープ

モジュールレベルの変数

プログラムの先頭で初期化され、以降制御がどのモジュールのどのプロシージャに移ってもプログラムの終了まで内容が保持されています。
Public
プロジェクト内の全ての場所から参照することができます
Private
モジュール内の各プロシージャからは参照できますが、プロジェクト内の他のモジュールからは参照できません。Dimと書いても同じです
Const
定数の宣言です。処理中での内容の書き換えはできません。この前に「Public」、「Private」が明示できます。明示しない場合は「Private」と同じになります

プロシージャレベルの変数

モジュールレベルで宣言されている変数と同じ名前の変数がある場合はプロシージャ内の変数が参照されます
Dim
そのモジュール内のみが適用範囲(参照できる範囲)となります。Dimで宣言する変数は、そのプロシージャが呼び出される都度初期化されます
Static
そのモジュール内のみが適用範囲となりますが、Dimで宣言する変数と異なりプロシージャ内での処理が終了し、制御が他に移ってもその変数は初期化されません。次回そのプロシージャが呼び出された時に、以前の内容が保持されたままになります
Const
定数の宣言です。処理中での内容の書き換えはできません。

データ型

データ型 サイズ 範囲 初期値 型宣言文字
バイト型(Byte) 1byte(8bit) 0~255(正の整数値) 0
ブール型(Boolean) 2byte(16bit) 真 (True)は-1、偽 (False)は0 0(False)
整数型(Integer) 2byte(16bit) -32,768 ~ 32,767(正/負の整数値) 0 %
長整数型 (Long) 4byte(32bit) -2,147,483,648 ~ 2,147,483,647(正/負の整数値) 0 &
単精度浮動小数点数型 (Single) 4byte(32bit) -3.402823E38 ~ -1.401298E-45 (負の値) 1.401298E-45 ~ 3.402823E38 (正の値) 0 !
倍精度浮動小数点数型 (Double) 8byte(64bit) -1.79769313486232E308 ~ -4.94065645841247E-324 (負の値) 4.94065645841247E-324 ~ 1.79769313486232E308 (正の値) 0 #
通貨型 (Currency) 8byte(64bit) -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 0 @
日付型 (Date) 8byte(64bit) 西暦100年1月1日0:00:00 ~ 西暦9999年12月31日23:59:59 #1899/12/30 00:00:00#
オブジェクト型 (Object) 4byte(32bit) オブジェクトを参照するアドレス Nothing
可変長文字列型 (String) 10byte + 文字列の長さ x 2byte 最大約2GB vbNullString $
固定長文字列型 (String * n) 文字列の長さ x 2byte 最大約63KB String$(n, vbNullChar) $
バリアント型 (Variant) 16byte(128bit) ~ 条件による 条件による Empty

演算子

代入演算子

= 代入演算子

サンプル
変数 = 値
ただしオブジェクト変数に代入をする場合はSetを合わせて利用する
Set オブジェクト変数 = オブジェクト


算術演算子

+ 加算
- 減算
* 乗算
/ 除算
\ 整数除算(除算時の整数部分)
mod 剰余
^ 累乗

インクリメント、デクリメント演算子

ない

連結演算子

& 連結演算子
+ 連結演算子(ただし数値として評価できる場合は算術演算子として機能)

比較演算子

= 等号
<> 不等号
未満
>= 以下
< 超過
<= 以上
Like 文字列比較(文字列の曖昧比較。パターン演算子参照)
Is 参照比較(同一オブジェクトを参照しているか比較)

==や!=がない

パターン演算子

? 任意の1文字
* 任意の数の文字
# 任意の半角数字1文字
[文字リスト] 文字リストに指定した任意の1文字
[!文字リスト] 文字リストに指定した以外の任意の1文字
#以外は全角
、半角にかかわらず1文字として扱う

bool = "ABCDE" Like "AB?DE" 'trueとなる
bool = "ABCDE" Like "A*E"   'trueとなる

論理演算子

Not 直後の式の真偽を反転

And 論理積 両方Trueの時のみTrue
Or 論理和 どちらかでもTrueならTrue
Xor 排他論理和 どちらかのみTrueならTrue 両方TrueはFalse
Eqv 論理等価 両方同じ値ならTrue
Imp 論理包含 AがTrue、BがFalseのみFalseであとはTrue

ビット演算子

And 論理積 各ビットごとに両方1の時のみ1
Or 論理和 各ビットごとにどちらかでも1なら1
Xor 排他論理和 各ビットごとにどちらかのみ1なら1 両方1は0

文字列

ダブルクォーテーションでくくる
エスケープもダブルクォーテーションなので、"を文字として認識させたい場合は""""となる

配列

配列の定義

静的配列
[スコープ] 配列名 (インデックス番号の範囲) [As データ型]
動的配列
[スコープ] 配列名() [As データ型]

静的配列サンプル
Dim A(10) As Integer
インデックス番号が0から10の11個の要素ができる

Dim A(10 To 20) As Integer
インデックス番号が10から20の11個の要素ができる

Dim A(10, 10) As Integer
多次元配列

動的配列サンプル
Dim A() As Integer
動的配列を宣言。(多次元でも同様)
ただし要素が入っていないのでこの時点で配列にアクセスすると
NullReferenceException(インデックスが範囲にはいっておりません)が
発生する

Dim A() As Integer
ReDim A(2)
動的配列を宣言。その後配列を3個の要素に拡張する。
ただし既存の要素はすべてクリアされる。

Dim A() As Integer
ReDim A(2)
ReDim Preserve A(5)
動的配列を宣言。その後配列を3個の要素に拡張する。
ただし既存の要素はすべてクリアされる。
その後6個の要素に拡張する。この時要素の値は保持されている。

配列へ値を挿入

A(0) =1

配列とループ処理

For

UBoundは添え字の最後の値を返すので注意が必要です
(添え字が0から始まっているか注意が必要です)
For i = 0 To UBound(s) - 1
   MsgBox(s(i))
Next

For Each Next

より配列との親和性が高いのでお勧めです
For内で配列の展開用に使う変数は、Variant型である必要があります
For Each Item In Items
   MsgBox(Item)
Next

構造体(ユーザー定義型)

定義方法

[スコープ] Type ユーザー定義型名
 要素名1 As データ型
 要素名2 As データ型
 ...
End Type

サンプル
Type people
 name As String
 address As String
End Type

Dim Satoh As people

条件式・ループ処理・その他

If Then ElseIf Else End If

If 条件式1 Then
    [ステートメント1]
[ElseIf 条件式2 Then]
    [ステートメント2]
[ElseIf 条件式3 Then]
    [ステートメント3]
...
[Else]
    [ステートメントn]
End If

Select Case

Cでいうbreakはいらないっぽい
Select Case i
   Case 1
       r = 3
   Case 2
       r = 6
   Case 3
       r = 8
   Case Else
       r = 10
End Select

条件が複数ある場合
Select Case i
   Case 1,2
       r = 3
   Case 3,4
       r = 6
   Case 5
       r = 8
   Case Else
       r = 10
End Select

条件が複数ある場合
Select Case i
   Case 1 To 10
       r = 3
   Case 11 To 20
       r = 6
   Case 21
       r = 8
   Case Else
       r = 10
End Select

比較演算子を用いる場合
Select Case i
   Case Is < 10
       r = 3
   Case Is < 20
       r = 6
   Case Is < 30
       r = 8
   Case Else
       r = 10
End Select

For Next

For カウンタ変数 = 開始値 To 終了値 [Step 増分値]
   [ステートメント]
   [If 条件式 Then Exit For]
Next カウンタ変数

While Wend

条件式が真の間は実行する
While 条件式
    [ステートメント]
    [条件式の値を変更するステートメント]
Wend

Do While Loop

条件式が真の間は実行する
Do While 条件式
    [ステートメント]
    [If 条件式 Then Exit Do]
    [条件式の値を変更するステートメント]
Loop

Do Until Loop

条件式が偽の間は実行する
Do Until 条件式
    [ステートメント]
    [If 条件式 Then Exit Do]
    [条件式の値を変更するステートメント]
Loop

Do Loop While

必ず一回は実行する。条件式が真の間は実行する
Do
    [ステートメント]
    [If 条件式 Then Exit Do]
    [条件式の値を変更するステートメント]
Loop While 条件式

Do Loop Until

必ず一回は実行する。条件式が偽の間は実行する
Do
    [ステートメント]
    [If 条件式 Then Exit Do]
    [条件式の値を変更するステートメント]
Loop Until 条件式

With

いくつも同様な処理を行う際に利用できる。
ユーザー定義型でも利用可能。
With [オブジェクト装飾子.]オブジェクト名
    .Name = "Satoh Daisuke"
    .Address = "Tokyo"
End With

クラス

クラス

プロパティ

メソッド

オブジェクト化

執筆中

ブックやセルの操作

執筆中