Visual Basic 6.0 テクニック
VB6対応

 

Visual Basic 中学校 > VB6 テクニック >

5.知られざる関数たち

 

今回は「知られざる関数たち」と題して、使用頻度の低い関数や知名度の低い関数をいくつか紹介します。「知られざる」というのは少し大げさな表現ですのであらかじめご了承ください。

 

1.Command関数

 

この関数はコマンドラインを取得する関数です。VBでコマンドラインなどあまり使わない人も多いでしょうが実は結構役に立ちます。

まず、コマンドラインについて簡単に説明しましょう。コマンドラインとはプログラムを起動させるときに指定するオプションのようなものです。プログラムはどのようなオプションとともに起動されたか判断して処理の内容を変更することができます。このオプション、つまりコマンドラインを取得するのがCommand関数です。

 

1−1.コマンドラインの指定の仕方

 

Command関数の使用例を説明する前に、念のためにコマンドライン付きでプログラムを起動する方法を説明しましょう。

VBの開発環境でプログラムを実行するときにコマンドラインを指定して起動するにはメニューの[プロジェクト]から[○○のプロパティ」(○○には現在作成中のプロジェクト名が入る)を選択して、「実行ファイルの作成」タブをクリックします。その中のコマンドライン引数の欄に書いた文字列は開発時にもコマンドラインをして渡すことができます。

■画像1:「/test」というコマンドラインを指定。

また、コンパイルしてexeになったファイルをコマンドラインを指定して起動する主な方法は次の通りです。この例では"/test"というコマンドラインを渡して、C:\VB\Project1.exeを起動します。

1.Windowsの「ファイル名を指定して実行」で、「プログラム名 コマンドライン」と記述する。(プログラム名とコマンドラインの間に半角スペースを入れる。)例:C:\VB\Project1.exe /test

2.exeのショートカットを作り、ショートカットのプロパティで「リンク先」の欄に「プログラム名 コマンドライン」と記述して、そのショートカットからプログラムを起動する。(プログラム名とコマンドラインの間に半角スペースを入れる。)例:C:\VB\Project1.exe /test

3.Windowsのコマンドプロンプトに「プログラム名 コマンドライン」と記述する。(プログラム名とコマンドラインの間に半角スペースを入れる。)例:C:\VB\Project1.exe /test

4.VBのShell関数に「プログラム名 コマンドライン」と記述する。(プログラム名とコマンドラインの間に半角スペースを入れる。)例:C:\VB\Project1.exe /test

■表1:コマンドラインの渡し方

 

1−2.コマンドラインを受け取る方法

 

プログラムでコマンドラインを受け取るのは実に簡単です。次のようになります。

VB6対応 VB2005対応

Dim CommandLine As String

CommandLine = Command()

MsgBox CommandLine

■リスト1:コマンドラインを取得する

このコードはプログラムのどこに記述しても有効です。コマンドラインが何も指定されていなかった場合、このCommand関数は空文字を返します。

もう少し応用が利く事例を紹介しましょう。コマンドラインに「/test」が渡された場合に、テストメッセージを表示するプログラムは次のようになります。

VB6対応

Dim CommandLine As String
Dim St As String

CommandLine = Command()

If UCase(CommandLine) = "/TEST" Then
    St = "テストモードで起動されました。" & vbNewLine
    St = St & "バージョン:" & App.Major & "." & App.Minor & "." & App.Revision
    MsgBox St
End If

■リスト2:コマンドラインにより処理を分岐する

UCase関数を使用しているのはコマンドラインの大文字と小文字を区別しないためです。つまり、「/test」でも「/TEST」でも同じものと判断するわけです。逆に大文字と小文字を区別する必要がある場合はUCase関数ははずしてください。

 

1−3.コマンドラインの実際例

 

次に実際にコマンドラインがどのように使われているか紹介します。

まず、スクリーンセーバーです。スクリーンセーバーには3つの別々のモードがあります。気が付いていましたか?1つ目は普通に表示されるスクリーンセーバーのモード。これは通常モードと呼ぶことにしましょう。2つ目は画面のプロパティでスクリーンセーバーを選ぶときに表示される、小さい画面の中で表示されているスクリーンセーバー。これはプレビューモードと呼びます。最後は同じく画面のプロパティーの「設定」ボタンをクリックしたときに表示される設定画面。これは設定モードと呼ぶことにします。以上3つです。

この3つはどれも同じプログラムが別のコマンドラインで起動されたものです。 コマンドラインはWindowsが自動的に指定してスクリーンセーバを起動します。(スクリーンセーバは拡張子がscrですが、実体はexeです。)

通常モードの時には /s が、プレビューもどのときには /p 、設定モードの時には /c がコマンドラインとして送られてきます。そこでプログラムの起動時にCommand関数を使ってどのコマンドラインが送られてきたか調べることによって処理を変えることができるわけです。

 

もっと広く使われている例を紹介しましょう。それは「ドラッグされてきたファイル、フォルダ」です。

たとえば、Excelの実行ファイルやショートカットににファイルをドラッグすると    Excelが起動してそのファイルが自動的に開かれますね。Excelはどうやってドラッグされたファイルの名前を取得しているのでしょうか?Excelのプログラムは見たことがないので知りませんが(それにExcelはVBではな くVCでプログラムされている)、もし、VBで同じような処理をするなら、ドラッグされたファイル名はCommand関数で取得できるのです。(念のために確認しておきますが、exeのアイコンまたはショートカットにファイルをドロップした場合の話です。実行中のプログラムにドロップされたファイルを取得するにはCommand関数ではなくOLEDragDropイベント使います。)

それでは、ドラッグされてきた画像ファイルを自動的に開いて表示するプログラムを掲載しましょう。それは次のようなプログラムになります。

VB6対応

Private Sub Form_Load()

Me.Picture = LoadPicture(Command)

End Sub

■リスト3:ドロップされた画像ファイルを表示する

たったこれだけです!

しかし、画像ファイル以外のファイルをドラッグした場合にはエラーになってしまいます。その点は改良してみてください。

ところで、複数のファイルをドラッグした場合はどうなるのでしょうか?この場合は、各ファイル名はスペースで区切られた形で取得できます。しかし、Command関数はあまり大量の文字列を格納できないので注意が必要です。より大量の文字列を取得したいときにはAPI関数のGetCommandLineを使用するとよいでしょう。

 

1−4.コマンドラインの利用方法

 

さらに、このことを利用して、VBのプログラムから各種アプリケーションにファイルを開くように命令することができます。たとえばメモ帳でテキストファイルを開くことができます。次のようにファイル名をコマンドラインに指定するだけです。この方法はメモ帳以外のさまざまなアプリケーションで応用できます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim FileName As String

FileName = "C:\Program Files\Outlook Express\msoe.txt"
Shell Environ("WINDIR") & "\notepad.exe " & FileName, vbNormalFocus

■リスト4:メモ帳でファイルを開く

もちろん、この例ではファイルのパスとメモ帳のパスが正しくなければなりませんが、多分ほとんどの環境でそのまま動くと思います。Environ("WINDIR")はWindowsフォルダの場所を示しています。Environ関数については後述します。

同じ処理ですが、もう一つペイントでファイルを開く例も紹介しておきます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim FileName As String
Dim PaintPath As String

FileName = "C:\WINNT\隅田川.bmp"
PaintPath = Environ("WINDIR") & "\System32\MSPaint.exe"

'ペイントがSystem32\MSPaint.exe の場合
Shell PaintPath & " " & FileName, vbNormalFocus

■リスト5:ペイントでファイルを開く

ペイントの場合はWindowsのバージョンによりパスが異なるので注意が必要です。最近のバージョンではSystem32\MSPaint.exeのようですが、過去のバージョンの場合は異なります。上記の例はおそらくWindows 2000以上でのみ動作します。もちろんペイントのパスさえ変更すればWindows 95でも動作します。

 

なお、Windowsに設定されている関連付けを利用してファイルを開く方法はサンプルで公開していますので興味のある方は参照してください。

関連付けられたアプリケーションでファイルを開く

以上Command関数 およびコマンドラインの説明でしたが、もしこの説明を読んで初めてこれらを知ったのでしたらVBの世界がぐっと広がったように感じているのではないですか?

 

 

2.Environ関数

 

2−1.環境変数

 

Environ関数では環境変数の値を取得することができます。環境変数とはWindowsによりあらかじめ設定されている値のことで、たとえばユーザー名やWindowsフォルダのパスなどがあります。環境変数の内容はWindowsのバージョンや環境により大きく異なります。

一般的にVBでよく使われる環境変数には次のものがあります。

環境変数 読み方 説明
WINDIR ウィンディル Windowsフォルダのパス
COMSPEC コムスペック コマンドプロンプトのパス
TEMP テンプ Tempフォルダのパス

■表2:代表的な環境変数

ただ、「実行する環境により異なる」ので、あるパソコンで取得できた環境変数が別のパソコンでは取得できなかったりその逆もあります。つまり、ある環境では正常に動いていたプログラムが別の環境では動かなくなる危険があります。

そのため、むやみにEnviron関数で環境変数を取得するのは危険です。ただし、上記の表に掲げた3つの環境変数はWindows 98SE以上のOSならば必ず設定されています。私はEnviron関数を使うときはこの3つの環境変数以外は使用しないようにしています。

以上を踏まえればEnviron関数自体はとても簡単です。たとえば、次のようにするとWindowsフォルダのパスを取得することができます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応


MsgBox Environ("WINDIR")
 

■リスト6:環境変数WINDIRの値を表示する。つまり、Windowsフォルダのパスを表示する。

引数には環境変数の名前ではなく数値を指定することもできます。数値を指定した場合は、環境変数の順番に従って名前と値を取得します。上記の例と違って環境変数の名前も取得できる点が大きく異なるので注意してください。また、環境変数にどのような順番があるのかは不明なので、以下の例のような使い方以外は数値を指定することはまずありえないでしょう。

数値指定を使うと次のようにして実行中の環境で有効な環境変数の一覧を取得することができます。フォームにコマンドボタンを1つと、リストボックスを1つ貼り付けてください。そして、次のように記述します。

VB6対応

Private Sub Command1_Click()

    Dim K As Integer
    Dim
S As String

    Do

        K = K + 1
        S = Environ(K)
        List1.AddItem S

    Loop Until S = ""

End Sub

■リスト7:環境変数の名前と値を列挙する。

これでEnviron関数で取得できるすべての環境変数がリストボックスに表示されます。Environ関数は値が取得できなかった場合は空文字を返しますので、空文字を返すまでループを続行します。

とあるパソコン上で実行すると次のような結果を得ることができました。皆さんのマシンではどうでしょうか?

TMP=c:\windows\TEMP
TEMP=C:\windows\TEMP
PROMPT=$p$g
winbootdir=C:\WINDOWS
COMSPEC=C:\WINDOWS\COMMAND.COM
BLASTER=I10
PATH=C:\DLPROG~1\ACTIV ・・・(長いので省略)
CMDLINE=WIN
windir=C:\WINDOWS

 

2−2.COMSPECの用法

 

環境変数の中でもCOMSPECは一番応用が利きます。COMSPECを利用してVBからコマンドプロンプトにコマンドを発行することができるからです。COMSPECを使用したトリッキーなプログラムもしばしば目にします。

VBからコマンドプロンプトを扱う方法はそれだけで独立した記事になりそうですが、ここでは単純な使い方だけ説明しましょう。

次の例ではA.txtとB.txtを合体させたファイルC.txtを作成します。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim FileName1 As String
Dim FileName2 As String
Dim FileName3 As String

FileName1 = "C:\Test\A.txt"
FileName2 = "C:\Test\B.txt"
FileName3 = "C:\Test\C.txt"

Shell Environ("COMSPEC") & " /C COPY " & FileName1 & " + " & FileName2 & " " & FileName3

■リスト8:コマンドプロンプトを使ってファイルを結合する

この例のようにDOSのコマンドをそのままVBから使えるのですから応用が広いわけです。

しかし、コマンドプロンプトを操る方法は、DOSコマンドに熟知していない場合は危険が伴います し、コードの可読性が著しく低下する場合があります。さらに、デバッグが困難になる場合もあります。ですから特段の事情がない限りこの例のような方法は使用しないことをお勧めします。

念のためにこれと同じ処理をVBのみで記述する例を紹介しておきます。

VB6対応

Dim FileName1 As String
Dim FileName2 As String
Dim FileName3 As String
Dim B1() As Byte
Dim B2() As Byte
Dim Fn As Integer

FileName1 = "C:\Test\A.txt"
FileName2 = "C:\Test\B.txt"
FileName3 = "C:\Test\C.txt"

Fn = FreeFile()

Open FileName1 For Binary As #Fn
    ReDim B1(LOF(Fn) - 1)
    Get #Fn, , B1
Close #Fn

Open FileName2 For Binary As #Fn
    ReDim B2(LOF(Fn) - 1)
    Get #Fn, , B2
Close #Fn

Open FileName3 For Binary As #Fn
    Put #Fn, , B1
    Put #Fn, , B2
Close #Fn

■リスト9:VBでファイルを結合する

「同じ処理」といってもファイルが存在しない場合などの反応は異なります。

 

3.IIF関数

 

Excelのワークシート関数などをお使いの人にはこの関数はすぐに使いこなせます。この関数はIF文に似ているのですが、「関数」であるという点に特徴があります。まず構文から見ていただきましょう。


IIF (条件式 , 値1 , 値2)
 

条件式が真(TRUE)のときこの関数は値1を返し、偽(FALSE)のとき値2を返します。これと同じことはIF文でもできますが、IF文でやる場合には全部で5行くらい必要ですから、IIF関数はコンパクトな関数と呼べるでしょう。(その代わり、値1、値2が長い場合みにくくなります)。

では具体的なプログラム例を紹介しましょう。次のプログラムは与えられた日が月末かどうか判断して表示するプログラムです。

VB6対応

Dim TestDate As Date

TestDate = #6/30/2000#

MsgBox IIF( Month(TestDate + 1) = Month(TestDate) , "月末じゃない" , "月末です")

■リスト10:日付が月末かどうか判断する

 日付のところをいろいろ変えて試してみてください。同じことをIF文でやったらもっと長いプログラムになっていることでしょう。

ところで、条件式はややトリッキーなので念のために説明しておきます。Month関数は指定した日付の「月」を数字で返すものです。たとえば、Month(#1/31#) = 1 ,Month(#2/6#) = 2 です。ところで、月末に1日をたすと月が変わりますから、「ある日付に1をたして、月が変わるか」を調べればその日が月末かどうかわかるわけです。これが、Month(TestDate + 1) = Month(TestDate) の部分というわけです。

あと、#6/30/2000#は日付リテラルです。文字列を " " でくくるように、日付は# #でくくるのですね。

月末かどうか判断するもっとうまい方法があるかもしれません。知っている方はぜひ掲示板にて教えてください。VBにはEOM関数(指定した日付の月末を返す関数)がないのでこんなものでしょうか?

話を戻します。IIF関数の値は数値でもよいので、面倒くさいコードを簡略化することができます。たとえば、オプションボタンがチェックされているかいないかによって代入する数値を変えたいことがあります。このとき、IF文を使いますと、

VB6対応

If Option1.Value Then

K = 1

Else

K = 2

End If

■リスト11:通常のIf

のようになるわけです。この場合は短くすむので、

VB6対応


If Option1.Value Then K = 1 Else K = 2
 

■リスト12:簡略化したIf

のように1行で書いてもよいですが。

これをIIF関数を使うと次のようにすっきりさせることができます。

VB6対応


K = IIF(Option1.Value, 1, 2)
 

■リスト13:IIF関数

なかなか使い出がありますね。皆さんもいろいろ工夫してみてください。

なお、IIF関数の第2引数、第3引数に関数を指定した場合は第1引数の真偽にかかわらす両方の関数が実行されてしますようです。返される値はもちろん第1引数の真偽によるのですが、実行しなくてもよい関数を実行してしまうというのは困り者です。この点注意してください。

たとえば、次のようなコードを記述してははいけません!

VB6対応

'悪い例

Private Sub Command1_Click()

    K = IIF(True, 1, CalcEnd)

End Sub

Private Function CalcEnd()

End

End Function

■リスト14:注意が必要なIIFの使用例

このコードを実行するとプログラマーの期待に反してコマンドボタンをクリックするとプログラムが終了してしまいます!

 

4.Timer関数

 

この関数はCommand関数といっしょで引数がないのでいきなり使えます。

VB6対応


MsgBox Timer
 

■リスト15:午前0時からの経過秒を表示する

は有効なコードです。

Timer関数は午前0時から経過した秒数を返してくれる関数です。前回も少し出てきましたね。Timer関数の優れたところは戻り値がSingle型、つまり、小数点以下の値も取得できるという点にあります。使い方はその人次第ですのでいろいろ試してみてください。私が提案するTimer関数の使用例は前回(4.ワンポイント)の「6.プログラムの実行を指定した時間だけ中断させる」に掲載されています。

ちょっと経過時間を計りたいくらいの時にはタイマーコントロールを配置しないでTimer関数を使えばよいわけですから、活用しましょう。

ところで、もっと正確な値を知りたいときにはAPI関数のGetTickCountを使うとよいでしょう。こちらの関数はWindowsが起動してからの時間をなんとミリ秒単位で取得できるという優れものです。こちらも引数はないのでAPI関数にもかかわらず、使い方はかんたんです。以下にサンプルを掲載しておきますので試してみてください。

VB6対応

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()

MsgBox GetTickCount

End Sub

■リスト16

 

5.Partition関数

 

この関数は普段はまったく使わないでしょうが、便利なときには便利です。

簡単に説明するとこの関数は、「ある群数列において、ある数字がどの群に属するか」を返します。

たとえば、次のような群数列を想定してください。

1 2 3 , 4 5 6 , 7 8 9 , 10 11 12 , 13 14 15 , ・・・ 100

さて、問題です。9が属する群の最初の数は何でしょう? 見ればわかりますね。7です。

それでは、56が属する群の最初の数は? これはちょっと頭をひねりそうです。中学入試にはこの手の問題はよく出るので中学入試経験者は昔を思い出しながら自力で解くのも面白いでしょう(私自身は中学入試を経験していません)。

この問題の答えはPartition関数を使って次のように表現することができます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応


MsgBox Partition(56, 1, 100, 3)
 

■リスト17

このコードを実行すると 55: 57 と表示されますね。つまり、56は55〜57の群に属しているというわけです。

もう一度、今度はしっかり説明しましょう。

Partition (Number , Start , Stop , Interval)

StartからStopまでIntervalごとに区切られている群数列で、Numberがどの群に属するかを文字列で返す。

 

ところでこの関数の実用的な応用ってどんなものでしょうか。実はあまり思いつきません。それでもこの関数を紹介した手前一応なにかは示しておきたいと考えます。

1年を3日区切りにする場合を考えて見ます。つまり3日周期で何かするというわけです。それでは12月24日の含まれる3日間は何日から始まるでしょうか?

この問題に対してPartition関数を使うと次のようなプログラムができます。(このプログラム中で使われているSplit関数はVB6でなければ使えません)。

VB6対応

Dim St As String

Dim Spt() As String

St = Partition(#12/24/2000#, #1/1/2000#, #12/31/2000#, 3)

Spt = Split(St, ":")

MsgBox CDate(Spt(0))

■リスト18

このコードを実行すると、00/12/23 と表示されます。これが答えというわけです。もちろんPartition関数を使わなくてもできますが、使ったほうが短くてすむしコードもすっきりします。3日区切りでなく、7日区切りとかならある程度の実用性はあるかもしれませんね。

実用的な例を思いついた方は是非掲示板にてお知らせください。

 

6.Split関数

 

この関数はとても「知られざる」とは言えない有名な関数なのですが、VB6からの新顔であり、とても便利であることからこの場で紹介することにします。

この関数の機能は文字列を区切るということです。たとえば、次のような文字列があったとしましょう。

C:\Windows\System\Kernel32.dll

この文字列は \ で区切られた4つの部分からできています。Split関数はこのような文字列を自動的に区切ってくれます。

この例で、

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim Spt() As String

Dim S As String

S = "C:\Windows\System\Kernel32.dll"

Spt = Split(S, "\")

■リスト19:標準的なSplit関数の使用例

と記述すると、

Spt(0) = "C:"

Spt(1) = "Windows"

Spt(2) = "System"

Spt(3) = "Kernel32.dll"

となるわけです。こんなことができるのだから便利な世の中になったものです。もちろんSplit関数を使わなくても同様の処理はできますが、スピード、簡潔さなどほとんどの点でSplit関数に軍配が上がります。

この例を使って小さなサンプルをもう2つだけ紹介します。

まず、Splitの結果いくつの部分に分解されたかは次のようにして判断できます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim Spt() As String
Dim S As String
S = "C:\Windows\System\Kernel32.dll"
Spt = Split(S, "\")

MsgBox UBound(Spt) + 1 & "個の部分に分解されました。"

■リスト20

これは配列の扱い方からすれば常識的な処理ですね。

さらに、配列を介さないで直接分解された1部分を取得することもできます。次の例では2番目の要素を取得します。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim S As String
S = "C:\Windows\System\Kernel32.dll"

MsgBox Split(S, "\")(1)

■リスト21:配列を介さないSplit関数の使用例

この例では「Windows」と表示されます。

 

さて、以上はファイルパスの例でしたが他にSplit関数が活躍する場面としてどんなシーンが想像できるでしょうか?ぱっとは思いつきませんが結構いろいろあるものです。そこで私の活用法を1つ紹介します。

ある文字列について、特定の場所だけ取り出したい場合があります。たとえば、"Country=Japan"という文字列があったとしましょう。Japanだけ取り出すのはどうしたらよいでしょうか?

もちろんオーソドックスな手法ではMid関数を使います。Mid関数を使うと次のようにしてJapanだけを取り出すことができます。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応


Mid("Country=Japan", 9, 5)
 

■リスト22

しかし、9とか5とかマジックナンバーが混入することを嫌う人もいるのではないでしょうか。この場合、5のほうはLen関数を使って、Len(X) - 9 + 1 のようにして計算で求めることができますが、9の方は無理です。求めたかったら何行かにわたってループするロジックを組む必要があります。

ところが、Split関数を使うと次のようになります。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

Dim Spt() As String

Spt = Split("Country=Japan","=")

■リスト23

これでSpt(1)には "Japan"が格納されるというわけです。おまでにSpt(0)には"Country"が格納されているのですから優れものです。

 

7.StrReverse関数

 

この関数もVB6からの登場です。ちょっと面白い関数なのですが使う場面があまりありません。

この関数は引数に文字列を取り、その文字列を逆さにした文字列を返します。

たとえば、

StrReverse("あいうえお")

は、文字列 "おえういあ" を返します。

さて、これがなんの役に立つのでしょうか。私が思うに、逆引き検索のときに威力を発揮しそうです。しかし私自身はそのようなソフトを作ったことがないので実際にどう役に立つかはわかりません。他には思いつきません。誰かこの関数を便利に使っている方は是非活用法を教えてください。

 

8.Mainプロシージャ

 

最後は、関数ではなく「プロシージャ」です。まぁ関数もプロシージャも似たようなものなのでここに載せてみました。

Mainプロシージャはプログラムが開始される一番最初に呼び出されるプロシージャとして設定できます。

通常、特に何も設定していなければプログラムは最初にあるフォームのForm_Loadイベントプロシージャから始まると考えます。

「考えます」といったのは正確でないからで、あまり使いませんが、これより前にInitializeイベントが発生していてそのイベントプロシージャに書き込んだコードはForm_Loadより先に実行されます。なお、プログラムを実行しただけで、Initialize, Load, Resize, Activate, Paint の各イベントはこの順番で自動的に発生します。(よくわかりませんがMouseMoveが自動的に発生する場合もあるようです)。

しかし、フォームを使わないプログラムというものもありますし、フォームを使うにしてもフォームから始めたくない場合もあるかもしれません。そんなときフォームの変わりにプログラムをスタートする場所として指定できるのがMainプロシージャです。

このMainプロシージャからプログラムを開始するには次のような手順を踏む必要があります。

1.標準モジュールを追加します。

2.標準モジュールの中にMainプロシージャを自分で記述します。

    例えば次のようになります。

Sub Main()

End Sub

3.[プロジェクト]メニューの「○○のプロパティ」(○○の所には現在開発中のプロジェクトの名前が入っています)を選択して、「全般」タグの「スタートアップの設定」の欄にSub Mainを選ぶ。

■画像2:スタートアップにSub Mainを設定

以上の手順でプログラムはMainプロシージャから実行されるようになります。

 

9.最後に

 

この他にも知られざる関数はたくさんあります(?)。オブジェクトブラウザを見ればすべての関数が表示されていますので参考にすればよいでしょう。(ただし、別名のある関数の場合、オブジェクトブラウザには別名は表示されないようです)。

簡単にいくつか紹介すると次のようなものがあります。みなさんはこの中の関数をいくつ知っていましたか?この中には掲示板にて知らせていただいた関数も含まれています。みなさんも発掘して教えてください。

関数 読み方 説明
_B_Str_Mid   Mid$の別名。xxx$という関数にはこのように_B_Str_xxxという別名があるようです。例:_B_Str_Oct, B_Str_Error

MsgBox [_B_Str_Mid]("VBSchool", 3, 6)

AddressOf アドレスオブ 関数のアドレスを返します。(関数のように使えますが、実際は関数ではなく演算子です)
Choose チューズ 複数のものの中から1つを返します。Select Caseを関数化したようなものです。

S = Choose(i, "一月", "二月", "三月",……)

Format フォーマット 書式を整形します。Format関数自体は有名ですが使い方には知名度の低い用法がいくつかあります。

次の2つの式がどのような値を返すのか確かめてみるのも一興です。
Format("vb6.0", "!>@@@@@@@@(since 1998)")
Format(-1200, "#,0;▲#,0")

Join ジョイン 配列を結合して1つの文字列にします。
StrPtr   文字列のアドレスを返します。他にIntPtrVarPtrもあります。
Switch スウィッチ If ElseIfを関数化したようなものです。

他には、DDB, MIRRなど金融系の関数も用意されています。

この中でもAddressOfがVB5で始めて登場したときにはVBの限界を打ち破った画期的な関数として大変注目されたものです。ただし使い方は難しいので初級の方は注意してください。

あと、オブジェクトブラウザには「すべての関数が表示される」と書きましたが、実は隠されている関数もあります。隠されている関数を表示させるにはオブジェクトブラウザ上で右クリックして「非表示のメンバを表示」をクリックします。StrPtr()関数はこの隠されたメンバの一人で、_HiddenModuleという怪しげなものに所属しています。