よくあるネタですが、自分メモとして。
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(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 になる
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
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 サーバを設定するための 識別子として利用されます。
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では、ファイル出力時に Print メソッドを使用します。
Print #1, "Hello!" & vbNewLine & "Good-Bye!"
これで下のように出力されます。
Hello! Good-Bye!
ただ、ここで最後の行にも改行が入ってしまいます。 これは Print メソッドが改行を挿入するからです。
改行の挿入を止めるには、 最後にセミコロン「;」を付けます。
Print #1, "Hello!" & vbNewLine & "Good-Bye!";
Hello! Good-Bye!
これで改行が挿入されません。
VB6は今更ですが、Excel2007のVBAでも使えます。