VBS からフォルダダイアログを開く

よくあるネタですが、自分メモとして。

Const ssfDESKTOP = &H0      ' Desktop
Const ssfPERSONAL = &H5     ' My Documents
Const ssfMYPICTURES = &H27  ' My Pictures
Const ssfWINDOWS = &H24     ' Windows

Function GetNewFolderPath(IstrMessage, IlngRoot)
GetNewFolderPath = ""

    Dim objWShell, objFolder

    Set objWShell = WScript.CreateObject("Shell.Application")
    Set objFolder = objWShell.BrowseForFolder(0, IstrMessage, 0, IlngRoot)

    If (Not objFolder Is Nothing) Then
        GetNewFolderPath = objFolder.Self.Path
    End If

    Set objFolder = Nothing
    Set objWShell = Nothing

End Function

Msgbox GetNewFolderPath("Select Folder", ssfPERSONAL)

キャンセルすると空文字列が返ってくるみたいな。

VBA で使える便利な Like 演算子

VBA(VB) には文字列を比較する Like という演算子があります。 これを使用すると簡単なパターン検索なら正規表現や文字列関数を使用せずに 済ませることができます。

If "abc" Like "a??" Then ... ' ←True

[参考サイト]
Excel(エクセル)VBA入門:Findメソッド,Like演算子を使った検索

# で数字とマッチさせることができますが 全半角問わないので、厳密に半角数字をチェックする時は 次のように [] を使用します。

If "3" Like "#" Then ... ' ←True
If "4" Like "#" Then ... ' ←これも True になる

If "3" Like "[0-9]" Then ... ' ←True
If "4" Like "[0-9]" Then ... ' ←これは False になる

VBA で参照設定せずに DetaObject を使用する

Excel の VBA で クリップボードにデータを格納する場合 DetaObject を使う方法があります。

参照設定をせずに DetaObject を使う場合 次のように書きたくなりますが、 これはエラーになります。

Set Clip = CreateObject("MSFORMS.DataObject")

色々と調べてみると、次のように宣言できるようです。

CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

これを利用すれば 参照設定せずに 簡単にクリップボードに文字列を格納できます。

With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText "この文字列をクリップボードに格納します"
    .PutInClipboard
End With 

VBS から CDO コンポーネントで簡単にメールを送信する

CDO コンポーネントを使用すると VBS や VBA から簡単にメールを送信することができます。

次の表の環境で CDO コンポーネントを利用することができます。

環境CDO利用SMTPサービス
Windows 2000 Professional ○(デフォルトOK)
Windows 2000 Server ○(デフォルトOK)
Windows XP Professional ○(デフォルトOK)
Windows XP Home Edition ×
Windows Server 2003 △(要マニュアル設定)

VBS の場合、次のように書きます。

Set objCdoMessage = CreateObject("CDO.Message")
With objCdoMessage
    .From = "送信元名 <xxxxx@example.com>"
    .To = "送信先名 <yyyyy@example.com>"
    .Subject = "件名"
    .TextBody = "メッセージ"
    .Send
End With
Set objCdoMessage = Nothing

たったこれだけでメールを送ることができます。

ただし、上の表で SMTP サービスが、×になっている Windows XP Home Edition は 次のサンプルのように 外部の SMTP サービスを指定する必要があります。

Const cdoSendUsing = _
    "http://schemas.microsoft.com/cdo/configuration/sendusing"
Const cdoSmtpServer = _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver"
Const cdoSmtpServerPort = _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport"

Set objCdoMessage = CreateObject("CDO.Message")
With objCdoMessage
    .Configuration.Fields.Item(cdoSendUsing) = 2
    .Configuration.Fields.Item(cdoSmtpServer) = "mail.example.com"
    .Configuration.Fields.Item(cdoSmtpServerPort) = 25
    .Configuration.Fields.Update
    .From = "送信元名 <xxxxx@example.com>"
    .To = "送信先名 <yyyyy@example.com>"
    .Subject = "件名"
    .TextBody = "テストメッセージです"
    .Send
End With
Set objCdoMessage = Nothing

この例では mail.example.com の 25 番ポートを SMTP サーバとして指定しています。

ちなみに Const で定義している URL は アクセスするのではなく SMTP サーバを設定するための 識別子として利用されます。

VB6/VBS で、クラスのデフォルトプロパティを定義する

Java などでは、toString メソッドがあり オブジェクトを表現する文字列を返すことができます。

VB6 や VBS で、同じようにオブジェクトをメソッド無しで 指定した時に、オブジェクトの値を出力することができれば デバックなどに役に立ちそうです。

VB6 や VBS の場合、 次の例のように Default を指定して Get プロパティを作成します。 (名前は何でもOKです)

Class Test
    Public Default Property Get ToString()
         ToString = "Test Class"
    End Property
End Class

下のようにオブジェクトをメソッドなしで指定すれば、 「Test Class」と表示されます。

Dim t
Set t = New Test
Msgbox t

VB6で改行を出力しない

VB6では、ファイル出力時に Print メソッドを使用します。

Print #1, "Hello!" & vbNewLine & "Good-Bye!"

これで下のように出力されます。

Hello!
Good-Bye!

ただ、ここで最後の行にも改行が入ってしまいます。 これは Print メソッドが改行を挿入するからです。

改行の挿入を止めるには、 最後にセミコロン「;」を付けます。

Print #1, "Hello!" & vbNewLine & "Good-Bye!";
Hello!
Good-Bye!

これで改行が挿入されません。

VB6は今更ですが、Excel2007のVBAでも使えます。