HELPの小技集3




ステートメント編


◆アプリケーションウインドウをアクティブにするには(AppActivate ステートメント

Sub AppActivateステートメント()
'Microsoft Wordをオープンしておいてください。
Dim MyAppID, ReturnValue
AppActivate "Microsoft Word"
End Sub


Sub Shell関数も利用()
' AppActivate ステートメントでは Shell 関数の戻り値を使うこともできます。
MyAppID = Shell("C:\Program Files\Microsoft Office\Office\WINWORD.EXE", 1) ' Microsoft Word を実行します。
AppActivate MyAppID ' Microsoft Word をアクティブにします。
End Sub


Sub Shell関数も利用2()
' Shell 関数の戻り値を使うこともできます。
ReturnValue = Shell("c:\Program Files\Microsoft Office\Office\EXCEL.EXE", 1) ' Microsoft Excel を実行します。
MsgBox ReturnValue
AppActivate ReturnValue ' Microsoft Excel をアクティブにします。
End Sub

AppActivate ステートメントは、指定したアプリケーションやウィンドウにフォーカスを移します。このとき、フォーカスが移っても指定したウィンドウの状態は変化しません。たとえば、最小化されているウィンドウにフォーカスを移しても、そのウィンドウは最小化されたままです。ユーザーがフォーカスを変更するか、またはウィンドウを閉じると、他のウィンドウへフォーカスが移ります。アプリケーションを実行するには、Shell 関数を使用します。また、ウィンドウ スタイルの設定をする場合にも Shell 関数を使用します。

アプリケーション ウィンドウのタイトル バーの文字列と名前付き引数 title が完全に一致しているかどうかを比較することによって、どのアプリケーションをアクティブにするかが判別されます。完全に一致するものが見つからないときは、アプリケーション ウィンドウのタイトル バーの文字列が名前付き引数 title で始まるアプリケーションをアクティブにします。名前付き引数 title と一致するアプリケーション ウィンドウが複数ある場合も、その中の 1 つが任意に選択されてアクティブになります。





◆Beep音を鳴らすには(Beep ステートメント


Sub Beep音()
Beep ' ビープ音を鳴らします。
End Sub

コンピュータのスピーカを鳴らします。

ビープ音の鳴る時間と周波数はハードウェアとシステム ソフトウェアに依存するため、コンピュータの機種によって異なります。

私のPCでは次のソースで3回なります。
Sub Beep音2()
Dim I
For I = 1 To 10000   ' ループを 10000 回繰り返します。
Beep   ' ビープ音を鳴らします。
Next I
End Sub




◆Sub プロシージャ、Function プロシージャ、ダイナミック リンク ライブラリ (DLL)プロシージャを呼び出すには(Callステートメント

Sub Callステートメント()
Call Shell関数も利用
End Sub

Sub Shell関数も利用()
' AppActivate ステートメントでは Shell 関数の戻り値を使うこともできます。
MyAppID = Shell("C:\Program Files\Microsoft Office\Office\WINWORD.EXE", 1) ' Microsoft Word を実行します。
AppActivate MyAppID ' Microsoft Word をアクティブにします。
End Sub




◆フォルダの作成と削除をするには(ChDir,ChDrive,MkDir,RmDirステートメント

Sub フォルダの作成()
Dim a, b
ChDrive "C:"
ChDir "C:\test"
a = Application.InputBox("作成するフォルダ名を入力")
MsgBox a & "というフォルダを作成します"
MkDir a
b = MsgBox(a & "というフォルダを削除しますか", vbYesNo)
If b = vbYes Then
RmDir a
MsgBox a & "というフォルダを削除しました"
Else
End If
End Sub


ChDir :現在のフォルダを変更します。存在しないフォルダを指定するとエラーが発生します。

ChDrive:現在のドライブを変更します。

MkDir :新しいフォルダを作成します。すでに存在するフォルダを指定するとエラーが発生します。

RmDir :既存のフォルダを削除するステートメントです。指定したフォルダ内にファイルが存在していると、エラーが発生します。フォルダを削除する前に、Kill ステートメントを使用してすべてのファイルを削除してください。

Cドライブの中に「test」というファイルを作成してください。
エクスプローラを立ち上げておいてください。作成・削除の様子がわかります。
「test」の中にどんなフォルダがあるかを調べるには「Dir関数」を使います。
サンプル一部修正版
Sub C内のホルダ検索()
' C:\ 内のフォルダの名前を表示します。
Mypath = "c:\test\" ' パスを設定します。
Myname = Dir(Mypath, vbDirectory) ' 最初のフォルダ名を返します。
Do While Myname <> "" ' ループを開始します。
' 現在のフォルダと親フォルダは無視します。
If Myname <> "." And Myname <> ".." Then
' ビット単位の比較を行い、MyName がフォルダかどうかを調べます。
If (GetAttr(Mypath & Myname) And vbDirectory) = vbDirectory Then
MsgBox Myname
'Debug.Print myname ' フォルダであれば、それを表示します。イミディエイトウインドウに。
End If
End If
Myname = Dir ' 次のフォルダ名を返します。
Loop
End Sub




◆数値や文字列値に定数としての名前を宣言するには(Constステートメント

消費税の計算
Sub Constステートメント()
Dim a As Single
Const TaxRate As Single = 0.05
a = 10000 * TaxRate
MsgBox a
End Sub
消費税が変わればTaxRateの設定を変更するだけでソースの修正ができるようになります。

構文

[Public | Private] Const constname [As type] = expression

Const ステートメントの構文は、次の指定項目から構成されます。

指定項目 内容
Public 省略可能です。すべてのモジュール内のすべてのプロシージャから参照可能な定数を宣言するために、モジュール レベルで使用するキーワードです。プロシージャ内では、指定できません。
Private 省略可能です。宣言が行われたモジュール内のプロシージャからのみ参照できる定数を宣言するときに指定するキーワードです。モジュール レベルで使用します。プロシージャ内では指定できません。
constname 必ず指定します。定義する定数の名前を指定します。変数の標準的な名前付け規則に従って指定します。
type 省略可能です。定数のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点型 (Single)、倍精度浮動小数点数型 (Double)、10 進数型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String)、またはバリアント型 (Variant) のいずれかを指定できます。宣言する各変数に対して、As type 節を個別に指定します。
expression 必ず指定します。リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。




◆現在のシステムの日付を設定するには(Dateステートメント

Sub 日付設定()
Dim MyDate
MyDate = #2/12/1985# ' 日付を代入します。
Date = MyDate
MyDate = Date ' MyDate に現在のシステムの日付が格納されます。
MsgBox MyDate
End Sub
これを実行するとシステムの日付が変更されますので、試したあとはもとにもどしておいてください。
Microsoft Windows 95 で実行されるシステムの場合は、1980 年 1 月 1 日〜2099 年 12 月 31 日の範囲の日付を指定する必要があります。Microsoft Windows NT で実行されるシステムの場合は、1980 年 1 月 1 日〜2079 年 12 月 31 日の範囲の日付を指定する必要があります。





◆既定のデータ型を設定するには(Deftypeステートメント

次の例は、Deftype ステートメントを使って、特定の文字が先頭に付く変数や Function プロシージャに対して、既定のデータ型を設定する方法を表しています。既定のデータ型は、Dim ステートメントを使って明示的に宣言することによってのみ、変更できます。Deftype ステートメントは、モジュール レベルでのみ使用できます。つまり、プロシージャ内では使えません。

DefInt I
Sub DeftTypeDec()
Dim h, i
h = 100 / 3: Cells(5, 1) = h
i = 100 / 3: Cells(5, 2) = i
End Sub
DefInt A-I
Sub DeftTypeDec()
Dim h, i
h = 100 / 3: Cells(5, 1) = h
i = 100 / 3: Cells(5, 2) = i
End Sub

A-Iとした場合は、AからIの文字を指定したことになります。

解説

各ステートメント名が適用されるデータ型を次に示します。

ステートメント データ型
DefBool ブール型 (Boolean)
DefByte バイト型 (Byte)
DefInt 整数型 (Integer)
DefLng 長整数型 (Long)
DefCur 通貨型 (Currency)
DefSng 単精度浮動小数点数型 (Single)
DefDbl 倍精度浮動小数点数型 (Double)
DefDec 10 進型 (Decimal) (現在はサポートされていません)
DefDate 日付型 (Date)
DefStr 文字列型 (String)
DefObj オブジェクト型 (Object)
DefVar バリアント型 (Variant)




◆変数や配列を宣言するには(Dimステートメント

次の例は、Dim ステートメントを使って、変数や配列を宣言する方法です。配列の添字の最小値は既定値では 0 ですが、Option Base ステートメントを使えば、モジュール レベルで変更できます。

' 変数 AnyValue と変数 MyValue は既定のバリアント型 (Variant)
' として宣言されて、値は Empty 値が設定されます。
Dim AnyValue, MyValue

' 整数型 (Integer) の変数を明示的に宣言します。
Dim Number As Integer

' 1 行で複数の変数を宣言します。型が指定されていないので、
' 変数 AnotherVar はバリアント型になります。
Dim AnotherVar, Choice As Boolean, BirthDate As Date

' 変数 DayArray は、要素数 51 のバリアント型配列として宣言されます。
' 現在のモジュールで、Option Base に既定値の 0 が設定されていれば、
' 添字の範囲は、0 〜 50 になります。
Dim DayArray(50)

' 変数 Matrix は、整数型の 2 次元配列です。
Dim Matrix(3, 4) As Integer

' MyMatrix は、倍精度浮動小数点数型 (Double) の 3 次元配列です。
' 添字の範囲を、明示的に指定しています。
Dim MyMatrix(1 To 5,  4 To 9,  3 To 5) As Double

' BirthDay は、添字が 1 〜 10 の範囲の日付型 (Date) の配列です。
Dim BirthDay(1 To 10) As Date        

' MyArray は、バリアント型の動的配列です。
Dim MyArray()




◆条件が真になるまで繰り返すには(Do...Loopステートメント

次の例は、Do...Loop ステートメントの使い方を示しています。内側の Do...Loop ステートメントでは、ループを 10 回繰り返すとフラグの値を偽 (False) に設定し、Exit Do ステートメントを使ってループから抜けます。外側のループは、フラグの値を調べてループから抜けます。

Dim Check, Counter
Check = True: Counter = 0        ' 変数を初期化します。
Do    ' 外側のループ。
    Do While Counter < 20        ' 内側のループ。
        Counter = Counter + 1    ' カウンタを増やします。
        If Counter = 10 Then    ' 条件が True であれば
            Check = False        ' フラグの値を False に設定します。
            Exit Do                ' 内側のループから抜けます。
        End If
    Loop
Loop Until Check = False        ' 外側のループから抜けます。

指定した条件が真 (True) である間、または条件が真 (True) になるまで、一連のステートメントを繰り返し実行するフロー制御ステートメントです。

構文

Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]

Loop

または、次の構文を使用できます。

Do
[statements]
[Exit Do]
[statements]

Loop [{While | Until} condition]

Do...Loop ステートメントの構文は、次の指定項目から構成されます。

指定項目 内容
condition 省略可能です。真 (True) または偽 (False) を評価する数式、あるいは文字列式を指定します。引数 condition の値がNull 値の場合、引数 condition偽 (False) であるとみなされます。
statements 引数 condition真 (True) である間、または引数 condition真 (True) になるまで繰り返し実行される、任意の行数のステートメントを記述します。

解説

Do...Loop ステートメントから抜け出す別の方法として、Do...Loop ステートメント内に任意の数の Exit Do ステートメントを指定することができます。通常、Exit Do ステートメントはいくつかの条件を評価した後で使用します。たとえば、If...Then ステートメントを評価した後で Exit Do ステートメントを実行して、制御をキーワード Loop の次のステートメントに直ちに移します。

Do...Loop ステートメントはネスト (入れ子) 構造にすることができます。つまり、Do...Loop ステートメントの内部に別の Do...Loop ステートメントを入れることができます。ネスト (入れ子) 構造にしたときに Exit Do が実行されると、その Exit Do を囲んでいる 1 番内側のループから抜け出します。





◆プロシージャやブロック (一連のステートメントの集まり) を終了させるには(Endステートメント

次の例は、ユーザーが不正なパスワードを入力すると、End ステートメントを使ってコードの実行を終了させます。

Sub Form_Load
    Dim Password, Pword
    PassWord = "Swordfish"            ' パスワードを設定します。
    Pword = InputBox("パスワードを入力してください。")
    If Pword <> PassWord Then
        MsgBox "パスワードが不正です。"
        End
    End If
End Sub

次の例は、Select CaseブロックおよびSubプロシージャを終了します。
Sub CaseSelect()
Dim i%
i% = Cells(1, 1)
Select Case i%
Case 1
Cells(1, 2) = "**1**"
Case 2
Cells(1, 2) = "**2**"
End Select
End Sub




◆静的配列の要素を再初期化したり、動的配列に割り当てたメモリを解放するには(Eraseステートメント

次の例は、配列a!、b!を宣言して値を代入後、配列b!を削除します。

Sub EraDim()
Dim a!(20), b!(20)
a!(10) = 10: b!(10) = 20
Cells(1, 1) = a!(10): Cells(1, 2) = b!(10)
Erase b!
Cells(2, 1) = a!(10): Cells(2, 2) = b!(10)
End Sub




◆エラーを擬似的に発生させるには(Errorステートメント

Sub errtest()
On Error Resume Next ' エラー処理を行います。
Error 11 ' 疑似的に 「0 で除算しました。」というエラーを発生させます。
If err Then
MsgBox err.Description
err.Description = "この操作に必要なオブジェクトに" _
& "アクセスすることができませんでした。"
MsgBox err.Description
End If
End Sub


エラー番号のエラーメッセージを確認してみましょう。次の例は、番号1から100までのメッセージを書き出すようになっています。’をはずせば、デバッグウィンドウにも表示します。
Sub errlist()
Dim ErrorNumber
For ErrorNumber = 1 To 100 ' エラー番号 1 〜 100 を対象にします。
Cells(ErrorNumber, 1) = Error(ErrorNumber)

' Debug.Print Error(ErrorNumber) ' エラー メッセージをデバッグ ウィンドウに表示します。
Next ErrorNumber
End Sub




◆プロシージャを抜ける(Exitステートメント


Do...Loop
ループ、For...Next ループ、FunctionSub、または Property の各プロシージャを抜けるフロー制御ステートメントです。

次の例は、Exit ステートメントを使って、For...Next ループ、Do...Loop ループおよび Private Sub プロシージャから抜け出します。

Sub ExitStatementDemo()
Dim I, MyNum
Do
For I = 1 To 1000
MyNum = Int(Rnd * 1000)
Select Case MyNum
Case 7: Exit For
Case 29: Exit Do
Case 54: Exit Sub
End Select
Next I
Loop
End Sub


無限ループを設定します。
ループを 1,000 回繰り返します。
乱数を発生させます。
乱数を評価します。
MyNum が 7 であれば、For...Next から抜け出します。
 MyNum が 29 であれば、Do...Loop から抜けます。
MyNum が 54 であれば、Private Sub プロシージャから抜け出します。






◆ファイルをコピーするには(FileCopyステートメント

ファイルをコピーします。

構文

FileCopy source, destination

FileCopy ステートメントの構文は、次の名前付き引数から構成されます。

指定項目 内容
source 必ず指定します。コピーするファイル名を示す文字列式を指定します。フォルダ名およびドライブ名を含めて指定できます。
destination 必ず指定します。コピー後のファイル名を示す文字列式を指定します。フォルダ名およびドライブ名を含めて指定できます。

解説

既に開いているファイルに対して、FileCopy ステートメントを実行しようとすると、エラーが発生します。


次の例は、FileCopy ステートメントを使って、ファイルをコピーします。この例のファイル SRCFILE には、データが含まれているものと仮定します。

Dim SourceFile, DestinationFile
SourceFile = "SRCFILE"   ' コピー元のファイル名を指定します。
DestinationFile = "DESTFILE"   ' コピー先のファイル名を指定します。
FileCopy SourceFile, DestinationFile   ' ファイルをコピーします。





◆指定した回数だけ繰り返すには(For...Nextステートメント

指定した回数だけ、一連のステートメントを繰り返すフロー制御ステートメントです。
次の例は、セルA2の文字列を逆順に並べ替えます。Mid$の$については、逆引きindexを参照してください。
Sub ForNextLoop()
Dim i%, s$
For i% = 1 To Len(Cells(2, 1))
s$ = Mid$(Cells(2, 1), i%, 1) & s$
Next i%
Cells(2, 2) = s$
End Sub




◆決まった処理をさせるには(Functionステートメント
ある決まった処理をするプログラムを別に作っておけば、その処理をする場合に都度マクロを記述する必要がありません。こういった役目をするのがFunctionです。
次の例は階乗を求めます。
Sub Kaijo()
Cells(1, 1) = Fact(Cells(1, 1))
End Sub

Function Fact(x As Long) As Long
Dim i#, j#
If x = 0# Then Fact = 0#: Exit Function
j# = 1#
For i# = 1 To x
j# = j# * i#
Next i#
Fact = j#
End Function




◆プロシージャ内にサブルーチンを作成するには(GoSub...Returnステートメント

プロシージャ内のサブルーチンへの分岐と復帰を行うフロー制御ステートメントです。

次の例は、GoSub ステートメントを使って、Sub プロシージャの中でサブルーチンを呼び出します。サブルーチンの中に記述された Return ステートメントは、Sub プロシージャに制御を戻し、GoSub ステートメントの直後のステートメントから処理を再開します。Exit Sub ステートメントは、制御が再びサブルーチンに渡されるのを防ぎます。

Sub GosubDemo()
Dim Num
' ユーザーに数値を入力させます。
Num = InputBox("2 で除算する正の数を入力してください。")
' ユーザーが正の数値を入力した場合のみ、サブルーチンに分岐します。
If Num > 0 Then GoSub MyRoutine
Debug.Print Num
Exit Sub ' Exit Sub でエラーを防止します。
MyRoutine:
Num = Num / 2 ' 除算を実行します。
Return ' GoSub ステートメントの直後の
End Sub ' ステートメントに制御を戻します。





◆プロシージャ内の行ラベルに分岐するには(GoToステートメント
プロシージャ内の指定した行に無条件に分岐するフロー制御ステートメントです。

次の例は、GoTo ステートメントを使って、プロシージャ内の行ラベルに分岐します。

Sub GotoStatementDemo()
Dim Number, MyString
Number = 1 ' 変数を初期化します。
' Number を評価し、適切なラベルに分岐します。
If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:
MyString = "Number は 1 です。"
GoTo LastLine ' LastLine に分岐します。
Line2:
' 次のステートメントが実行されることはありません。
MyString = "Number は 2 です。"
LastLine:
Debug.Print MyString ' イミディエイト ウィンドウに "Number は 1 です。" を表示します。
End Sub




◆条件式の真偽によって処理を選択するには(If...Then...Elseステートメント
式の値に基づいて、条件付きの実行を行うフロー制御ステートメントです。

次の例は、If...Then...Else ステートメントのブロック形式と 1 行形式の使い方をそれぞれ示します。
Sub test()
Dim Number, Digits, MyString
Number = 53 ' 変数を初期化します。
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
' 条件が True と評価され、次のステートメントが実行されます。
Digits = 2
Else
Digits = 3
End If

If Digits = 1 Then MyString = "One" Else MyString = "More than one"
MsgBox MyString
End Sub




◆ファイルからデータを読み込むには(Input#ステートメント

シーケンシャル入力モード (Input) で開いたファイルからデータを読み込んで、それを変数に格納するファイル入出力ステートメントです。

次の例は、10個の乱数をファイルの保存して、そのデータをワークシートに読み込みます。
Sub OpenFile()
Dim i%, s$
Open "testfile" For Output As #1
For i% = 1 To 10
Print #1, Rnd * 10
Next i%
Close #1
Application.Worksheets("sheet1").Activate
Open "testfile" For Input As #1
For i% = 1 To 10
Input #1, x: Cells(i%, 1) = x
Next i%
Close #1
End Sub
testfileを検索し、ノートパッドで開いてみてください。




◆ディスクからファイルを削除するには(Killステートメン

ディスクからファイルを削除します。

次の例は、ファイル「testfile2」を作成し、そこに「TEST」を書き込み、そしてディスクから消去する。
Sub Killfile()
Open "testfile2" For Output As #1
Print #1, "TEST"
Close #1
Kill "testfile2"
End Sub
Close #1で処理をとめ、testfile2を検索し、ノートパッドで開いてみてください。TESTと書かれたファイルができているのがわかります。その後、マクロを走らすと、testfile2が削除されているのがわかります。




◆式の値を変数やプロパティに代入するには(Letステートメント

式の値を変数やプロパティに代入します。省略可能です。

次の例は、明示的に Let ステートメントを使って、式の値を変数に代入するものです。

Dim MyStr, MyInt
' Let ステートメントを使って変数を代入します。
Let MyStr = "Hello World"
Let MyInt = 5

次に示すように、Let ステートメントを使わずに値を代入しても同じ結果が得られます。

Dim MyStr, MyInt
MyStr = "Hello World"
MyInt = 5 




◆シーケンシャルファイルからテキストを読み込むには(Line Input#ステートメント

シーケンシャル入力モード (Input) で開いたファイルから行全体を読み込み、文字列型 (String) の変数に代入するファイル入出力ステートメントです。


次の例は、Line Input # ステートメントを使って、シーケンシャル ファイルから 1 行ずつ読み込んで変数に代入しています。ファイル TESTFILE は、複数行のデータを含むテキスト ファイルと仮定します。
Sub Line_Input()
Dim TextLine
Open "c:\wk\testfile2" For Output As #1
Print #1, "TEST"
Print #1, "上手くいくかな"
Close #1
Open "c:\wk\testfile2" For Input As #1
Do While Not EOF(1)
Line Input #1, TextLine
Debug.Print TextLine
Loop
Close #1
End Sub







ファイルを開きます。
ファイルの終端までループを繰り返します。
行を変数に読み込みます。
イミディエイト ウィンドウに表示します。
ファイルを閉じます。




◆オブジェクトを呼び込むには(Loadステートメント

オブジェクトを読み込みますが、表示はしません。表示させる場合には、Showメソッドを使います。
Sub LoadForm()
Load form1
form1.Show
End Sub




◆文字列変数の値を左にそろえるには(LSetステートメント

文字列変数の値を左揃えにしたり、ユーザー定義型の変数を別のユーザー定義型の変数にコピーします。
LSet ステートメントは引数 の余った部分をスペースで埋めます。

Sub LRSet()
Dim L$, R$
L$ = String$(20, "*"): R$ = String$(20, "*")
LSet L$ = "ABC": RSet R$ = "ABC"
Cells(1, 2) = L$: Cells(2, 2) = R$
Dim MyString
MyString = String(5, "*")
MsgBox MyString
MyString = String(5, 42)
MsgBox MyString
MyString = String(10, "ABC")
MsgBox MyString
MyString = "0123456789"
LSet MyString = "<-Left"
MsgBox MyString
End Sub




◆文字列変数の一部を他の文字列に置き換えるには(Midステートメント

次の例は、Mid ステートメントを使って、文字列変数の中にある指定した文字数分の文字を他の文字列に置き換えます。Midは文字数指定で、MidBはバイト数指定。置き換える文字列には常に引数 stringvar の文字数よりも小さいか、または等しい文字列を指定します。

Sub 文字一部変更()
Dim s$
s$ = "神戸市中央区"
Cells(1, 1) = s$
Mid$(s$, 4, 3) = "灘区 "
Cells(2, 1) = s$
End Sub




◆新しいフォルダを作成するには(MkDirステートメント)

次の例は、MkDir ステートメントを使って、フォルダを作成します。ドライブが指定されない場合、新規のフォルダは、現在のドライブに作成されます。

Sub フォルダー作成()
Dim Newfol$
Newfol$ = "c:\work"
MkDir Newfol
End Sub




◆ファイル名やフォルダー名を変更するには(Nameステートメント

Name ステートメントはファイル名を変更して、必要に応じて他のフォルダにファイルを移動します。Name ステートメントでは、ドライブ間ではファイルを移動しますが、newpathname と oldbathname で指定したドライブ名が同じ場合は、単に既存のフォルダの名前を変更します。ファイルやフォルダを新しく作成することはありません。

現在、開いているファイルに対して Name ステートメントを実行すると、エラーが発生します。ファイル名を変える前に、開いているファイルを閉じてください。引数 Name には、複数の文字を指定するためのアスタリスク (*) および単一の文字を指定するための疑問符 (?) のワイルド カード文字を指定できません。


Sub 名前変更()
Name "c:\work" As "c:\walk"
End Sub
Sub 名前変更()
Name "c:\walk" As "c:\wk\work"
End Sub




◆式の値に応じて、指定した複数の行のうちのいずれかに分岐させるには(On...GoSub、On...GoToステートメント

次の例は、On...GoSub ステートメントを使ってサブルーチンに分岐し、On...GoTo ステートメントを使って行ラベルに分岐します。

Dim Number, MyString
Number = 2                ' Sub2 へ分岐します。
On Number GoSub Sub1, Sub2    ' On...GoSub の次から実行を再開します。
On Number GoTo Line1, Line2    ' Line2 へ分岐します。
' On...GoTo の次からは実行を再開しません。
Exit Sub
Sub1:
MyString = "Sub1 に分岐"
MsgBox MyString
Return
Sub2:
MyString = "Sub2 に分岐"
MsgBox MyString
Return
Line1:
MyString = "Line1 に分岐"
MsgBox MyString
Line2:
MyString = "Line2 に分岐"
MsgBox MyString
End Sub





◆ファイルを開いて、ファイルへ入出力できるようにするには(Openステートメント

ファイルを開いて、ファイルへ入出力できるようにします。

Sub Line_Input()
Dim TextLine
Open "c:\wk\testfile2" For Output As #1
Print #1, "TEST"
Print #1, "上手くいくかな"
Close #1
Open "c:\wk\testfile2" For Input As #1
Do While Not EOF(1)
Line Input #1, TextLine
Debug.Print TextLine
Loop
Close #1
End Sub







ファイルを開きます。
ファイルの終端までループを繰り返します。
行を変数に読み込みます。
イミディエイト ウィンドウに表示します。
ファイルを閉じます。


◆文字列データの既定の比較方法を設定するには(Option Compareステートメント

文字列データの既定の比較方法を設定します。モジュール レベルで使います。


次の例では、Option Compare ステートメントを使って、既定の文字列比較方法を変更します。Option Compare ステートメントは、モジュール レベルでのみ使用します。

' 文字列比較方法を Binary モードに設定します。
Option compare Binary     ' "AAA" は、"aaa" よりも小さくなります。
' 文字列比較方法を Text モードに設定します。
Option compare Text        ' "AAA" と "aaa" は、等価です。




◆モジュール内のすべての変数に対して、明示的な宣言を強制するには(Option Explicitステートメント

モジュール内のすべての変数に対して、明示的な宣言を強制します。モジュール レベルで使用します。


次の例では、Option Explicit ステートメントを使って、すべての変数を明示的に宣言するように設定します。宣言されていない変数を使うとコンパイル時にエラーが発生します。Option Explicit ステートメントは、モジュール レベルでのみ使用します。

Option explicit    ' すべての変数を明示的に宣言するようにします。
Dim MyVar            ' 変数を宣言します。
MyInt = 10        ' 宣言されていない変数を使うとエラーが発生します。
MyVar = 10        ' 宣言済みの変数であれば、エラーは発生しません。




◆データをシーケンシャルファイルに書き込むには(Print#ステートメント)

次の例は、Print # ステートメントを使って、ファイルにデータを書き込みます。

Open "TESTFILE" For Output As #1            ' シーケンシャル出力モードで開きます。
Print #1, "これはテストです。"                ' ファイルに文字列を書き込みます。
Print #1,    ' ファイルに空白行を挿入します。
Print #1, "印字領域 1"; Tab ; "印字領域 2"    ' 2 つの印字領域に分けて書き込みます。
Print #1, "皆さん" ; " " ; "こんにちは"        ' 文字列の間にスペースを挿入します。
Print #1, Spc(5) ; "スペース 5 文字"        ' 文字の前にスペースを 5 個挿入します。
Print #1, Tab(10) ; "こんにちは"            ' 10 桁目に文字列を印字します。

' ブール値、日付、Null 値、エラー値を割り当てます。
Dim MyBool, MyDate, MyNull, MyError
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' True, False, Null 値, エラー値は、国別情報の設定によって変換されます。
' 日付リテラルは、短い日付形式 (コントロールパネルで設定) を使って、書き込まれます。
Print #1, MyBool ; " は、ブール値です。"
Print #1, MyDate ; " は、日付です。"
Print #1, MyNull ; " は、Null 値です。"
Print #1, MyError ; " は、エラー値です。"
Close #1                                ' ファイルを閉じます。




◆変数の内容をランダムファイルに書き込むには(Putステートメント


次の例は、Put ステートメントを使って、データをファイルに書き込みます。この例では、ユーザー定義の Record 型の 5 つのレコードをファイルに書き込みます。


Type Record ' ユーザー定義型を定義します。
ID As Integer
Name As String * 20
End Type
Sub test()
Dim MyRecord As Record, RecordNumber ' 変数を宣言します。
' ファイルをランダム アクセス モードで開きます。
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
For RecordNumber = 1 To 5 ' ループを 5 回繰り返します。
MyRecord.ID = RecordNumber ' ID を定義します。
MyRecord.Name = "My Name" & RecordNumber ' 文字列を作成します。
Put #1, RecordNumber, MyRecord ' レコードをファイルに書き込みます。
Next RecordNumber
Close #1 ' ファイルを閉じます。
End Sub




◆乱数ジェネレータを初期化 (乱数系列を再設定) するには(Randomizeステートメント

次の例は、乱数発生ルーチンを初期化して、乱数を10個発生させます。
Sub RndMiz()
Randomize
Dim x!, i%
For i% = 1 To 10
Cells(1, i%) = Rnd * 10
Next i%
End Sub




◆プログラムのコメントを記述するには(Remステートメント

プログラム内にコメントを記述することを示します。


次の例では、Rem ステートメントを使って、プログラムのコメントを記述しています。

Dim MyStr1, MyStr2
MyStr1 = "Hello": Rem ステートメントの後にコロンを付けてコメントを記述します。
MyStr2 = "Goodbye"     ' これもコメントです。この場合、コロンは不要です。




◆Open ステートメントで開いたすべてのファイルを閉じるには(Resetステートメント

Open ステートメントで開いたすべてのファイルを閉じるファイル入出力ステートメントです。


次の例は、Reset ステートメントを使って、開いているファイルをすべて閉じて、ファイル バッファに残っている内容をディスクに書き込みます。この例では、バリアント型 (Variant) の変数 FileNumber を、文字列と数値の両方の変数として使っています。


Sub test2()
Dim FileNumber
For FileNumber = 1 To 5 ' ループを 5 回繰り返します。
' ファイルをシーケンシャル出力モードで開きます。FileNumber は、# 付きで文字列 TEST の後に付加されます。
Open "TEST" & FileNumber For Output As #FileNumber
Write #FileNumber, "こんにちは" ' データをファイルに書き込みます。
Next FileNumber
Reset ' ファイルを閉じ、内容をディスクに書き込みます。
End Sub




◆エラー処理ルーチンの終了後に、プログラムの実行を再開するには(Resumeステートメント

エラー処理ルーチンの終了後に、プログラムの実行を再開します。

次の例は、Resume ステートメントを使って、エラー処理を終了して、エラー発生位置から処理を再開します。この例では、エラー番号 55 を発生させます。

Sub ResumeStatementDemo()
    On Error GoTo ErrorHandler        ' エラー処理を行います。
    Open "TESTFILE" For Output As #1    ' 出力ファイルを開きます。
    Kill "TESTFILE"                ' 開いたファイルの削除を試みます。
    Exit Sub                        ' エラー処理ルーチンが実行されないように Sub を終了します。
ErrorHandler:                        ' エラー処理ルーチン。
    Select Case Err.Number            ' エラー番号を評価します。
        Case 55                        ' "ファイルは既に開かれています。" というエラーです。
            Close #1                ' 開いたファイルを閉じます。
        Case Else
                                    ' 他のエラー処理をここに記述します。
    End Select
    Resume                            ' エラーが発生した行から処理を再開します。
End Sub




◆既存のフォルダを削除するには(RmDirステートメント

既存のフォルダを削除するステートメントです。

指定したフォルダ内にファイルが存在していると、エラーが発生します。フォルダを削除する前に、Kill ステートメントを使用してすべてのファイルを削除してください。

次の例は、新しいフォルダを作成し、直後に削除します。
Sub removedir()
MkDir "c:\test"
RmDir "c:\test"
End Sub




◆文字列変数の値を右詰にするには(RSetステートメント

次の例は、文字列変数内の文字列を左詰にしたり右詰にしたりしてワークシートに表示します。
Sub LRset()
Dim L$, R$
L$ = String$(10, "*"): R$ = String$(10, "*")
LSet L$ = "ABC": RSet R$ = "ABC"
Cells(1, 1) = L$: Cells(2, 1) = R$
End Sub




◆Open ステートメントで開いたファイルの、次に読み込みまたは書き込みを行う位置を設定するには(Seekステートメント

Open ステートメントで開いたファイルの、次に読み込みまたは書き込みを行う位置を設定するファイル入出力ステートメントです。

次の例は、文字列をファイルに出力し、ファイルの先頭から5文字目と6文字目の2文字を読み込んで表示します。
Sub SeekData()
Dim c$
Open "test" For Output As #1
Print #1, "ABCDEFGHIJKLMN"
Close #1
Open "test" For Input As #1
Seek #1, 5
c$ = Input(2, #1)
Cells(1, 1) = c$
End Sub




◆条件式の値に従って、複数のステートメント ブロックのいずれかを実行させるには(Select Caseステートメント


次の例は、Select Case ステートメントを使って、変数の値を評価します。この例では、変数の値は必ず 2 番目の Case 節と一致します。したがって、2 番目の Case 節に記述されたステートメントだけが実行されます。

Sub SelectCase()
Dim Number
Number = 8 ' 変数を初期化します。
Select Case Number ' Number を評価します。
Case 1 To 5 ' Number の値が 1 〜 5 の場合。
Debug.Print "1 から 5 の間"
' この例では、Number に 8 を代入しているため、True と評価されるのは次の Case 節だけです。
Case 6, 7, 8 ' Number の値が 6 〜 8 の場合。
Debug.Print "6 から 8 の間"
Case 9 To 10 And Number < 11 ' Number の値が 9 または 10 の場合。
Debug.Print "9 または 10"
Case Else ' その他の値の場合。
Debug.Print "1 から 10 以外の数値"
End Select
End Sub




◆キーストロークをアクティブウインドウに渡すには(SendKeysステートメント

キーを押したときに表示されない文字 (Enter キーや Tab キーなど) または、文字ではなく動作を表すキーを指定するには、次に示すコードを使います。

キー コード
BackSpace {BACKSPACE}{BS}、または {BKSP}
Ctrl + Break {BREAK}
CapsLock {CAPSLOCK}
Del または Delete {DELETE} または {DEL}
{DOWN}
End {END}
Enter {ENTER}または {~}
Esc {ESC}
Help {HELP}
Home {HOME}
Ins または Insert {INSERT} または {INS}
{LEFT}
NumLock {NUMLOCK}
PageDown {PGDN}
PageUp {PGUP}
PrintScreen {PRTSC}
{RIGHT}
ScrollLock {SCROLLLOCK}
Tab {TAB}
{UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}

Shift キー、Ctrl キー、または Alt キーと他のキーとの組み合わせを指定するには、通常のキー コードの前に次のコードを単独、または組み合わせて記述します。

キー コード
Shift +
Ctrl ^
Alt %

Shift キー、Ctrl キー、Alt キーを押しながら他のキーを押す操作を指定するには、キーのコードをかっこで囲みます。たとえば、Shift キーを押しながら EC を押す操作を指定するには、"+(EC)" を使います。Shift キーを押しながら E を押し、その後 Shift キーを離して C を押す操作を指定するには、"+EC" を使います。

同じキー ストロークの繰り返しを指定するには、{key number} という形式を使います。keynumber の間には必ず半角のスペースが必要です。たとえば、{LEFT 42}キーを 42 回押すことを意味します。また {h 10} は、H キーを 10 回押すことを意味します。

メモ SendKeys ステートメントは、Microsoft Windows または Macintosh 上で動作するように設計されたアプリケーション以外にはキー ストロークを渡せません。また Sendkeys ステートメントは、アプリケーションに Copy キーを渡せません。


次の例は、Shell 関数を使って、Microsoft Windows に付属している電卓アプリケーションを実行します。SendKeys ステートメントでキーストロークを転送して、数値の加算を行ってから電卓アプリケーションを終了します。
Sub Sendキー()
Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1) ' 電卓を実行します。
AppActivate ReturnValue ' 電卓をアクティブにします。
For I = 1 To 20 ' ループ カウンタを設定します。
SendKeys I & "{+}", True ' 電卓にキー コードを転送して、
Next I ' I の値に 1 を加算します。
SendKeys "=", True ' 和を求めます。
SendKeys "%{F4}", True ' Alt + F4 キーを転送して電卓を終了します。
End Sub




◆オブジェクトへの参照を、変数またはプロパティに代入するには(Setステートメント

次の例は、Sheet2上のテキストボックス1に入力されているテキストを、セルA1に表示します。
Sub SetSet()
Dim abc As Object
Application.Worksheets("Sheet2").Activate
Set abc = ActiveSheet.TextBox1
Cells(1, 1) = abc.Text
End Sub




◆ファイルの属性を設定するには(SetAttrステートメント

ファイルの属性を設定します。

設定値

引数 attributes の設定値は次のとおりです。

定数 内容
vbNormal 0 (既定値) 通常ファイル
vbReadOnly 1 読み取り専用ファイル
vbHidden 2 隠しファイル
vbSystem 4 システム ファイル.。Macintosh では使用できません。
vbArchive 32 アーカイブ (属性最後にバックアップした後で、変更されたファイル)
vbAlias 64 エイリアス ファイル。Macintosh でのみ使用できます。

メモ これらの定数は、Visual Basic で定義されています。実際の数値の代わりにコードで使用することができます。

解説

開いているファイルの属性を変更しようとすると、実行時エラーが発生します。


次の例は、ドライブCにファイル「c:\test.txt」を作成し、その属性を隠しファイルに設定します。
Sub ファイル属性変更()
Open "c:\test.txt" For Output As #1
Print #1, "ABCDEFG"
Close #1
SetAttr "c:\test.txt", vbHidden
End Sub




◆静的変数を宣言するには(Staticステートメント)


静的変数を宣言します。
Static
ステートメントで宣言した変数 (静的変数) の値は、プログラムが実行されている間をとおして保持されます。

次の例で、変数a,b,cの変化の違いを確認してください。
Sheet1にコマンドボタンをつくり、以下のマクロをSheet1に貼り付けてください。そして、そのボタンを押してください。
Dim a As Integer
Private Sub CommandButton1_Click()
Dim b As Integer
Static c As Integer
a = a + 3
b = b + 3
c = c + 3
MsgBox "aの値は" & a & "  bの値は" & b & "  cの値は" & c
t1
End Sub

Private Sub t1()
Dim b As Integer
Dim c As Integer
a = a + 3
b = b + 3
c = c + 3
MsgBox "aの値は" & a & "  bの値は" & b & "  cの値は" & c
End Sub



1回目




2回目



※変数 a は モジュールレベルの変数なので、Command1_Clickでも、s1でも3ずつ加算される。
※変数 b 、変数 c は プロシージャレベルの変数なので、Command1_Clickの変数b,cとs1の変数b,cとは全く別の変数である。
※変数 b は 動的変数なので、Command1_Clickでも、s1でも入るたびに0になる。
※変数 c は 静的変数なので、Command1_Clickでは前の値を引き継いで3ずつ加算され、s1では入るたびに0になる。




◆実行を中断するには(Stopステートメント

実行を中断するフロー制御ステートメントです。

次の例は、Stop ステートメントを使って、For...Next ループを繰り返すごとに中断します。

Sub StopStop()   
Dim I
For I = 1 To 10   
Debug.Print I     
Stop
Next I
End Sub


 For...Next ループを開始します。
 カウンタ変数 I をデバッグ ウィンドウに表示します。
 ループを繰り返すごとに中断します。




◆Subプロシージャの始まりを示すには(Subステートメント

Sub プロシージャの名前、引数、およびプロシージャの本体を宣言します。


次の例は、Sub ステートメントを使って、Sub プロシージャの名前と引数を宣言し、プロシージャのコードを記述しています。

' Sub プロシージャを定義します。
' 2 つの引数を持つ Sub プロシージャになります。
Sub SubComputeArea(Length, TheWidth)
    Dim Area As Double        ' ローカル変数を宣言します。
    If Length = 0 Or TheWidth = 0 Then
        ' いずれかの変数の値が 0 の場合
        Exit Sub            ' Sub プロシージャを直ちに終了します。
    End If
    Area = Length * TheWidth    ' 四角形の面積を計算します。
    Debug.Print Area        ' 面積をデバッグ ウィンドウに表示します。
End Sub




◆システムの時刻を設定するには(Timeステートメント

次の例は、システムの時刻を11:00:00に設定します。
Sub TimeSet( )
 Time = #11:00:00#
End Sub




◆ユーザー定義型のデータ型を宣言するには(Typeステートメント)

1 つまたは複数の要素を持つユーザー定義のデータ型 (ユーザー定義型) を宣言します。モジュール レベルで使います。

次の例では、Type ステートメントを使って、ユーザー定義のデータ型を定義します。Type ステートメントは、モジュール レベルでのみ使用します。クラス モジュールで使用する場合は、Type ステートメントの直前にキーワード Private を付ける必要があります。

Type EmployeeRecord        ' ユーザー定義型を作成します。
    ID As Integer            ' データ型の要素を定義します。
    Name As String * 20
    Address As String * 30
    Phone As Long
    HireDate As Date
End Type
Sub CreateRecord()
    Dim MyRecord As EmployeeRecord    ' 変数を宣言します。

    ' 変数 EmployeeRecord への代入は、
    ' プロシージャ内に記述しなければなりません。
    MyRecord.ID = 12003            ' 要素に値を代入します。
End Sub





◆オブジェクトをメモリから削除するには(Unloadステートメント

オブジェクトをメモリから削除します。

解説

オブジェクトがアンロードされると、そのオブジェクトはメモリから削除され、オブジェクトに関連するすべてのメモリが解放されます。Load ステートメントを使用して再度メモリにロードしない限り、ユーザーはそのオブジェクトを操作できず、プログラムの中から操作することもできません。

次の例は、コードで 2 つのユーザー フォームを使用します。この例では、UserForm1 の Initialize イベントで、UserForm2 をロードし、表示します。UserForm2 をクリックするとアンロードされ、UserForm1 が表示されます。UserForm1 をクリックすると、今度はこのフォームがアンロードされます。

' これは UserForm1 の Initialize イベント プロシージャです。
Private Sub UserForm_Initialize()
    Load UserForm2
    UserForm2.Show
End Sub

' これは UserForm2 の Click イベントです。
Private Sub UserForm_Click()
    Unload UserForm2
End Sub

' これは UserForm1 の Click イベントです。
Private Sub UserForm_Click()
    Unload UserForm1
End Sub





◆ステートメントを繰り返すには(While...Wendステートメント
Sub whiletest()
Dim i%
i% = 0
While i% <= 100
Cells(6, 1) = i%
i% = i% + 1
Wend
End Sub




◆ファイルに出力する際の1行の桁数を指定するには(Width#ステートメント

Open ステートメントで開いたファイルに出力する行の幅 (桁数) を割り当てるファイル入出力ステートメントです。

次の例は、Width # ステートメントを使って、ファイルの出力行の幅を設定します。

Sub sample()
Dim I
Open "TESTFILE" For Output As #1 ' シーケンシャル出力モードでファイルを開きます。
VBA.Width 1, 5 ' 出力行の幅を 5 に設定します。
For I = 0 To 9 ' ループを 10 回繰り返します。
Print #1, Chr(48 + I); ' 1 行に 5 文字ずつ表示します。
Next I
Close #1
End Sub



◆再指定を省略するには(Withステートメント

指定したオブジェクトやユーザー定義型に対する操作、オブジェクト名やユーザー定義名の再指定を省略できます。

次の例は、With ステートメントを使って、単一のオブジェクトに対する一連のステートメントを実行します。MyObject とそのプロパティ名は、説明する目的で一般的な名前を使っています。実際にコードを記述するときには、適切な名前に置き換えてください。

With MyObject
    .Height = 100                ' MyObject.Height = 100 と同じです。
    .Caption = "Hello World"    ' MyObject.Caption = "Hello World" と同じです。
    With .Font
        .Color = Red            ' MyObject.Font.Color = Red と同じです。
        .Bold = True            ' MyObject.Font.Bold = True と同じです。
    End With
End With





◆シーケンシャルファイルにデータを書き込むには(Write#ステートメント

シーケンシャル出力モード (Output または Append) で開いたファイルにデータを書き込むファイル入出力ステートメントです。

Sub test2()
Dim FileNumber
For FileNumber = 1 To 5 ' ループを 5 回繰り返します。
' ファイルをシーケンシャル出力モードで開きます。FileNumber は、# 付きで文字列 TEST の後に付加されます。
Open "TEST" & FileNumber For Output As #FileNumber
Write #FileNumber, "こんにちは" ' データをファイルに書き込みます。
Next FileNumber
Reset ' ファイルを閉じ、内容をディスクに書き込みます。
End Sub

小技集2へ