第3話  とにかく何か作ってみよう     
VBAとは具体的にどんなものなのか、とにかく何かを作ってその内容を理解してみようと思います。


セルに値を入れる
プロシージャに次のコードを記述しよう。

Sub セルに値を入れる()

   Range("A1").Value=1
   Range("A2").Value=2

End Sub
 
このマクロを実行すると、A1に1、A2に2の数字が入ります。
でも、このマクロは限定的で、これしか出来ません。また、「マクロの記録」処理でも可能です。
次に、これを発展させて、好きなセル座標に好きな数字を入力出来るようにするには、どうすればよいのでしょうか。
この処理こそ、VBAによるマクロの作成です。



インプットボックス

プロシージャに次のコードを記述しよう。
Sub  インプットボックス()
Dim x As String
Dim y As Variant
x = Application.InputBox("座標を入力", "座標指定", "座標を入力", 100, 100, HelpFile, abc, 2)
y = Application.InputBox(prompt:="数値を入力", Title:="数値入力", Type:=1)
Range(x) = y

End Sub
Application:エクセルのことです
xの式:フル入力の場合。(HelpFile・abcは、仮入力)
フル入力の場合は引数の順番を間違えるとエラーになります。
yの式:必要な引数だけ入力した場合
「:=」:必要な引数に情報を入力する場合に使用します。順番は関係ありません。
マクロのコード記述は、基本的には1行(改行なし)で書きます。どうしても長くなる場合は、_後に改行してください。
例えば、
Worksheets("Sheet1").Activate
Set myCell = Application.InputBox( _
    prompt:="セルを選択してください。", Type:=8)
のようにしてください。

マクロを実行すると




この結果、A3の座標に12345の数字が入力されます。
注意:×・キャンセル、未入力、存在しないセル座標を入力した時や数字以外のものの入力等では、エラーになることがあります。エラーを解決する方法については、後ほど記述しますが、もっとよい方法があればHELPしてほしいと考えています。



VBAのHELPでInputBoxを引くと次の内容が表示されます。
InputBox メソッド
                 
ユーザー入力用のダイアログ ボックスを表示します。表示したダイアログ ボックスに入力された情報を返します。

構文

expression.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)

expression   必ず指定します。対象となる Application オブジェクトを表すオブジェクト式を指定します。

Prompt   必ず指定します。文字列型 (String) の値を使用します。ダイアログ ボックスに表示するメッセージを指定します。この引数には、文字列、数値、日付、またはブール値を指定できます。(Excel では表示される前に、自動的に値を文字列型 (String) に強制します。)

Title   省略可能です。バリアント型 (Variant) の値を使用します。ダイアログ ボックスのタイトルを指定します。この引数を省略すると、既定値の "入力" がタイトル バーに表示されます。

Default   省略可能です。バリアント型 (Variant) の値を使用します。ダイアログ ボックス内のテキスト ボックスに表示する初期値を指定します。この引数を省略すると、テキスト ボックスの初期状態には何も表示されません。この値には、Range オブジェクトを指定することもできます。例:Default:=Range("a2:c4")と記述すれば、A2:C4の範囲への入力可能となります。

Left   省略可能です。バリアント型 (Variant) の値を使用します。画面の左上隅を基準として、ダイアログ ボックスの X 座標をポイント単位で指定します。位置指定です。

Top   省略可能です。バリアント型 (Variant) の値を使用します。画面の左上隅を基準として、ダイアログ ボックスの Y 座標をポイント単位で指定します。位置指定です。

HelpFile   省略可能です。バリアント型 (Variant) の値を使用します。対象ダイアログ ボックスで使うヘルプ ファイルの名前を指定します。引数 HelpFile および 引数 HelpContextID がともに指定されていれば、ダイアログ ボックス内に [ヘルプ] ボタンが表示されます。

HelpContextId   省略可能です。バリアント型 (Variant) の値を使用します。引数 HelpFile で指定したヘルプ ファイル内のヘルプ トピックのコンテキスト ID 番号を指定します。

Type   省略可能です。バリアント型 (Variant) の値を使用します。返されるデータの型を指定します。この引数を省略すると、ダイアログ ボックスは文字列 (テキスト) を返します。次に示す 1 つまたは複数の値の合計値を引数に指定できます。

意味
0 数式
1 数値
2 文字列 (テキスト)
4 論理値 (True または False)
8 セル参照 (Range オブジェクト)
16 #N/A などのエラー値
64 数値配列

引数 Type では、上の表の値を加算して、複数のデータ型を指定することができます。たとえば、文字列または数値が入力できるダイアログ ボックスを作成するときは、引数 Type の値を 1 + 2 に設定します。例:Type:=1+2 と記述すれば、数値と文字列の入力が可能となります。

解説

InputBox メソッドは、マクロに情報を与えるためのシンプルなダイアログ ボックスを表示します。このメソッドによるダイアログ ボックスには、[OK] ボタンと [キャンセル] ボタンが表示されます。[OK] ボタンをクリックすると、ダイアログ ボックスに入力した値が返されます。[キャンセル] ボタンをクリックすると、False が返されます。

引数 Type に 0 を指定すると、=2*PI()/360 のような数式が、文字列として返されます。数式内に参照があれば、それらの参照は A1 形式の参照として返されます。参照形式を変換するには、ConvertFormula メソッドを使います。

引数 Type に 8 を指定すると、Range オブジェクトが返されます。返された Range オブジェクトを別の Range オブジェクトに代入するには、次のように Set ステートメントを使う必要があります。

Set myRange = Application.InputBox(prompt := "Sample", type := 8)

InputBox メソッドを使ってユーザーに数式を問い合わせる場合は、入力する数式はユーザーの言語であるため、その数式を Range オブジェクトに割り当てるときにFormulaLocal プロパティを使う必要があります。

InputBox メソッドは、InputBox 関数とは機能が異なり、有効なユーザー入力のみを選択したり、Excel のオブジェクト、エラー値、数式を扱ったりすることができます。InputBox メソッドを呼び出すには、Application.InputBox のように、対象となるオブジェクトを指定します。対象オブジェクトを省略すると、InputBox 関数が呼び出されてしまうので注意してください。



先ほどのインプットボックスのマクロでエラーが出ないようにするには
次のコードをプロシージャに記述(コピー、貼り付けでOK)し、どんな場合にエラーが出るかチェックしましょう。
Sub インプットボックス()
Dim x As String
Dim y As Variant
x = Application.InputBox(prompt:="座標を入力", Title:="座標指定")
y = Application.InputBox(prompt:="数値を入力", Title:="数値入力")
Range(x) = y

End Sub

エラーの個所は、
◆×・キャンセル・何も入力しないとき
存在しないセル座標を入力したとき
◆数字以外のものを入力したとき

に発生します。

解決方法


×・キャンセル・何も入力しないときの方法
  • ×・キャンセルの場合には、Falseを返してきます。また、未入力場合は、空白を返してきます。
    これらの場合を、If文で対処します。コードの記述内容は、次のようになります。
  •    If x = "" Then GoTo TheRoutine
       If x = "False" Then GoTo TheRoutine
               ・
               ・
       TheRoutine:
  
  これで、対応できたように思えますが、存在しないセルの座標を入力すると、エラーになります。そこで、これを解決するために、次の方法をします。

存在しないセル座標を入力したときの方法
  • type:=8 を指定し、addressプロパティーを使用します。
  • x = Application.InputBox(prompt:="座標を入力", Title:="座標指定", Type:=8).Address

これで、セルの座標以外は入力できなくまります。
ところが、今度は×・キャンセルを押すとエラーになります。これには、ほとほと困りました。そこで、研究に研究を重ねて(ちょっと大げさか)
究極の方法がわかりました(実は教えてもらった)。
その方法とは、実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続するという「エラー何のその方法(on error ステートメント)」です。
プログラムを組む場合、エラーは発生させないのが一番なので、いろいろと試みましたが、この方法でしか解決できませんでした。どなたか、この方法以外で解決する方法がありましたら、ぜひご伝授のほど宜しくお願いします。メールはこちらです。
type:=8 、addressでエラーになった場合、xの値は現在初状態の""になっているので、If x = "" Then GoTo TheRoutineで終了させます。
したがって、「If x = "" Then GoTo TheRoutine」を有効に機能させるために、直前で受け取り項目を初期化する必要があります。( x = ""をInputBoxの前におきます)



Address プロパティ
対象となるRangeオブジェクトに対する範囲参照(セルアドレス)を取得します。

使用例
Sub addressプロパティ()
'Address プロパティの使用例
'次の使用例は、シート 1 の同じセル アドレスを 4 つの異なる方法で表します。コード中のコメントは、メッセージで表示されるアドレスを示しています。

Set mc = Worksheets("Sheet1").Cells(1, 1)
MsgBox mc.Address() '$A$1
MsgBox mc.Address(RowAbsolute:=False) '$A1
MsgBox mc.Address(ReferenceStyle:=xlR1C1) 'R1C1
MsgBox mc.Address(ReferenceStyle:=xlR1C1, _
RowAbsolute:=False, _
ColumnAbsolute:=False, _
RelativeTo:=Worksheets(1).Cells(3, 3)) 'R[-2]C[-2]

End Sub




数字入力の場所で数字以外のものを入力したときの方法
  • type:=1 を指定します。
  • y = Application.InputBox(prompt:="数値を入力", Title:="数値入力", Type:=1)
これで、数字以外は入力することが出来なくなります。後は、×・キャンセルへの対応をすればよいのです。これについては、IF文で処理します。

   If y = "False" Then GoTo TheRoutine


これらのことをまとめると、次のようになります。
Sub test()

Dim x As String
Dim y As Variant

On Error Resume Next
x = ""
x = Application.InputBox(prompt:="座標を入力", Title:="座標指定", Type:=8).Address
If x = "" Then GoTo TheRoutine
' If x = "False" Then GoTo TheRoutine
y = Application.InputBox(prompt:="数値を入力", Title:="数値入力", Type:=1)
If y = "False" Then GoTo TheRoutine

Range(x) = y
MsgBox x & "座標の値は" & y
TheRoutine:
End Sub




Ifステートメント

上記のプログラムで、新たにIf、Error、MsgBox、Dim が出てきました。まず、IFステートメントについて書きます。

基本構文(1)
  If condition Then        conditionとは、条件式のことで、もしコンディションのとき、「実行1」をする
    「実行1」
  Else                 コンディションのときでない場合は「実行2」をする
    「実行2」
  End If               Ifの終わり


基本構文(2)
  If condition Then        「実行2」がない場合です。
    「実行1」
  End If


基本構文(3)
  If condition1 Then
    「実行1」
  ElseIf condition2 Then     ElseIf は、condition1でなくて、condition2の場合は「実行2」をするという意味
    「実行2」             以下、同様
  ElseIf condition3 Then
    「実行3」
  ElseIf condition4 Then
    「実行4」
       ・
       ・
       ・
       ・
  Else
    「実行n」
  End If




MsgBox 関数
この関数を使用すれば、メッセージを出すことが出来ます。対話型にするのにとっても役に立つ関数です。
メッセージボックスの種類を見てみます。ヘルプでMsgBoxを調べると、次のヘルプが出ます。具体例を加えて見やすくしたいと思います。

整数型 (Integer) の値を返します。ダイアログ ボックスにメッセージを表示し、ボタンがクリックされるのを待って、どのボタンがクリックされたのかを示す値を返します。

構文

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

MsgBox 関数の構文は、次の名前付き引数から構成されます。

指定項目 内容
prompt 必ず指定します。ダイアログ ボックス内にメッセージとして表示する文字列を示す文字列式を指定します。名前付き引数 prompt に指定できる最大文字数は、1 バイト文字で約 1,024 文字です。ただし、使う文字の文字幅に依存します。名前付き引数 prompt に複数行を指定する場合は、キャリッジ リターン (Chr(13))、ライン フィード (Chr(10))、またはキャリッジ リターンとライン フィードの組み合わせ (Chr(13) & Chr(10)) を改行する位置に挿入し、行を区切ってください。3つのパターンどれでも改行されます。
Sub 改行するには()
 Dim x As String
 Dim msg As String, DM As String
  DM = Chr(10) & Chr(13)
   msg = "このように、" & DM
   msg = msg & "行を改行したい場合は、" & DM
   msg = msg & "Chr(10) & Chr(13)を使用します。" & DM
   msg = msg & "ちょっとしたテクニックですね。"
 x = MsgBox(msg, Buttons:=vbYesNo)
End Sub
buttons 省略可能です。表示されるボタンの種類と個数、使用するアイコンのスタイル、標準ボタン、メッセージ ボックスがモーダルかどうかなどを表す値の合計値を示す数式を指定します。省略すると、名前付き引数 buttons の既定値 0 になります。
title 省略可能です。ダイアログ ボックスのタイトル バーに表示する文字列を示す文字列式を指定します。名前付き引数 title を省略すると、タイトル バーにはアプリケーション名が表示されます。
helpfile 省略可能です。ダイアログ ボックスに状況依存のヘルプを設定するために、使用するヘルプ ファイルの名前を示す文字列式を指定します。この引数は、表示するダイアログ ボックスの説明をヘルプを使って表示するときに指定します。名前付き引数 helpfile を指定した場合は、引数 context も指定する必要があります。
context 省略可能です。ヘルプ トピックに指定したコンテキスト番号を表す数式を指定します。名前付き引数 context を指定した場合は、引数 helpfile も指定する必要があります。




設定値

名前付き引数buttons には、次の値のうち、該当する値の合計値を指定します。

定数 内容
vbOKOnly 0 [OK] ボタンのみを表示します。
vbOKCancel 1 [OK] ボタンと [キャンセル] ボタンを表示します。
vbAbortRetryIgnore 2 [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
vbYesNoCancel 3 [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
vbYesNo 4 [はい] ボタンと [いいえ] ボタンを表示します。
vbRetryCancel 5 [再試行] ボタンと [キャンセル] ボタンを表示します。

vbCritical 16 警告メッセージ アイコンを表示します。
vbQuestion 32 問い合わせメッセージ アイコンを表示します。
vbExclamation 48 注意メッセージ アイコンを表示します。
vbInformation 64 情報メッセージ アイコンを表示します。

vbDefaultButton1 0 第 1 ボタンを標準ボタンにします。
vbDefaultButton2 256 第 2 ボタンを標準ボタンにします。
vbDefaultButton3 512 第 3 ボタンを標準ボタンにします。
vbDefaultButton4 768 第 4 ボタンを標準ボタンにします。

vbApplicationModal 0 アプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
vbSystemModal 4096 システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。

vbMsgBoxHelpButton 16384 ヘルプ ボタンを追加します。
VbMsgBoxSetForeground 65536 最前面のウィンドウとして表示します。
vbMsgBoxRight 524288 テキストを右寄せで表示します。
vbMsgBoxRtlReading 1048576 テキストを、右から左の方向で表示します。

最初のグループに属する値 (0 〜 5) は、ダイアログ ボックスに表示されるボタンの種類と個数を指定します。次のグループに属する値 (16、32、48、64) は、アイコンの種類を指定します。第 3 のグループに属する値 (0、256、512) は、どのボタンが標準ボタンになるかを指定します。最後のグループに属する値 (0、4096) は、メッセージ ボックスがモーダルかどうかを指定します。名前付き引数 buttons の値を設定するには、各グループから値を 1 つずつ選択して加算した合計値を指定します。





ボタンの種類を複数指定することも出来ます。ただし、ライン(横線)で区切られたグループ内で1つずつしか指定は出来ません。
例えば、「vbOKCancel + vbQuestion」とすれば次のようになります。
   Sub MsgBoxの種類()
MsgBox "このようになります", Buttons:=vbOKCancel + vbQuestion
End Sub




以下に示した定数は Visual Basic for Applications で設定されています。したがって、これらの定数はコード内の任意の場所で実際の値を記述する代わりに使用できます。

Sub 定数について()
 x = MsgBox("どちらか押してください。", Buttons:=vbYesNo)
  If x = vbYes Then
    MsgBox "「はい」が選択されました"
  ElseIf x = vbNo Then
    MsgBox "「いいえ」が選択されました"
  Else
  End If
 End Sub


戻り値

定数 説明
vbOK 1 [OK]
vbCancel 2 [キャンセル]
vbAbort 3 [中止]
vbRetry 4 [再試行]
vbIgnore 5 [無視]
vbYes 6 [はい]
vbNo 7 [いいえ]




ヘルプの説明ばっかりで、具体的な使用方法の説明を忘れてました。次に書きます。

  Sub 例()
   MsgBox "シンプル版"
  End Sub

  OKをクリックすると、メッセージボックスは閉じます


  Sub 例()
   x = MsgBox("はい、いいえどちらか押してください" _
   , vbYesNo, "はい、いいえ版")
  End Sub

  はいをクリックするとXに定数「vbYes」が、いいえをクリックすると
  Xに定数「vbNo」が格納されます。 
  このXの値を利用して、プログラムを分岐させていきます。



  Sub 例()
   MsgBox """はい"""
  End Sub

  "はい" と表示させたいときは、このように書きます。




エラー何のその方法(on error ステートメント)

エラーが発生してもお構いなしで実行してくれるステートメントがあります。とっても便利なので、その使い方をマスターしましょう。


その1  On Error GoTo line

エラーが発生したら、line: の後の命令を実行します。
Sub エラー何のその()
x = Application.InputBox(prompt:="座標を入力", Title:="座標指定")
y = Application.InputBox(prompt:="数値を入力", Title:="数値入力")
On Error GoTo line
Range(x) = y
line:
MsgBox "エラーが発生しました"
End Sub

次のようになります。





その2  On Error Resume Next 

実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行します。
Sub エラー何のその()
x = Application.InputBox(prompt:="座標を入力", Title:="座標指定")
y = Application.InputBox(prompt:="数値を入力", Title:="数値入力")
On Error Resume Next
MsgBox "お構いなしに実行しています"
Range(x) = y
End Sub


その3  On Error GoTo 0

現在のプロシージャに含まれる使用可能なエラー処理ルーチンを無効にします。
複数のエラーが発生することがわかっている場合に、あるエラーについては無視する処理をし、他のエラーについては無視しない処理をしたい場合などに利用します。




Dimステートメント

宣言の方法
  Dim x As ○○   ○○は、下記のデータ型が入ります。
  Dim x          型を指定しない場合は、バリアント型のデータ型になります。
  Dim x As ○○ , y As △△ , z As □□
  このように、「,」(カンマ)で区切ればいくつでも変数を並べて記載できます。

特徴
・変数の宣言をします。
・プロシージャ内で宣言した変数は、そのプロシージャ内で使用できます。プロシージャが終了すると値はクリアされます。
・変数を宣言しておくと、間違った式が実行されるのを防ぎます。@
・第三者がプログラムを見る場合、変数にはどんな文字が使用されているのか、わかりやすくなります。
・プロシージャの冒頭に、使用する変数の名前と型をまとめて宣言しておきます。ただ、どんな名前の変数を使用するかははじめから決めているわけではありませんので、プロシージャを作っていく際に追加していくことになります。

変数名はどのように決めるのか
変数名は、一般的には英語の表現を使います。長くなるようであれば、短縮します。また、最初の1文字を大文字にします。例えば、TheDate・MyPath・CheckItなどなどです。これは、プログラムが長くなると変数から意味を取る必要が生じ、a,b,cとしてしまうとどれが何の変数なのかわからなくなってしまうからです。しかしながら、VBAをはじめたばかりの方には、慣れないとどれが変数でどれがVBAの言葉なのか見分けがつきにくいのも事実です。当HPでは、あえて明らかに変数であるということをわかりやすくするために、できるだけ、a,b,cを使用しますので、ご了解ください。

@の例題
数字(整数)を入力してもエラーにはなりませんが、文字等を入れるとエラーになります。
Sub 変数の宣言()
Dim x As Integer
x = Application.InputBox( _
prompt:="文字を入力するとエラーになります")
MsgBox (x)
End Sub







変数のデータ型を示す値(タイプ)
データ型

記憶領域のサイズ 範囲
バイト型 (Byte)

1 バイト 0 〜 255
ブール型 (Boolean)

2 バイト 真 (True) または偽 (False)
整数型 (Integer)

2 バイト -32,768 〜 32,767
長整数型 (Long)

4 バイト -2,147,483,648 〜 2,147,483,647
単精度浮動小数点数型 (Single)

4 バイト -3.402823E38 〜 -1.401298E-45 (負の値)。
1.401298E-45 〜 3.402823E38 (正の値)。
倍精度浮動小数点数型 (Double)



8 バイト -1.79769313486231E308 〜 -4.94065645841247E-324 (負の値)。
4.94065645841247E-324 〜 1.79769313486232E308 (正の値)。
通貨型 (Currency)

8 バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
10 進型 (Decimal)










14 バイト 小数部分を持たない数値の場合、
-79,228,162,514,264,337,593,543,950,335 〜 79,228,162,514,264,337,593,543,950,335 の範囲の値をとります。
小数点以下 28 桁の数値の場合、
-7.9228162514264337593543950335 〜 7.9228162514264337593543950335 の範囲の値をとります。
絶対値の最小値は 0 を除いた場合、
0.0000000000000000000000000001 です。
日付型 (Date)

8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日
オブジェクト型 (Object)

4 バイト オブジェクトを参照するデータ型
文字列型 (String) (可変長)

10 バイト + 文字列の長さ 0 〜 2GB
文字列型 (固定長)

文字列の長さ 1 〜 2GB
バリアント型 (Variant) (数値)

16 バイト 倍精度浮動小数点数型の範囲と同じ。
バリアント型 (Variant) (文字列)

22 バイト + 文字列の長さ 可変長の文字列型の範囲と同じ。
ユーザー定義型

要素に依存 それぞれの要素の範囲はそのデータ型の範囲と同じ。