MW211 EXIT

devlog
VBScript/VBS自身の位置
2023年09月07日
WSHのCurrentDirectoryでもいけそうなのだが…
┌──────────────────────────────────────┐
│Dim objWSH                                                                  │
│Set objWSH = WScript.CreateObject("WScript.Shell")                          │
│MsgBox objWSH.CurrentDirectory                                              │
└──────────────────────────────────────┘
他から呼ばれた場合(*1)に、呼ばれた場所が採用されてしまう。

そのファイル自身の位置を取得するには以下がよい。
┌──────────────────────────────────────┐
│Dim objFSO                                                                  │
│Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")             │
│MsgBox objFSO.getParentFolderName(WScript.ScriptFullName)                   │
└──────────────────────────────────────┘

*1:コマンドプロンプトから実行した場合など
┌──────────────────────────────────────┐
│cscript //nologo VBSCriptファイル.vbs 引数                                  │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/ArrayListが使えない
2023年08月30日
配列を簡単に使えるArrayListだが、一部の環境では使えない場合がある。
#「.Net Framework 3.5」が必要だったりするようだが

使えるかどうかを確認するのは以下のような感じのVBScriptを実行すればよい。
┌──────────────────────────────────────┐
│Dim theArray                                                                │
│Set theArray = CreateObject("System.Collections.ArrayList")                 │
│Call theArray.Add("Array")                                                  │
│Call theArray.Add("List")                                                   │
│Call theArray.Add("が使えるよ!")                                           │
│MsgBox Join(theArray.ToArray(), "、")                                       │
└──────────────────────────────────────┘
使えない場合はエラーが発生する。
分類:WSH・VBS
VBScript/ファイルを一行ずつ読むⅡ
2022年06月10日
改行コードを認識して(LFにまるめて)ファイルを一行ずつ読む方法。
(全行を一旦配列に読み込む方式となってしまう)
UTF-8も対応(先頭のBOMで認識)。
┌──────────────────────────────────────┐
│Const adTypeBinary = 1        ' バイナリとして読込                          │
│Const adTypeText = 2          ' テキストとして読込                          │
│Const adReadAll = -1          ' 全行読込                                    │
│Const adReadLine = -2         ' 一行読込                                    │
│Const adCR = 13               ' 改行CR                                      │
│Const adCRLF = -1             ' 改行CRLF                                    │
│Const adLF = 10               ' 改行LF                                      │
│'***************************************************************************│
│'  メイン処理                                                               │
│'***************************************************************************│
│Dim objFile, theLine                                                        │
│Set objFile = New ClassFile                                                 │
│objFile.Init("ファイルパス")      ' ★ファイルパスを指定                    │
│Set theLine = objFile.Fetch()     ' 明細行一件目読込                        │
│Do While Not theLine Is Nothing                                             │
│    ' ★処理を実装                                                          │
│    Set theLine = objFile.Fetch() ' 明細行二件目以降読込                    │
│Loop                                                                        │
│Set objFile = Nothing                                                       │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:データベース                                                     │
│'***************************************************************************│
│Class ClassFile                                                             │
│    Private mIsOk, mLines, mIndex, mPath                                    │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        mIsOk = False                                                       │
│        Set mObjStream = WScript.CreateObject("ADODB.Stream")               │
│        ' ★改行コード(以下のいずれかを指定)                                │
│        mObjStream.LineSeparator = adCR     ' 改行CR                        │
│        mObjStream.LineSeparator = adCRLF   ' 改行CRLF(既定)                │
│        mObjStream.LineSeparator = adLF     ' 改行LF                        │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  準コンストラクタ                                                     │
│    '=======================================================================│
│    Public Sub Init(inPath)                                                 │
│        mPath = inPath                                                      │
│        '-------------------------------------------------------------------│
│        Dim allText                                                         │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        '-------------------------------------------------------------------│
│        '  文字コード識別(先頭BOMでUTF-8を)                                 │
│        '-------------------------------------------------------------------│
│        If IsExistBom(inPath) Then                                          │
│            objStream.Charset = "UTF-8"                                     │
│        Else                                                                │
│            objStream.Charset = "SHIFT_JIS"                                 │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        '  全件読込                                                         │
│        '-------------------------------------------------------------------│
│        With objStream                                                      │
│            .Type = adTypeText                                              │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            allText = .ReadText(adReadAll)                                  │
│            .Close                                                          │
│        End With                                                            │
│        '-------------------------------------------------------------------│
│        '  改行コードをLFに統一し配列化                                     │
│        '-------------------------------------------------------------------│
│        allText = Replace(allText, vbCrLf, vbLf, 1, -1, vbBinaryCompare)'CRLF→LF
│        allText = Replace(allText, vbCr, vbLf, 1, -1, vbBinaryCompare)  'CR  →LF
│        mLines = Split(allText, vbLf, -1, vbBinaryCompare)                  │
│        mIndex = 0                                                          │
│        '-------------------------------------------------------------------│
│        '  ヘッダ読込                                                       │
│        '-------------------------------------------------------------------│
│        mIsOk = True                                                        │
│        If Not ReadHeader() Then                                            │
│            mIsOk = False                                                   │
│        End If                                                              │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  内部メソッド:ヘッダの読込                                           │
│    '=======================================================================│
│    Private Function ReadHeader()                                           │
│        If mIndex >= UBound(mLines) Then                                    │
│            MsgBox "空っぽです" & vbCrLf & mPath, vbCritical, "エラー"      │
│            ReadHeader = False                                              │
│            Exit Function                                                   │
│        End If                                                              │
│        Do Until mIndex >= UBound(mLines)                                   │
│            If mLines(mIndex) = "ID,…" Then  ' ★想定する見出と照合        │
│                ReadHeader = True                                           │
│                mIndex = mIndex + 1 ' 次へ                                  │
│                Exit Function                                               │
│            End If                                                          │
│            mIndex = mIndex + 1 ' 次へ                                      │
│        Loop                                                                │
│        MsgBox "これは対象ファイルではありません。" & vbCrLf _              │
│             & vbCrLf _                                                     │
│             & mPath, vbCritical, "処理スキップ"                            │
│        ReadHeader = False                                                  │
│    End Function                                                            │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:実行                                                       │
│    '=======================================================================│
│    Public Function Fetch()                                                 │
│        If Not mIsOk Then                                                   │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        ' EOF                                                               │
│        If mIndex >= UBound(mLines) Then                                    │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        Set Fetch = mLines(mIndex)                                          │
│        mIndex = mIndex + 1 ' 次へ                                          │
│    End Function                                                            │
│    '=======================================================================│
│    '  内部メソッド:BOMの存在チェック                                      │
│    '=======================================================================│
│    Private Function IsExistBom(inPath)                                     │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        Dim bin, data                                                       │
│        bin = vbNullString                                                  │
│        With objStream                                                      │
│            .Type = adTypeBinary                                            │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            If .Size >= 3 Then                                              │
│                data = .Read(3)                                             │
│                bin = Hex(AscB(MidB(data, 1, 1))) _                         │
│                    & Hex(AscB(MidB(data, 2, 1))) _                         │
│                    & Hex(AscB(MidB(data, 3, 1)))                           │
│            End If                                                          │
│            .Close                                                          │
│        End With                                                            │
│        IsExistBom = (bin = "EFBBBF")                                       │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/ファイルを一行ずつ読む
2022年06月09日
改行コードを指定してファイルを一行ずつ読む方法。
UTF-8も対応(先頭のBOMで認識)。
┌──────────────────────────────────────┐
│Const adTypeBinary = 1        ' バイナリとして読込                          │
│Const adTypeText = 2          ' テキストとして読込                          │
│Const adReadAll = -1          ' 全行読込                                    │
│Const adReadLine = -2         ' 一行読込                                    │
│Const adCR = 13               ' 改行CR                                      │
│Const adCRLF = -1             ' 改行CRLF                                    │
│Const adLF = 10               ' 改行LF                                      │
│'***************************************************************************│
│'  メイン処理                                                               │
│'***************************************************************************│
│Dim objFile, theLine                                                        │
│Set objFile = New ClassFile                                                 │
│objFile.Init("ファイルパス")      ' ★ファイルパスを指定                    │
│Set theLine = objFile.Fetch()     ' 明細行一件目読込                        │
│Do While Not theLine Is Nothing                                             │
│    ' ★処理を実装                                                          │
│    Set theLine = objFile.Fetch() ' 明細行二件目以降読込                    │
│Loop                                                                        │
│Set objFile = Nothing                                                       │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:データベース                                                     │
│'***************************************************************************│
│Class ClassFile                                                             │
│    Private mIsOk, mObjStream, mPath                                        │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        mIsOk = False                                                       │
│        Set mObjStream = WScript.CreateObject("ADODB.Stream")               │
│        ' ★改行コード(以下のいずれかを指定)                                │
│        mObjStream.LineSeparator = adCR     ' 改行CR                        │
│        mObjStream.LineSeparator = adCRLF   ' 改行CRLF(既定)                │
│        mObjStream.LineSeparator = adLF     ' 改行LF                        │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  準コンストラクタ                                                     │
│    '=======================================================================│
│    Public Sub Init(inPath)                                                 │
│        mPath = inPath                                                      │
│        If IsExistBom(inPath) Then                                          │
│            mObjStream.Charset = "UTF-8"                                    │
│        Else                                                                │
│            mObjStream.Charset = "SHIFT_JIS"                                │
│        End If                                                              │
│        With mObjStream                                                     │
│            .Type = adTypeText                                              │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│        End With                                                            │
│        '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -│
│        mIsOk = True                                                        │
│        If Not ReadHeader() Then                                            │
│            mIsOk = False                                                   │
│        End If                                                              │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  内部メソッド:ヘッダの読込                                           │
│    '=======================================================================│
│    Private Function ReadHeader()                                           │
│        If mObjStream.EOS Then                                              │
│            MsgBox "空っぽです" & vbCrLf & mPath, vbCritical, "エラー"      │
│            ReadHeader = False                                              │
│            Exit Function                                                   │
│        End If                                                              │
│        Dim theLine                                                         │
│        theLine = mObjStream.ReadText(adReadLine)                           │
│        Do Until mObjStream.EOS                                             │
│            If theLine = "ID,…" Then  ' ★想定する見出と照合               │
│                ReadHeader = True                                           │
│                Exit Function                                               │
│            End If                                                          │
│            theLine = mObjStream.ReadText(adReadLine)                       │
│        Loop                                                                │
│        MsgBox "これは対象ファイルではありません。" & vbCrLf _              │
│             & vbCrLf _                                                     │
│             & mPath, vbCritical, "処理スキップ"                            │
│        ReadHeader = False                                                  │
│    End Function                                                            │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│        mObjStream.Close                                                    │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:実行                                                       │
│    '=======================================================================│
│    Public Function Fetch()                                                 │
│        If Not mIsOk Then                                                   │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        ' EOF                                                               │
│        If mObjStream.EOS Then                                              │
│            Set Fetch = Nothing                                             │
│            Exit Function                                                   │
│        End If                                                              │
│        '-------------------------------------------------------------------│
│        Set Fetch = mObjStream.ReadText(adReadLine)                         │
│    End Function                                                            │
│    '=======================================================================│
│    '  内部メソッド:BOMの存在チェック                                      │
│    '=======================================================================│
│    Private Function IsExistBom(inPath)                                     │
│        Dim objStream:  Set objStream = WScript.CreateObject("ADODB.Stream")│
│        Dim bin, data                                                       │
│        bin = vbNullString                                                  │
│        With objStream                                                      │
│            .Type = adTypeBinary                                            │
│            .Open                                                           │
│            .LoadFromFile inPath                                            │
│            .Position = 0                                                   │
│            If .Size >= 3 Then                                              │
│                data = .Read(3)                                             │
│                bin = Hex(AscB(MidB(data, 1, 1))) _                         │
│                    & Hex(AscB(MidB(data, 2, 1))) _                         │
│                    & Hex(AscB(MidB(data, 3, 1)))                           │
│            End If                                                          │
│            .Close                                                          │
│        End With                                                            │
│        IsExistBom = (bin = "EFBBBF")                                       │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/Outlookメーラ起動
2021年08月03日
以下のような感じで。
┌──────────────────────────────────────┐
│Dim objOutlook: Set objOutlook = CreateObject("Outlook.Application")        │
│Dim objMail:    Set objMail = objOutlook.CreateItem(olMailItem)             │
│With objMail                                                                │
│    .BodyFormat = 1                                     'プレーンテキスト   │
│    .To = "TO宛先アドレス"                                                  │
│    .Cc = "CC宛先アドレス"                                                  │
│    .Subject = "件名"                                                       │
│    .Body = "本文"                                                          │
│    .Attachments.Add("添付ファイルのパス")                                  │
│    .ReplyRecipients.Add(.Session.CurrentUser.Address)  '返信先(自分)       │
│    .ReplyRecipients.Add("返信先アドレス")                                  │
│    .Display                                            '編集中メール起動   │
│End With                                                                    │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/連想二次元配列
2021年02月05日
キーの配下にスカラ配列がぶら下がるテーブルをクラスで実装した例。
┌──────────────────────────────────────┐
│Option Explicit                                                             │
│Dim objTable                                                                │
│Set objTable = New ClassTable                                               │
│Call objTable.Insert("尾張", "織田信長")                                    │
│Call objTable.Insert("尾張", "豊臣秀吉")                                    │
│Call objTable.Insert("三河", "徳川家康")                                    │
│Dim row, column                                                             │
│Set row = objTable.GetList("尾張")                                          │
│For Each column In row                                                      │
│    MsgBox column                                                           │
│Next                                                                        │
│Set row = objTable.GetList("三河")                                          │
│For Each column In row                                                      │
│    MsgBox column                                                           │
│Next                                                                        │
│WScript.Quit(0)                                                             │
│'***************************************************************************│
│'  クラス:連想二次元配列                                                   │
│'***************************************************************************│
│Class ClassTable                                                            │
│    Private mTable                                                          │
│    '=======================================================================│
│    '  コンストラクタ                                                       │
│    '=======================================================================│
│    Private Sub Class_Initialize                                            │
│        Set mTable = CreateObject("Scripting.Dictionary")                   │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  デストラクタ                                                         │
│    '=======================================================================│
│    Private Sub Class_Terminate                                             │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:追加                                                       │
│    '=======================================================================│
│    Public Sub Insert(inKey, inValue)                                       │
│        If Not mTable.Exists(inKey) Then                                    │
│            Set mTable(inKey) = CreateObject("System.Collections.ArrayList")│
│        End If                                                              │
│        Call mTable(inKey).Add(inValue)                                     │
│    End Sub                                                                 │
│    '=======================================================================│
│    '  メソッド:取得                                                       │
│    '=======================================================================│
│    Public Function GetList(inKey)                                          │
│        Set GetList = mTable(inKey)                                         │
│    End Function                                                            │
│    '=======================================================================│
│End Class                                                                   │
│'***************************************************************************│
└──────────────────────────────────────┘
分類:WSH・VBS
WSH/まわりのファイルを検索
2021年01月18日
そのVBScriptファイルが存在するファイルのまわりのファイルを検索する雛形。
┌──────────────────────────────────────┐
│Dim objWSH:   Set objWSH = WScript.CreateObject("WScript.Shell")            │
│Dim objShell: Set objShell = WScript.CreateObject("Shell.Application")      │
│Dim objFSO:   Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
│Dim objFolder, objFile                                                      │
│Set objFolder = objFSO.GetFolder(objWSH.CurrentDirectory)                   │
│For Each objFile In objFolder.Files                                         │
│    If objFSO.GetFileName(objFile) <> WScript.ScriptName Then               │
│        MsgBox objFSO.GetFileName(objFile)         & vbCrLf & vbCrLf _      │
│             & vbCrLf _                                                     │
│             & objFile                             & vbCrLf & vbCrLf _      │
│             & objFSO.GetParentFolderName(objFile) & vbCrLf & vbCrLf _      │
│             & objFSO.GetBaseName(objFile)         & vbCrLf & vbCrLf _      │
│             & objFSO.GetExtensionName(objFile)                             │
│    End If                                                                  │
│Next                                                                        │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/カレントディレクトリの罠
2020年08月23日
┌──────────────────────────────────────┐
│Dim SHELL                                                                   │
│Set SHELL = WScript.CreateObject("Wscript.Shell")                           │
│MsgBox SHELL.CurrentDirectory                                               │
└──────────────────────────────────────┘
上記みたいにカレントディレクトリを取得する場合
Windowsタスクスケジューラから実行すると
「C:\Windows\system32」とかになるから気をつけろ~!
分類:WSH・VBS
VBScript/スカラ配列ArrayList
2020年08月21日
動的に配列を使う場合、Dimでスカラ配列を定義し、ReDimで都度都度拡張、
そして末尾に位置付けて(添字を計算して)追加、…みたいな作業が
あまりに今風でなくてVB系はいけてないと思っていたのだが
ArrayListクラスオブジェクトを使うともっと簡単にできると知った。
┌──────────────────────────────────────┐
│Dim theArray                                                                │
│Set theArray = CreateObject("System.Collections.ArrayList")                 │
│Call theArray.Add("東京")                                                   │
│Call theArray.Add("大阪")                                                   │
│Call theArray.Add("名古屋")                                                 │
│MsgBox Join(theArray.ToArray(), "、")                                       │
└──────────────────────────────────────┘
分類:WSH・VBS
VBScript/多次元連想配列
2020年08月20日
  設定方法は以下の通り。
┌──────────────────────────────────────┐
│Dim theDic                                                                  │
│Set theDic = CreateObject("Scripting.Dictionary")                           │
│Set theDic("キー1") = CreateObject("Scripting.Dictionary")                  │
│theDic("キー1")("キー2") = 値                                               │
└──────────────────────────────────────┘

  参照方法は以下の通り。
┌──────────────────────────────────────┐
│Dim key                                                                     │
│key = "キー1"                                                               │
│If theDic.Exists(key) Then                                                  │
│    MsgBox theDic(key)("キー2")                                             │
│End If                                                                      │
├──────────────────────────────────────┤
│Dim key                                                                     │
│For Each key In theDic                                                      │
│    MsgBox theDic(key)("キー2")                                             │
│Next                                                                        │
└──────────────────────────────────────┘
分類:WSH・VBS
前へ 1 2 次へ