タブメニューのウィンドウ⑤(後編)

本記事では、Windows 専用の業務効率化ツールである本ツールの仕様と操作方法について紹介します。
ツールの種別は以下となります。

このツールは、Windows 専用の業務効率化ツールです。HTA の特性により、HTML で画面を構築しつつ、VBScriptを
用いた操作制御が可能になっています。

動作環境は以下となります。

ツールは Windows 10 および Windows 11 を前提に作られおり動作検証済みです。

画面仕様は以下となります。

・ツールの画面サイズは横幅 954px、高さおよそ 1000px に固定されており、ユーザーはリサイズできず、
最大化もできません。解像度が低い環境では、画面の一部がはみ出す可能性があります。
・マスター情報から対象サーバーIDとサーバー名を取得する実行結果を表示させるだけでなく、Excelに出力して
保存してくれるところまでを行ってくれます。
・今回は実機環境作業申請書のみ機能となり、メール作成また持ち込み資材は対象外となりますのでご了承ください。
・VBscriptだけの利用はできないため、HTAのコードに関しては「タブメニューのウィンドウ④(前編)」を事前に準備しておいてください。

Option Explicit

' コマンドライン引数を受け取るための変数を準備
Dim args, tabName

'======================================================================================================
' (引数):参照元また出力元のExcelのパスや申請日や作業者名を格納する変数の準備
'======================================================================================================
Dim vbs_setDateStr, vbs_shinseiUser_furigana, vbs_ShinseiUser, vbs_ShinseiName2, vbs_WorkStartDate, vbs_workEndDate, vbs_BasePath, vbs_SrcPath, vbs_OutPath

'======================================================================================================
' 準備した変数に引数を格納
'======================================================================================================
' コマンドライン引数を受け取る

Set args = WScript.Arguments

If args.Count >= 10 Then
    tabName                    = CStr(args(0))
    vbs_setDateStr             = CStr(args(1))
    vbs_shinseiUser_furigana   = CStr(args(2))
    vbs_ShinseiUser            = CStr(args(3))
    vbs_ShinseiName2           = CStr(args(4))
    vbs_WorkStartDate          = CStr(args(5))
    vbs_workEndDate            = CStr(args(6))
    vbs_BasePath               = CStr(args(7))
    vbs_SrcPath                = CStr(args(8))
    vbs_OutPath                = CStr(args(9))

Else
    MsgBox "引数が不足しています。", vbExclamation
    WScript.Quit
End If

' タブごとの処理
Select Case LCase(Trim(tabName))
    Case "tab1"

	'======================================================================================================
	' 変数の設定
	'======================================================================================
	Dim xlApp, srcBook, srcSheet, outBook, outSheet

	Dim rawText, onlyNum, ch, idx
		       
	Dim NodeID, NodeName

	Dim targetDate, dataStartRow, lastRow, outRow, r, hitcount

	Dim targetText, i

	Dim startCopyRow, pasteRow, copyRange, pasteRange, j, arr(5)

	'======================================================================================
	' 参照元と出力先のファイルの指定してファイルを開く
	'======================================================================================

	Set xlApp = CreateObject("Excel.Application")
	xlApp.Visible = False
	xlApp.DisplayAlerts = False

	Set srcBook = xlApp.Workbooks.Open(vbs_SrcPath)
	Set srcSheet = srcBook.Sheets(1)

	Set outBook = xlApp.Workbooks.Open(vbs_OutPath)

	'======================================================================================
	' 表紙の処理
	'======================================================================================
	Set outSheet = outBook.Sheets(1)

	' 4列目(D列)7~10行に格納
	outSheet.Cells(7, 4).Value = vbs_setDateStr
	outSheet.Cells(8, 4).Value = vbs_ShinseiUser
	outSheet.Cells(9, 4).Value = vbs_WorkStartDate
	outSheet.Cells(10, 4).Value = vbs_workEndDate
	outSheet.Cells(14, 4).Value = vbs_WorkStartDate
	outSheet.Cells(15, 4).Value = vbs_workEndDate

	' 左寄せ(D7~D10)
	outSheet.Range("D7:D10").HorizontalAlignment = -4131
	outSheet.Range("D13:D15").HorizontalAlignment = -4131

	'======================================================================================
	' 改定履歴の処理
	'======================================================================================
	Set outSheet = outBook.Sheets(2)

	' 4行目・2列目(B4)に文字列をセット
	outSheet.Cells(4, 2).Value = vbs_setDateStr
	outSheet.Cells(4, 4).Value = vbs_setDateStr
	outSheet.Cells(4, 5).Value = vbs_ShinseiName2
	outSheet.Cells(4, 6).Value = vbs_setDateStr

	' 中央揃え
	outSheet.Cells(4, 2).HorizontalAlignment = -4108
	outSheet.Cells(4, 4).HorizontalAlignment = -4108
	outSheet.Cells(4, 6).HorizontalAlignment = -4108

	'======================================================================================
	'「作業手続き申請書」(シート名)でオートフィルタの設定を確認する
	'======================================================================================
	Const xlCellTypeVisible = 12
	Const xlUp = -4162

	dataStartRow = 4

	If srcSheet.AutoFilterMode = False Then
	    MsgBox "オートフィルタが設定されていません。"
	    srcBook.Close False
	    outBook.Close False
	    xlApp.Quit
	    WScript.Quit
	End If

	' サンプルコードのための動作確認のためフィルタリングの日付を「2025/12/25」を固定化
	targetDate = vbs_WorkStartDate

	srcSheet.Range("A4").AutoFilter 7, "*" & targetDate & "*"

	On Error Resume Next
	srcSheet.Range("G4:G41").SpecialCells xlCellTypeVisible
	If Err.Number <> 0 Then
	    MsgBox "対象日付のデータがありません。"
	    Err.Clear
	    srcBook.Close False
	    outBook.Close False
	    xlApp.Quit
	    WScript.Quit
	End If
	On Error GoTo 0

	lastRow = srcSheet.Cells(srcSheet.Rows.Count, "G").End(xlUp).Row

	'======================================================================================
	'申請者のふりがなと漢字を入力
	'======================================================================================
	Set outSheet = outBook.Sheets(3)
	outSheet.Cells(18, "F").Value = vbs_shinseiUser_furigana
	outSheet.Cells(19, "F").Value = vbs_shinseiUser

	'======================================================================================
	' 参照元ファイルのC列から出力先ファイルのH列に出力する処理
	'======================================================================================
	hitcount = 0
	outRow = 30

	For r = dataStartRow To lastRow

	    If srcSheet.Rows(r).Hidden = False Then
	        If Trim(srcSheet.Cells(r, "G").Value) <> "" Then

	            NodeID = srcSheet.Cells(r, "C").Value
	            NodeName = srcSheet.Cells(r, "C").Value

	            'H列にサーバー管理番号を出力
	            outSheet.Cells(outRow, "H").Value = NodeID

	            'M列にサーバー名を出力
	            outSheet.Cells(outRow, "M").Value = NodeName

	             ' R結合セルの書式を「数値」にする(VBScript)
	             With outSheet.Cells(outRow, "R")
	                 If .MergeCells = True Then
	                     .NumberFormat = "0"
	                 End If
	             End With

	            'X列に「作業実施日/開始時間」を出力
	            rawText = CStr(srcSheet.Cells(r, "G").Value)
	            onlyNum = ""
	            
	            For idx = 1 To Len(rawText)
	                ch = Mid(rawText, idx, 1)
	                If ch >= "0" And ch <= "9" Then
	                    onlyNum = onlyNum & ch
	                End If
	            Next
        
	            ' YYYYMMDD の先頭8桁だけ使用
	            outSheet.Cells(outRow, "R").Value = Left(onlyNum, 8)

	            outSheet.Cells(outRow+1, "R").Value = "9時00分"

		     ' 修正後
		     WScript.Echo vbs_setDateStr & "|" & vbs_WorkStartDate & "|" & NodeID & "|" & NodeName
            
	            outRow = outRow + 2
	            hitcount = hitcount + 1
	        End If
	    End If
	Next

	'======================================================================================
	' 参照元ファイルのD列から出力先ファイルのH列に出力処理(C列の続き)
	'======================================================================================
	For r = dataStartRow To lastRow
	    If srcSheet.Rows(r).Hidden = False Then
	        If Trim(srcSheet.Cells(r, "G").Value) <> "" Then

	            NodeID = srcSheet.Cells(r, "D").Value
	            NodeName = srcSheet.Cells(r, "D").Value

	            'H列にサーバー管理番号を出力
	            outSheet.Cells(outRow, "H").Value = NodeID

	            'M列にサーバー名を出力
	            outSheet.Cells(outRow, "M").Value = NodeName

	             ' R結合セルの書式を「数値」にする(VBScript)
	             With outSheet.Cells(outRow, "X")
	                 If .MergeCells = True Then
	                     .NumberFormat = "0"
	                 End If
	             End With

	            'X列に「作業実施日/終了時間」を出力
	            rawText = CStr(srcSheet.Cells(r, "G").Value)
	            onlyNum = ""
	            
	            For idx = 1 To Len(rawText)
	                ch = Mid(rawText, idx, 1)
	                If ch >= "0" And ch <= "9" Then
	                    onlyNum = onlyNum & ch
	                End If
	            Next
	            
	            ' YYYYMMDD の先頭8桁だけ使用
	            outSheet.Cells(outRow, "X").Value = Left(onlyNum, 8)
	            outSheet.Cells(outRow+1, "X").Value = "15時00分"

		     ' 修正後
		     WScript.Echo vbs_setDateStr & "|" & vbs_WorkStartDate & "|" & NodeID & "|" & NodeName

	            outRow = outRow + 2
	            hitcount = hitcount + 1
	        End If
	    End If
	Next

	'======================================================================================
	' コピーして挿入する行の処理
	'======================================================================================
	targetText = "1.現在設定されている監視対象となっている"

	lastRow = outSheet.Cells(outSheet.Rows.Count, "D").End(xlUp).Row

	For r = 83 To lastRow
	    If InStr(outSheet.Cells(r, "D").Value, targetText) > 0 Then
	        startCopyRow = r
	        Exit For
	    End If
	Next

	hitcount = hitcount / 2   ' 整数除算(小数切り捨て)

	For i = 1 To 7

	    Select Case i
	        Case 1
	            startCopyRow = startCopyRow + 2
	            arr(i-1) = startCopyRow
	        Case 2
	            startCopyRow = startCopyRow + pasteRow + 8
	            arr(i-1) = startCopyRow
	        Case 3
	            startCopyRow = startCopyRow + 4
	            arr(i-1) = startCopyRow
	        Case 5
	            startCopyRow = startCopyRow + 10
	            arr(i-2) = startCopyRow
	        Case 6
	            startCopyRow = startCopyRow + 8
	            arr(i-2) = startCopyRow
	        Case 7
	            startCopyRow = startCopyRow + 4
	            arr(i-2) = startCopyRow
	        Case Else
	            startCopyRow = startCopyRow - pasteRow
	    End Select

	    If i <> 4  Then
	        For j = 1 To hitcount - 1
	            outSheet.Rows(startCopyRow).Insert
	            startCopyRow = startCopyRow + 1
	        Next
	    End If

	Next

	'======================================================================================
	' 取得データを出力
	'======================================================================================
	For i = 1 To 7

	    Select Case i
	        Case 1
	            startCopyRow = arr(i-1) 

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "C").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "C").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next

	        Case 2
	            startCopyRow = arr(i-1)

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "D").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "D").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next
	        Case 3
	            startCopyRow = arr(i-1)

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "D").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "D").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next

	        Case 5
	            startCopyRow = arr(i-2)

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "D").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "D").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next

	        Case 6
	            startCopyRow = arr(i-2)

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "C").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "C").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next

	        Case 7
	            startCopyRow = arr(i-2)

	            For r = dataStartRow To lastRow
	                If srcSheet.Rows(r).Hidden = False Then
	                    If Trim(srcSheet.Cells(r, "G").Value) <> "" Then
	                        outSheet.Cells(startCopyRow, "E").Value = "□"
	                        outSheet.Cells(startCopyRow, "E").HorizontalAlignment = -4108
	                        outSheet.Cells(startCopyRow, "F").Value = srcSheet.Cells(r, "C").Value
	                        outSheet.Cells(startCopyRow, "K").Value = srcSheet.Cells(r, "C").Value
	                        startCopyRow = startCopyRow + 1
	                        hitcount = hitcount + 1
	                    End If
	                End If
	            Next
	    End Select
	Next

	'======================================================================================================================
	' Excel保存
	'======================================================================================================================

	srcBook.Close False
	outBook.Save
	outBook.Close
	xlApp.Quit


    Case "tab2"
        MsgBox "外部VBSで Tab2 処理を実行しました", vbInformation, "VBS処理"

    Case "tab3"
        MsgBox "外部VBSで Tab3 処理を実行しました", vbInformation, "VBS処理"

    Case Else
        MsgBox "不明なタブ: " & tabName, vbExclamation, "VBS処理"
End Select

タイトルとURLをコピーしました