RPAで業務を効率化って、専用ソフトとか無くてもソコソコできますよ（その2）

## つづき

[前回](https://qiita.com/Kiyotaka/items/79b506ca67c8a05f5a8b) にひきつづき、VBScriptによる自動化用のクラスまとめです。

## ネットワーク関連

会社の業務自動化だと「認証の必要な共有フォルダからファイルを・・・」なんてこともあるので、ときどき使います。

```vb:NetworkUtilClass.vbs
Class NetworkUtilClass
    ' 変数宣言 -----------------------------------
    Private NetworkObject

    ' コンストラクタ / デストラクタ --------------
    Private Sub Class_Initialize()
        Set NetworkObject = CreateObject("WScript.Network")
    End Sub
    Private Sub Class_Terminate()
        Set NetworkObject = Nothing
    End Sub
    ' ネットワーク関連 ---------------------------
    Public Sub CreateNetworkDrive(drive,path,user,pass)
        On Error Resume Next
        NetworkObject.RemoveNetworkDrive path, True, False
        NetworkObject.MapNetworkDrive drive, path, False, user, pass
    End Sub

    Public Sub RemoveNetworkDrive(path)
        On Error Resume Next
        NetworkObject.RemoveNetworkDrive path, True, False
        Set NetworkObject = Nothing
    End Sub

    Public Sub StartAccessSharedFolder(path,user,pass)
        On Error Resume Next
        NetworkObject.RemoveNetworkDrive path, True, False
        NetworkObject.MapNetworkDrive "", path, False, user, pass
    End Sub

    Public Sub EndAccessSharedFolder(path)
        On Error Resume Next
        NetworkObject.RemoveNetworkDrive path, True, False
    End Sub
End Class
```

## CSVに対してSQLを実行

DBからSQLでデータを取ってくるのは当たり前ですが、CSVからSQLで抽出できるのは意外と知らない人が多い？
（僕の周りだけでしょうか。。。）
クラス化するかは別として、知ってると便利です。

```vb:ExecSql4CsvClass.vbs
Class ExecSql4CsvClass
    ' 変数宣言 -----------------------------------
    Private objWShell
    Private objADO

    Private csvFoloder

    ' コンストラクタ / デストラクタ --------------
    Private Sub Class_Initialize()
        Set objWShell = CreateObject("WScript.Shell")
        Set objADO = CreateObject("ADODB.Connection")
    End Sub
    Private Sub Class_Terminate()
        Set objADO = Nothing
        Set objWShell = Nothing
    End Sub
    Public Default Property Get Constructor(arg1)
        csvFoloder = arg1
        objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & csvFoloder & ";ReadOnly=1"
    End Property

    Public Function Execute(sql)
        Set Execute = objADO.Execute(sql)
    End Function

End Class
```

## ファイル関連

業務の自動化だとよく使うかなと思うテキストファイルの読み書き。
文字コードは、S-JIS、UTF-8、UTF-8Nに対応しました。
ファイルの文字コード変換は横着してるので、そのままでもまぁ使えますが、可能なら修正して使ってください m(_ _;)m

```vb:FileUtilClass.vbs
Class FileUtilClass
    ' 定数宣言 -----------------------------------
    Private Property Get READ()
        READ = 1
    End Property
    Private Property Get WRITE()
        WRITE = 2
    End Property

    ' 変数宣言 -----------------------------------
    Private fso
    Private objFile
    Private objWShell

    Private charset
    Private rw
    Private filePath

    ' コンストラクタ / デストラクタ --------------
    Private Sub Class_Initialize()
        Set fso = WScript.CreateObject("Scripting.FileSystemObject")
        Set objWShell = CreateObject("WScript.Shell")
        filePath = ""
    End Sub
    Private Sub Class_Terminate()
        Set fso = Nothing
        Set objFile = Nothing
        Set objWShell = Nothing
    End Sub

    ' ファイルの読み書き *******************************************************
    Private Function SetCharset(str)
        Select Case str
            Case "UTF8","UTF-8","U"
                SetCharset = "UTF8"
            Case "UTF8N","UTF-8N"
                SetCharset = "UTF8N"
            Case "SJIS","S-JIS","S"
                SetCharset = "SJIS"
            Case Else
                SetCharset = "SJIS"
        End Select
    End Function
    ' ファイル読み込み -----------------------------------------------
    Public Sub OpenReadFile(path,cs)
        charset = SetCharset(cs)
        filePath = path
        rw = READ
        Select Case charset
            Case "UTF8","UTF8N"
                Set objFile = CreateObject("ADODB.Stream")
                ' 1：バイナリ・2：テキスト
                objFile.Type = 2
                objFile.Charset = "UTF-8"
                objFile.Open
                objFile.LoadFromFile path
            Case Else
                Set objFile = objFso.OpenTextFile(path, 1, True)
        End Select
    End Sub
    ' ファイル書き出し(上書き) ---------------------------------------
    Public Sub OpenWriteFile(path,cs)
        charset = SetCharset(cs)
        filePath = path
        rw = WRITE
        Select Case charset
            Case "UTF8","UTF8N"
                Set objFile = CreateObject("ADODB.Stream")
                ' 1：バイナリ・2：テキスト
                objFile.Type = 2
                objFile.Charset = "UTF-8"
                objFile.Open
                ' ※メモリ上に書き出し->pathは保存時に指定
            Case Else
                Set objFile = objFso.OpenTextFile(path, 2, True)
        End Select
    End Sub
    ' ファイル書き出し(追記) -----------------------------------------
    Public Sub OpenAppendFile(path,cs)
        charset = SetCharset(cs)
        filePath = path
        rw = WRITE
        Select Case charset
            Case "UTF8","UTF8N"
                Set objFile = CreateObject("ADODB.Stream")
                '読み取り/書き込みモード
                objFile.Mode = 3
                ' 1：バイナリ・2：テキスト
                objFile.Type = 2
                objFile.Charset = "UTF-8"
                objFile.Open
                objFile.LoadFromFile (filePath)
                'ポインタを終端へ
                objFile.Position = objFile.Size
            Case Else
                Set objFile = objFso.OpenTextFile(path, 8, True)
        End Select
    End Sub
    ' 1行読み込み ----------------------------------------------------
    Public Function ReadLine
        Select Case charset
            Case "UTF8","UTF8N"
                ReadLine = objFile.ReadText(-2)
            Case Else
                ReadLine = objFile.ReadLine
        End Select
    End Function
    ' 全行読み込み ---------------------------------------------------
    Public Function ReadAll
        Select Case charset
            Case "UTF8","UTF8N"
                ReadAll = objFile.ReadText(-1)
            Case Else
                ReadAll = objFile.ReadAll
        End Select
    End Function
    ' 書き込み -------------------------------------------------------
    Public Sub WriteLine(str)
        Select Case charset
            Case "UTF8","UTF8N"
                objFile.WriteText str, 1
            Case Else
                objFile.WriteLine str
        End Select
    End Sub
    ' 閉じる ---------------------------------------------------------
    Public Sub Close
        Select Case charset
            Case "UTF8" ' BOM有り
                If rw = WRITE Then
                    objFile.SaveToFile filePath, 1
                End If
                objFile.Close
            Case "UTF8N" ' BOM無し
                If rw = WRITE Then
                    objFile.Position = 0
                    'バイナリモードにする
                    objFile.Type = 1
                    ' 先頭3バイト(BOM)をスキップする
                    objFile.Position = 3
                    ' データを読み込む
                    Dim bin
                    bin = objFile.Read
                    objFile.Close
                    ' 書き出し
                    Set objFile = CreateObject("ADODB.Stream")
                    ' 1：バイナリ・2：テキスト
                    objFile.Type = 1
                    objFile.Open
                    objFile.Write(bin)
                    ' 書き出しファイルの保存
                    objFile.SaveToFile filePath, 2
                End If
                objFile.Close
            Case Else
                objFile.Close
        End Select
        charset = ""
        filePath = ""
        rw = 0
    End Sub
    ' EOF判定
    Public Property Get EOF()
        Select Case charset
            Case "UTF8","UTF8N"
                EOF = objFile.EOS
            Case Else
                EOF = objFile.AtEndOfStream
        End Select
    End Property

    ' ファイルの文字コード変換 *************************************************
    ' 文字コード変換(SJIS->UTF-8)
    Public Sub ConvSjis2Utf8(path)
        Dim objFr, objTo
        ' S-JIS
        Set objFr = CreateObject("ADODB.Stream")
        objFr.Charset = "Shift_JIS"
        objFr.Open
        objFr.LoadFromFile path
        ' UTF8
        Set objTo = CreateObject("ADODB.Stream")
        objTo.Type = 2
        objTo.Charset = "UTF-8"
        objTo.Open
        ' 変換
        objFr.CopyTo objTo
        ' 保存
        objTo.SaveTofile path , 2
        ' 後処理
        objFr.Close
        objTo.Close
        Set objFr = Nothing
        Set objTo = Nothing
    End Sub
    ' 文字コード変換(UTF-8->UTF-8N)
    Public Sub ConvUtf82Utf8n(path)
        Dim objFr, objTo
        Set objFr = CreateObject("ADODB.Stream")
        objFr.Type = 1
        objFr.Open
        objFr.LoadFromFile path
        Set objTo = CreateObject("ADODB.Stream")
        objTo.Type = 1
        objTo.Open
        ' 読み込み
        objFr.Position = 0
        ' 先頭3バイト = BOM をスキップする
        objFr.Position = 3
        Dim bin
        bin = objFr.Read
        ' 書き出し
        objTo.Write(bin)
        ' 保存
        objTo.SaveTofile path , 2
        ' 後処理
        objFr.Close
        objTo.Close
        Set objFr = Nothing
        Set objTo = Nothing
        
    End Sub
    ' 文字コード変換(UTF-8N->SJIS)
    Public Sub ConvUtf8n2Sjis(path)
        Dim objFr, objTo
        ' S-JIS
        Set objFr = CreateObject("ADODB.Stream")
        objFr.Charset = "UTF-8"
        objFr.Open
        objFr.LoadFromFile path
        ' UTF8
        Set objTo = CreateObject("ADODB.Stream")
        objTo.Type = 2
        objTo.Charset = "Shift_JIS"
        objTo.Open
        ' 変換
        objFr.CopyTo objTo
        ' 保存
        objTo.SaveTofile path , 2
        ' 後処理
        objFr.Close
        objTo.Close
        Set objFr = Nothing
        Set objTo = Nothing
    End Sub
    ' 文字コード変換(SJIS->UTF-8N)
    Public Sub ConvSjis2Utf8n(path)
        ConvSjis2Utf8 path
        ConvUtf82Utf8n path
    End Sub
    ' 文字コード変換(UTF-8->SJIS)
    Public Sub ConvUtf82Sjis(path)
        ConvUtf82Utf8n path
        ConvUtf8n2Sjis path
    End Sub
    ' 文字コード変換(UTF-8N->UTF-8)
    Public Sub ConvUtf8n2Utf8(path)
        ConvUtf8n2Sjis path
        ConvSjis2Utf8 path
    End Sub

End Class
```

# 呼び出しサンプル

ファイル配置は以下の通りです。

```
VBScripts
│  99.mousepos.vbs
│
└─lib
        IeUtilClass.vbs
        KeyboardUtilClass.vbs
        MouseUtilClass.vbs
        NetworkUtilClass.vbs
        ExecSql4CsvClass.vbs
        FileUtilClass.vbs
```

[前回](https://qiita.com/Kiyotaka/items/79b506ca67c8a05f5a8b) 、コメントでアドバイスいただいたので、呼び出し側をWSFにしてみました。
ファイル読み込みの部分がスッキリして、こちらの方がよいですね。

```vb:99.mousepos.wsf
<job id="MouseUtilExample">
	<COMMENT>
		マウス操作自動化のサンプル
	</COMMENT>
	<script language="VBScript" src=".\lib\MouseUtilClass.vbs"/>

	<object id="fso" progid="Scripting.FileSystemObject"/>

	<script language="VBScript">
		Option Explicit

		Dim mouseUtil
		Set mouseUtil = New MouseUtilClass

		Dim pos
		WScript.Echo "3"
		WScript.Sleep(1000)
		WScript.Echo "2"
		WScript.Sleep(1000)
		WScript.Echo "1"
		WScript.Sleep(1000)
		pos = mouseUtil.GetMousePos()
		WScript.Echo pos(0) & " / " & pos(1)

		WScript.Sleep(1000)
		WScript.Echo "Move to "
		WScript.Sleep(1000)
		Call mouseUtil.MouseMove(pos(0)+100,pos(1)+100)

		' 解放
		Set mouseUtil = Nothing
		'終了
		WScript.Quit

	</Script>
</job>
```

これだけあれば、業務の自動化はかなりできるのではないでしょうか。
（マウスクリックやSendkeysの入力による力業になる場合もありますが）

あと手持ちのネタは、

- IEの操作でXPathを使えるようにしてみた
- IEの通知バーの保存ボタンを制御してみた
- 自動化した処理が長いと進捗がわからんので、プログレスバーを出してみた

というところ。
またそのうち投稿します。