第3話 とにかく何か作ってみよう |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VBAとは具体的にどんなものなのか、とにかく何かを作ってその内容を理解してみようと思います。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
セルに値を入れる | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
プロシージャに次のコードを記述しよう。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
このマクロを実行すると、A1に1、A2に2の数字が入ります。 でも、このマクロは限定的で、これしか出来ません。また、「マクロの記録」処理でも可能です。 次に、これを発展させて、好きなセル座標に好きな数字を入力出来るようにするには、どうすればよいのでしょうか。 この処理こそ、VBAによるマクロの作成です。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
インプットボックス |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
プロシージャに次のコードを記述しよう。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
マクロのコード記述は、基本的には1行(改行なし)で書きます。どうしても長くなる場合は、_後に改行してください。 例えば、 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
マクロを実行すると | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
この結果、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 つまたは複数の値の合計値を引数に指定できます。
引数 Type では、上の表の値を加算して、複数のデータ型を指定することができます。たとえば、文字列または数値が入力できるダイアログ ボックスを作成するときは、引数 Type の値を 1 + 2 に設定します。例:Type:=1+2 と記述すれば、数値と文字列の入力が可能となります。 解説 InputBox メソッドは、マクロに情報を与えるためのシンプルなダイアログ ボックスを表示します。このメソッドによるダイアログ ボックスには、[OK] ボタンと [キャンセル] ボタンが表示されます。[OK] ボタンをクリックすると、ダイアログ ボックスに入力した値が返されます。[キャンセル] ボタンをクリックすると、False が返されます。 引数 Type に 0 を指定すると、=2*PI()/360 のような数式が、文字列として返されます。数式内に参照があれば、それらの参照は A1 形式の参照として返されます。参照形式を変換するには、ConvertFormula メソッドを使います。 引数 Type に 8 を指定すると、Range オブジェクトが返されます。返された Range オブジェクトを別の Range オブジェクトに代入するには、次のように Set ステートメントを使う必要があります。
InputBox メソッドを使ってユーザーに数式を問い合わせる場合は、入力する数式はユーザーの言語であるため、その数式を Range オブジェクトに割り当てるときにFormulaLocal プロパティを使う必要があります。 InputBox メソッドは、InputBox 関数とは機能が異なり、有効なユーザー入力のみを選択したり、Excel
のオブジェクト、エラー値、数式を扱ったりすることができます。InputBox メソッドを呼び出すには、 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
先ほどのインプットボックスのマクロでエラーが出ないようにするには | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
次のコードをプロシージャに記述(コピー、貼り付けでOK)し、どんな場合にエラーが出るかチェックしましょう。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
エラーの個所は、 ◆×・キャンセル・何も入力しないとき ◆存在しないセル座標を入力したとき ◆数字以外のものを入力したとき に発生します。 解決方法 ×・キャンセル・何も入力しないときの方法
・ TheRoutine: これで、対応できたように思えますが、存在しないセルの座標を入力すると、エラーになります。そこで、これを解決するために、次の方法をします。 存在しないセル座標を入力したときの方法
これで、セルの座標以外は入力できなくまります。 ところが、今度は×・キャンセルを押すとエラーになります。これには、ほとほと困りました。そこで、研究に研究を重ねて(ちょっと大げさか) 究極の方法がわかりました(実は教えてもらった)。 その方法とは、実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行を継続するという「エラー何のその方法(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 数字入力の場所で数字以外のものを入力したときの方法
If y = "False" Then GoTo TheRoutine |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
これらのことをまとめると、次のようになります。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 関数の構文は、次の名前付き引数から構成されます。
設定値 名前付き引数buttons には、次の値のうち、該当する値の合計値を指定します。
最初のグループに属する値 (0 〜 5) は、ダイアログ ボックスに表示されるボタンの種類と個数を指定します。次のグループに属する値 (16、32、48、64) は、アイコンの種類を指定します。第 3 のグループに属する値 (0、256、512) は、どのボタンが標準ボタンになるかを指定します。最後のグループに属する値 (0、4096) は、メッセージ ボックスがモーダルかどうかを指定します。名前付き引数 buttons の値を設定するには、各グループから値を 1 つずつ選択して加算した合計値を指定します。 ボタンの種類を複数指定することも出来ます。ただし、ライン(横線)で区切られたグループ内で1つずつしか指定は出来ません。 例えば、「vbOKCancel + vbQuestion」とすれば次のようになります。
以下に示した定数は Visual Basic for Applications で設定されています。したがって、これらの定数はコード内の任意の場所で実際の値を記述する代わりに使用できます。 Sub 定数について()x = MsgBox("どちらか押してください。", Buttons:=vbYesNo) If x = vbYes Then MsgBox "「はい」が選択されました" ElseIf x = vbNo Then MsgBox "「いいえ」が選択されました" Else End If End Sub 戻り値
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ヘルプの説明ばっかりで、具体的な使用方法の説明を忘れてました。次に書きます。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
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: の後の命令を実行します。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
その2 On Error Resume Next 実行時エラーが発生してもプログラムを中断せず、エラーが発生したステートメントの次のステートメントから実行します。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
その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を使用しますので、ご了解ください。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@の例題 数字(整数)を入力してもエラーにはなりませんが、文字等を入れるとエラーになります。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
変数のデータ型を示す値(タイプ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() |