1.変数を使う
Dim varname As type
変数を使う時は、VBEのオプション画面で、変数の宣言を強制する」チェックボックスをオンにします。こうしておくと宣言しないで変数を使えなくなります。変数はかならず宣言してください。変数を宣言しないで使用すると、変数名のミスによる重大なバグを引き起こします。もし変数の宣言を強制するをオフになっていると、タイプミスした変数でもエラーにならないので、誤動作や誤計算の原因になります。
1 2 3 4 5 6 |
Sub sample1() Dim A As Long, B As Long, C As Long A = 1 B = A + 1 MsgBox A & vbCrLf & B & vbCrLf & C End Sub |
2.広域変数を使う
Dim varname As type Public varname As type
プロシージャの内部で宣言した変数は、宣言したプロシージャの中でしか使えません。別のプロシージャで利用することはできません。複数のプロシージャで変数を共有したいときは、宣言セクションで変数を宣言します。このときDimステートメントで宣言した変数は、宣言したモジュール内にあるすべてのプロシージャで使用できますが、他のモジュールでは使えません。宣言セクションでPublicステートメントで宣言した変数は、全てのモジュールの全てのプロシージャで使用可能です。
1 2 3 4 5 6 7 8 9 10 |
Dim A As Long Public B As Long Sub sample2() Dim C As Long A = 1 B = 2 C = 3 MsgBox A + B + C End Sub |
3.定数を使う
Const constname As type
定数は、数値や文字列に付けるニックネームのようなものです。定数を宣言するときは、Constステートメントを使います。変数は宣言時に初期値を設定できませんが、定数は逆に宣言時に初期値を設定しなければいけません。なぜなら、一度宣言した定数は、プログラム中で値を変更できないからです。
1 2 3 4 5 6 7 8 |
Sub sample3() Const A As Long = 3 Const S As String = "Excel" Dim i As Long For i = 1 To A Cells(i, 1) = S Next i End Sub |
4.配列を使う
Dim varname(subscripts) As type
一般的な変数には1つの値しか格納できません。別の値を格納すると、それまで入っていた値は消えてしまいます。これは、いわば一戸建て住宅のようなものです。対して配列は集合住宅のようなものです。例えば、3部屋のアパートなら、3家族が入居できます。そして、各部屋にアクセスするときは、配列名(番号)のように部屋番号を特定します。配列を使うときは、宣言時に要素の番号を指定します。VBAの配列は、基本的に要素[0](0号室)から始まります。サンプルの宣言Dim S(3)は3部屋の配列ではなく、0号室から始まって、最も大きい部屋番号が3の配列ということです。
1 2 3 4 5 6 7 8 |
Sub sample4() Dim S(3) As String S(0) = "tsuchiyama" S(1) = "tanaka" S(2) = "suzuki" S(3) = "nakazawa" MsgBox S(2) End Sub |
5.動的配列を使う
宣言する時点では、いくつの要素(部屋)を用意すればいいのかがわからないようなとき、とりあえず部屋を区切っていない配列を宣言し、後から要素数(部屋数)を変更します。こうした配列を動的配列と呼びます。動的配列を宣言するときは、要素数(部屋数)を指定しません。コード内で要素数を変更するときは、ReDimステートメントを使います。要素数の変更はプログラム中で何度も行えますが、ただReDimステートメントで要素数を変更すると、それまで格納されていた値が全て消えてしまいます。そうではなく、既存の値を残したまま、要素数だけを変更したいときは、ReDimステートメントにキーワードPreserveをつけて実行します。
1 2 3 4 5 6 7 8 |
Sub sample5() Dim S() As String ReDim S(2) S(2) = "suzuki" ReDim Preserve S(3) S(3) = "yamada" MsgBox S(2) & vbCrLf & S(3) End Sub |
6.配列をコピーする
VBAでは配列同士の一括代入はできません。例えば2つの配列S(3)とT(3)を宣言しておき、T = Sのように配列をコピーすることはできません。そんなときは、受け手側をバリアント型変数とします。バリアント型変数は、どんな形式の値でも格納できる万能の型です。どんな値でも格納できるので、もちろん配列を格納することも可能です。サンプルのようにすれば配列S(3)をコピーできます。
1 2 3 4 5 6 7 8 |
Sub sample6() Dim S(3) As String, T As Variant S(1) = "tanaka" S(2) = "suzuki" S(3) = "takahashi" T = S MsgBox T(2) End Sub |
7.静的変数を使う
一般的な変数は、マクロが終了すると値が消えてしまいます。マクロが終了しても、格納した値を保持したままで、次回のマクロ実行時に再利用できるような変数を静的変数と呼びます。静的変数を宣言するときは、Staticステートメントを使います。サンプルではプロシージャが終了しても変数Aの値が保持されるので、実行するたびに表示される数値が増加します。静的変数は、プロシージャ内でしか宣言できません。
1 2 3 4 5 |
Sub sample7() Static A As Long A = A + 1 MsgBox A End Sub |
8.ユーザー定義変数を使う
ユーザー定義型とは、異なる型の変数を組み合わせて、独自の型セットを作るような仕組みです。C言語の構造体と同じです。ユーザー定義型の宣言は、宣言セクションで行います。ユーザー定義型の変数を宣言すると、変数名の後にピリオドを入力すると、宣言している型名がリスト表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Type myData Name As String Age As Long End Type Sub sample8() Dim Users(3) As myData, i As Long For i = 1 To 3 User(i).Name = Cells(i, 1) User(i).Age = Cells(i, 2) Next i MsgBox User(2).Name & vbCrLf & User(2).Age End Sub |
9.オブジェクト型変数を使う
オブジェクトを格納する変数を「オブジェクト型変数」と呼びます。変数の宣言でオブジェクト型を指定するのですが、オブジェクト型変数の宣言には3通りの方法があります。1つはAs Worksheet」のように格納するオブジェクトの型を明確に指定する方法です。このような方を固有オブジェクト型と呼びます。またVBAには、ようするにオブジェクトと全てのオブジェクトを表す総称オブジェクト型があります。これはAs Objectと宣言します。最後に何でも格納できる万能のバリアント型にもオブジェクトを格納できます。
1 2 3 4 5 6 |
Sub sample9() Dim WS As Worksheet, R As Object Set WS = Worksheets.Add Set R = WS.Range("A1:A5") R.Borders.LineStyle = True End Sub |
10.連想配列を使う
一般的な配列は、添え字に数値を使います。そうではなく文字列の要素を文字列の添え字で操作するような配列を連想配列と呼びます。例えば、都道府県名と県庁所在地のような関係です。連想配列はC++やJava, .NET Frameworkなど多くのプログラミング言語で使用できます。もちろん、VBAも標準で連想配列をサポートしています。それがColllectionオブジェクトです。連想配列(ここではMenberに要素を登録するにはAddメソッドを使います。
11.列挙型変数を使う
数値を列挙して、独自の型のように利用する仕組みを列挙型変数と呼びます。列挙型変数は、宣言セクションで、Enumステートメントを使って定義します。サンプルでは、ColorNumberという列挙型を定義し、そのメンバーとして4種類の数値を定義しました。プロシージャ内で、ColorNumber.まで入力すると、定義したメンバーがリスト表示されるので、コードの入力が簡単になります。
12.他のプロシージャを呼び出す
プロシージャから、他のプロシージャを呼び出すには、Callステートメントを使います。VBAでは、Callステートメントを省略した、ただプロシージャ名を記述するだけでも呼び出すことができますが、他のプロシージャを呼び出しているという事を明示的に表すためにもCallステートメントの使用をお勧めします。
13.マクロの強制終了
実行中のマクロを強制終了させるには、2つの方法があります。1つはExitステートメントです。Exit Subを実行すると、現在実行中のプロシージャが終了します。Exit Subはプロシージャを終了させるだけですから、サンプルのように他のプロシージャを呼び出している場合、終了するのは呼び出されたプロシージャだけです。
14.マクロの強制終了2
実行中のマクロを終了させるには、Endステートメントを使う方法もあります。こちらはプロシージャを終了させるのではなく実行中のマクロを終了します。Endステートメントには、マクロを終了されるだけでなく、他の副作用もあります。例えば、Endステートメントを実行すると、静的変数に保持していた値がクリアされます。サンプルで、Sample14内で宣言している変数Aは、静的変数です。実行するたびに値が増加するはずですが、Sample14_2で実行したEndステートメントによって、保持していた値がクリアされてしまいます。
15.条件分岐if
ある条件によって処理を分岐するときは、Ifステートメントを使います。Ifステートメントは、1行で書く書式と、複数行で書く書式があります。実行する処理が複数行にわたる時は、もちろん複数行で記述しなければなりませんが、処理が1行だけの場合でも可読性を高めるために、あえて複数行で記述する時があります。
16.条件分岐 Select Case
条件分岐の処理で、最もよく使われるIfステートメントは、●か●でないか、月曜か月曜でないかという相反する条件によって処理を分岐する命令です。一方、●か△か×か、月曜か、火曜か、水曜かのように条件が複数存在する場合は、Ifステートメントではなく、Select Caseステートメントを使います。Select Caseステートメントでは、Caseの後ろに条件を記述します。最後にCase Elseとして、どの条件にも一致しなかった時の処理を指定できます。
17.繰り返し For next
For Nextステートメントは、指定した回数だけ処理を行う命令です。使用するカウンタ変数には、一般的に小文字のi j k等を使います。また1つのFor Nextが終了した後であれば、同じカウンタ変数を使いまわすこともできます。初期値と終了値を指定した後ろにStepを付けると、カウンタ変数の増減幅を指定できます。
18.繰り返し Do Loop
ある条件の間だけ処理を繰り返す命令がDo Loopステートメントです。条件をDoの後ろに記述する書式と、Loopの後ろに記述する書式がありますが、ほとんどのあ場合は、Doの後ろに書きます。条件には~である間を表すWhileと~でない間を表すUntilを指定します。どんな条件も、WhileとUntilの両方で表されるので、Whieだけ覚えておけばいいでしょう。
19.繰り返し For Each
For Eachステートメントは、指定したコレクションのメンバーを順に取り出して、処理を行う命令です。サンプルでは、In Selectionのように、選択されているセル範囲を指定しています。したがって、選択されているセルが1つずつ取り出され、制御変数のCに格納されます。For Eachステートメントの制御変数は、オブジェクト型またはバリアント型を指定します。制御変数はオブジェクト型変数として扱われます。
20.繰り返しの強制終了
For NextステートメントやDo Loopステートメントなどの繰り返し命令は、指定した回数に達するまでや、指定した条件に一致する間は、ずっと同じ命令が繰り返されます。こうした繰り返し処理を途中で強制的に終了(ループから脱出)するには、Exitステートメントを使います。Exitステートメントの後ろにForをつけてExit Forとすると、実行中のFor Nextステートメント又は、For Eachステートメントを終了して、次の行に制御を移します。Do Loopステートメントを終了させるには、Exit Doとします。
21.オブジェクトを省略する
VBAのオブジェクト式は、オブジェクト.プロパティまたは、オブジェクト.メソッドのように、まず対象となるオブジェクトを指定します。同じオブジェクトを続けて指定する場合、Withステートメントを使って、オブジェクトの記述を省略することができます。省略するオブジェクトをWithステートメントの後ろに書くと、それ以降End Withまでの間は、ピリオドで始まる記述はオブジェクトを省略しているとみなされます。
22.Escキーでマクロを停止する
マクロ実行中にユーザーがescキーを押すと、マクロはデバッグモードになります。マクロの開発中ではいいのですが、Excelに不慣れなユーザーにとっては、いきなりVBEが開いてマクロのソースが表示されるので、驚いてしまうかもしれません。マクロ実行中にEscキーが押された時、マクロをデバックモードにするのではなく、Escキーが押されたことを感知して、別の処理に移行することができます。それには、ApplicationオブジェクトのEnableVanselKeyプロパティに定数xlErrorHandlerを指定します。こうすると、Escキーが押されるとエラーが発生するので、On Errorステートメントなどで処理を分岐できます。
23.ユーザーからデータを受け取る
マクロ実行中にユーザーから値を受けとるときは、InputBox関数が便利です。InputBox関数は、引数に指定した文字列を表示して、ユーザーが入力できるダイアログボックスを開きます。InutBox関数の返り値は文字列です。受け取る変数は、原則として文字列型を指定します。サンプルのように数値を受け取る場合は、Val関数で数値に変換しましょう。またInputBox関数ではキャンセルボタンがクリックされると空欄””を返します。ユーザーがキャンセルしたときの処理を忘れないようにしましょう。
24.ユーザーに処理を選択させる
画面にメッセージを表示するときに多用するMsgBoxは、実は関数です。関数という事は何らかの値を返す命令ですが、いったいMsgBox関数は何を返すのでしょう。MsgBox関数は複数のボタンを表示してユーザーがクリックしたボタンの種類を返す関数です。表示するボタンは引数に指定します。また、どのボタンがクリックされたかは、定数で判定できます。一般的に使われるMsgBox(”メッセージ”)ではMsgBox関数の返り値(どのボタンがクリックされたか)を使っていません。VBAでは、返り値を使う場合は引数をカッコで囲み、返り値を使わない場合は、カッコで囲んではいけないというルールがあります。
25.InputBoxで空欄を認識する
マクロ実行中にユーザーからデータを受け取るには、InputBox関数が便利です。InputBox関数は、ユーザーがキャンセルボタンをクリックすると空欄””を返します。しかし、入力ボックスを空欄のままOKボタンをクリックしても、同じように空欄を返します。両者を区別するにはどうしたらいいのでしょう。そもそも、空欄のままOKボタンが押された場合は、処理を中止するケースがほとんどです。OKボタンの空欄とキャンセルボタンの空欄を区別しなければならないようなケースは、実務ではほとんどないでしょう。万が一、どうしても区別しなければならないのなら、InputBox関数ではなく、ApplicationオブジェクトのInputBoxメソッドを使います。こちらはキャンセルされるとFalseが返るので、簡単に両者を区別できます。
26.IMEをオンにしてInputBoxを開く
InputBox関数を使うと、ユーザーからデータを受け取れます。もし日本語のデータを受け取るのなら、InputBoxを表示すると同時に、日本語変換ソフト(IME)をオンにすると親切ですね。しかしInput関数にはIMEだけを制御する機能がありません。Windows API等を使わずにExcelの機能だけで実現するなら入力規則を利用する手があります。マクロ中で仮のブックを開き、アクティブセルにIMEを自動的にオンにするという入力規則を設定します。設定した段階でIMEがオンになるので、そこからInputBoxを開きます。処理が終わったら、仮のブックはこっそりと閉じます。
27.マクロ実行中にセルを選択させる
ApplicationオブジェクトのInputBoxメソッドを使うと、マクロ実行中にユーザーがセル範囲を選択できます。ユーザーが選択したセルをその後マクロで処理できるのですが、キャンセル処理が面倒です。まず正規にセルを選択した場合、Rangeオブジェクトが返るので、受け取る変数はRange型で宣言し、Setステートメントを使います。しかし、キャンセルされるとFalseが返るため、Setステートメントがエラーになります。そこで、エラーが発生したらジャンプするようにOn Errorを実行しておきます。
28.エラーが発生したらジャンプする
マクロの実行中に何らかの原因でエラーが発生したとき、そのままではマクロがデバッグモードで停止してしまいます。エラーが起きてもデバッグモードにしないためには、エラーが発生した時の挙動を組み込んでおかなければなりません。On Error GoToの後ろにラベル名を指定しておくと、それ以降、エラーが発生すると処理がラベルの行に移行します。ラベル行の後ろに、エラーに対する処理を記述しておきます。
29.イミディエイトウィンドウに出力する
マクロの実行中に、イミディエイトウィンドウに出力するには、DebugオブジェクトのPrintメソッドを使います。マクロ実行中に変数やプロパティの値を確認するときなどに便利です。なお、イミディエイトウィンドウは表示できる行数に制限があるので、あまり大量の文字列を出力すると、最初の方の文字列は消えてしまう場合もあります。
30.ログを出力する
マクロが正しく実行されたかどうかを後で検証するときは、マクロの動作をログファイルに記録しておくと便利です。ログファイルは一般的にテキストファイルなので、追記モードで開きます。またいろいろな場合からログを書き込むため、ファイルに出力する部分を別のプロシージャとしておくといいでしょう。
31.エラーを無視する
On Errorステートメントを使うと、発生したエラーを無視して、次の行から処理を再開させることができます。それには、On Error Resume Nextと記述します。これ以降のコードでエラーが発生しても無視され、次の行に制御が移ります。シート名に指定できない文字が入力された場合、ActiveSheet.Name = NewNameでシート名の変更を試みます。しかし、ここでエラーが発生しても無視され、次のMsgBoxが実行されます。
32.発生したエラーの種類を調べる
発生したエラーの情報は、Errオブジェクトに格納されます。ErrオブジェクトのNumberプロパティは、発生したエラーの番号が格納されています。またエラー時に表示されるメッセージは、ErrオブジェクトのDescriptionプロパティで取得できます。エラーの種類によって処理を分岐したり、エラーメッセージを取得するには、Errオブジェクトを使ってください。
33.エラー情報をクリアする
マクロ実行中に発生したエラーはErrオブジェクトに格納されます。格納されたエラーは、マクロが終了するまで保持されます。エラー処理を細かく制御するときは、先に発生したエラーに関する情報をクリアしておかないと、誤った判断をする場合もあります。Errオブジェクトに格納されているエラーに関する情報をクリアするには、ErrオブジェクトのClearメソッドを実行します。
34.エラーへの対応をやめる
サンプルは、アクティブシートの名前をユーザーから受け取った文字列に変更します。シート名に使用できない文字が入力されたり、すでに存在する名前を指定されるとエラーになるので、On Errorステートメントでエラーを無視しています。その後、ブックを保存するのですが、もし同盟のファイルが存在した場合「置き換えますか?」という確認メッセージが表示されます。ここで「いいえ」ボタンかキャンセルボタンをクリックすると、SaveAsメソッドがエラーになります。しかし先にOn Error Resume Nextを実行していると、このエラーまで無視されてしまいます。On Errorステートメントで設定したエラーへの対応はやめるには、On Error GoTo 0 を実行します。最後は数字の0です。
35.値を返すFunctionプロシージャ
VBAには、Subで始まるSubプロシージャとFunctionで始まるFunctionプロシージャがあります。プロシージャから別のプロシージャを呼び出した時、処理の結果を呼び出し元に返せるのがFunctionプロシージャです。Functionプロシージャで結果を返すときは、Functionプロシージャの生に値を代入します。
36.プロシージャに引数を渡す
プロシージャを作成するとき、あらかじめ値を受け取るように定義しておくと、呼び出すプロシージャから値を渡すことができます。
37.引数を省略可能にする
プロシージャに渡す値は、呼び出されるプロシージャ側のカッコ内に定義しておきます。呼び出すプロシージャはカッコ内で定義された値を引数として渡さなければなりません。この引数は省略を許すことができます。引数●には×を指定する。ただし引数●が省略された場合は△とみなあす。というような定義を行うには、カッコ内の引数定義にOptionalキーワードを付けます。Optionalは引数定義の途中ではつかえません。Optionalキーワードの引数から後ろも全てOptionalで省略可能でなければなりません。例えばA As Long, Optional B As Long, C As Longは省略可能とした引数Bの後ろで定義した引数Cが必須となっているためエラーになります。省略可能引数を省略された時のデフォルト値はサンプルのように定義中で指定できます。
38.引数が省略されたかどうか判定する
引数が省略されたときのデフォルト値は、カッコ内の引数定義で初期値を指定できます。そうではなく引数が書略されたかどうかを判定するときは、IsMissing関数を使います。IsMissing関数は、指定した引数が省略されたときTrueを返します。ただし、IsMissing関数を判定できる引数は、バリアント型でなければなりません。IsMissing関数を使って、引数の省略を判定したいときは、その引数をバリアント型で宣言してください。
39.引数を可変にする
例えば、ワークシート関数のSUM関数は複数の引数をカンマで区切って指定できます。引数の数は1つでも2つでも正しく計算されます。これは呼び出されるプロシージャで、受け取る引数を可変にしているからです。可変の引数を定義するには、ParamArrayキーワードを付けます。ParamArrayキーワードで可変にできる引数は、引数リストの最後でなければなりません。またParamArrayキーワードで可変に出来る引数は、パリアント型の配列に限られます。
40.引数に配列を受け取る
引数に配列を渡すときは、呼び出されるプロシージャで、引数を動的配列として宣言します。サンプルでは、呼び出すプロシージャの配列bufをbuf(3)として宣言しています。標準のVBAでは、配列は要素0から始まるのでbuf3は実際には、buf(0),buf(1),buf(2),buf(3)の4つの要素を持ちますが、先頭のbuf(0)は使っていません。呼び出されるプロシージャでもFor i = 1 TO UBound(A)と要素0は無視しています。
41.配列を返す
Functionプロシージャは、何らかの値を返すプロシージャです。返す値の型は、Function 名前(引数)As 型とプロシージャの最後で定義できます。配列を返すFunctionプロシージャは、最後の型指定の後ろにカッコヲ付けます。サンプルでは、文字列型の配列を返しています。
42.ユーザー定義関数を作る
Functionプロシージャは、ワークシート上のセルに入力して呼び出すこともできます。そうしたワークシート上で使用するFunctionプロシージャをユーザー定義関数と呼びます。ユーザー定義関数では、次のことができません。
セルの挿入・削除
他セルの値の「変更
アクティブセルや選択範囲の変更
シートの挿入・削除や名前の変更
Excelの設定の変更
43.入力されたセルを取得する
ユーザー定義関数でその関数が入力されているセルはApplicationオブジェクトのThisCellプロパティで取得できます。サンプルでは、入旅行されたセルの親ワークシートをParentプロパティで調べ、その名前を返しています。Parent.Parent.Nameとすれば、その関数が入力されているセルのブック名を返します。
44.自動再計算の関数にする
ユーザー定義関数は、ワークシート上で、引数に指定された値が変更されたときだけ再計算を行います。そうではなく、一般的なワークシート関数のように、任意のセルが変更されたときにも自動的に再計算を行うには、ユーザー定義関数(Functionプロシージャ)の先頭で、ApplicationオブジェクトのVolatileメソッドを実行します。
45.画面の更新を止める
マクロ実行中は、実行したコマンドによって、画面が更新されます。画面の更新を抑止するには、ApplicationオブジェクトのScreenUpdatingプロパティにFalseを指定します。これ以降は画面が止まり、更新されません。
46.確認メッセージを表示させない
ワークシートを削除するとき、削除しますか?というExcelからの確認メッセージが表示されます。こうしたExcelからの確認メッセージを表示させないようにするには、ApplicationオブジェクトのDisplayAlertsプロパティにFalseを指定します。再び確認メッセージが表示されるようにするにはTrueを設定してください。
47.Split関数の結果を直接操作する
Split関数は、文字列を区切り文字で分割した配列を返します。一般的には、Split関数の結果(返り値)は、バリアント型変数に格納し、以降はそのバリアント型変数を配列として操作することが多くなります。しかし、Split関数自体が配列を返すのですから、Split関数の後ろに添え字をつければ、Split関数が返す関数を直接操作できます。
48.特定のデータが含まれているか判定する
データが等しいかどうかは=演算子で判定できます。では任意の文字列にある文字が含まれているかどうかを判定するには、どうしたらいいでしょう。含まれているかどうかを判定する演算子は、VBAにありません。そんあときは、InStr関数を使います。InStr関数の返り値は0という事は、文字が含まれていないという事になります。
49.スペースで文字列を分割する
苗字と名前がスペースで区切られているとき、スペースの位置によって苗字と名前を分割するには、どうしたらいでしょう。スペースの位置をInStr関数で調べて、Left関数とMid関数を使って、と難しく考えることはありません。スペースを区切り文字としてSplit関数を使えばいいのです。
50.文字列を後ろから検索する
InStr関数は、任意の文字列内に指定した文字列が存在した場合、先頭からの位置を返す関数です。先頭から探すのではなく、文字列のうしろから探すときは、InStrRev関数を使います。C:\Work\Sub\Book1.xlsmのようなファイルのファイルパスからファイル名だけを取り出すには、最後に登場する\から右を取得します。そんなとき役立つのがInStrRev関数です。
51.文字の個数をカウントする1
ある文字列の中に特定の文字が何個も含まれているかを返すVBAの関数はありません。文字列内で、特定の文字が出現する個数をカウントするには、じぶんで計算しなければなりません。InStr関数は、文字を検索する位置を指定できるので、最初に見つかった位置の右から、見つからなくなるまで検索を繰り返します。こうした処理を何度も行うのなら、サンプルのようにFunctionプロシージャとして作成しておくと便利です。
52.文字の個数をカウントする2
検索したい文字が1文字の場合は、簡単に調べることができます。例えばSplit(”A,B,C”,”,”)はCS形式のデータをカンマで分割して、配列に格納できます。この配列の要素数を調べれば、結果的にカンマがいくつあったかが分かります。葉入れ宇野要素数は、UBound関数で取得します。
53.数値で文字を表す
コンピュータでは、全ての文字をコードで管理しています。例えば、半角大文字のアルファベットAのアスキーコードは65です。こうしたコード番号から該当する文字に変換してくれるのがChr関数です。
54.アスキーコードを調べる
半角アルファベットAのアスキーコードは65です。数値の65からAに変換するには、Chr関数を使います。反対に、文字Aのアスキーコードを調べる時はAdc関数を使います。
55.マクロを一時停止する1
マクロの実行を一時停止してデバッグモードにするには、Stopステートメントを使います。Stopステートメントは、その他のステートメントと小同じ、VBAのステートメントです。ブレークポイントを設定するより柔軟で、ウォッチウィンドウよりも使いやすいのが特徴です。サンプルは、変数iの値が50になったら、マクロを一時停止します。
56.マクロを一時停止する2
マクロを一時停止するには、DebugオブジェクトのAssertメソッドを使う手もあります。Assertメソッドは、Debug.Assert [式]のように指定し、式がFalseのときだけデバッグモードになります。
57.配列かどうか調べる
ファイルを開くダイアログボックスを表示して、ユーザーにファイルを選択してもらうときには、ApplicationオブジェクトのGetOpenFilenameメソッドが便利です。GetOpenFilenameメソッドでは、引数MultiSelectにTrueを指定すると、複数のファイルを選択できるようになります。選択された複数のファイルは、配列形式で返されます。しかし、キャンセルボタンがクリックされると、配列ではなく、Falseが返ります。そこで、ユーザーがキャンセルボタンをクリックしたかどうかは、返り値が配列かどうかを判定しなければなりません。配列かどうかを判定するには、IsArray関数を使います。
58.自分自身を呼び出すプロシージャ
あるプロシージャが、自分自身を呼び出すことを再帰と呼びます。サンプルでは、プロシージャGetFolderInfoは、引数に指定されたフォルダのパスと、フォルダ内に保存されているファイルの数をアクティブシートに書き出します。GetFloderInfoは引数で渡されたフォルダにサブフォルダが1つ以上存在した場合、それらのサブフォルダを引数にして自分自身を呼び出します。
59.複雑な条件分岐
Select Caseステートメントでは、Caseの後ろで指定した対象を、Case節の評価内ではIsキーワードとして利用できます。例えば次のように使います。
しかしIsキーワードは評価式の左辺にしか使えません。評価に関数を使ったり、あるいはもっと複雑な判定を行う時は、Select Caseステートメントの対象にTrueを指定します。
60.一定範囲の乱数を生成する
Rnd関数は0より大きく1未満のランダムな少数を返します。任意の幅の乱数を生成するときはInt(Rnd * 最大値) + 最小値とします。サンプルでは1から6の乱数を生成しています。Rnd関数の前にRandomizeメソッドを実行すると、乱数テーブルを初期化します。
61.文字列の左側を抜き出す
Left(string,length)
文字列の左側を抜き出すにはLeft関数を使います。Left関数の書式は次の通りです。
Left(元の文字列, 文字数)
1 2 3 |
Sub sample61() MsgBox Left("ABCDEFGH", 3) End Sub |
62.文字列の右側を抜き出す
Right(string, length)
文字列の右側を抜き出すには、Right関数を使います。Right巻子の書式は次の通りです。
Right(元の文字列, 文字数)
1 2 3 |
Sub sample62() MsgBox Right("ABCDEFGH", 3) End Sub |
63.文字列の中を抜き出す
Mid(string, start, length)
文字列の中を抜き出すには、Mid関数を使います。Mid関数の書式は次の通りです。
Mid(元の文字列, 開始位置, 文字数)
1 2 3 |
Sub sample63() MsgBox Mid("ABCDEFGH", 3, 2) End Sub |
64.文字列の右側全部を抜き出す
Mid(string, start)
Mid関数は文字列中の指定した位置から指定した文字数を抜き出す関数です。Mid関数の3番目の引数「文字数」を省略すると開始位置から右側全部を返します。
1 2 3 |
Sub sample64() MsgBox Mid("ABCDEFGH", 3) End Sub |
65.文字列の長さを調べる
Len(string)
Len関数は、引数に指定した文字列の長さ(文字数)を返します。半角文字と全角文字は区別しません。
1 2 3 |
Sub sample65() MsgBox Len("東京Excel") End Sub |
66.Msgbox内の文字列を右寄せにする
Msgbox(prompt, buttoms)
MsgBoxには、様々なオプションが用意されています。Msgbox内の文字列を右寄せで表示するには、引数buttomsに定数vbMsgBoxRightを指定します。
1 2 3 |
Sub sample66() MsgBox "住所は" & vbCrLf & "東京都新宿区船町" & vbCrLf & "です", vbMsgBoxRight End Sub |
67.同じ文字を続ける
String(number, character)
String関数は、2番目の引数で指定した文字を、1番目の引数で指定した数だけ続けた文字列を返します。ワークシート上で使うRPET関数と同じ働きです。
1 2 3 |
Sub sample67() MsgBox String(10, "+") End Sub |
68.正規表現のようなマッチング
69.正規表現によるマッチング
70.数値の桁数を指定する
Format(expression, format)
数値の先頭に0を付けて、指定した桁数に変換するには、Format関数を使います。
1 2 3 |
Sub sample70() MsgBox Format(123, "00000") End Sub |
71.論理値を計算に使う
Abs(number)
VBAでは、論理値のTrueは‐1、Falseは0として扱われます。これを利用するとIfステートメントを使用しないで、論理値の結果を計算に使えます。サンプルでは、今日の月が7のときMonth(now) = 7 がTrue(-1)になります。そのまま乗算すると数値がマイナスんなりますので、Abs関数で-1を1に変換しています。今日が7月でないときは、False(0)と100を乗算するので0になります。
1 2 3 |
Sub sample71() MsgBox Abs(Month(Now) = 7) * 100 End Sub |
コメントを残す