対象の日付かつ特定の列の情報取得⑧(デザイン)

ここからいよいよ本当のツールとして利用できるようにご紹介いたします。
1.前提作業
まずは「サーバー管理台帳」と「実機環境作業手続き申請書」が必要となります。
①HTAを起動させるツールのOS
こちらは基本に「Windows 10」「Windows 11」のいずれかなら動くと思います。
②サーバー管理台帳のファイル:
見出しの行が3行目となり、データ情報は「4行目」から「41行目」までとなります。
ファイルの保存の前に「2025/12/20」の日付でフィルタをかけておいてください。
③実機環境作業手続き申請書のファイル:
基本的には「改訂履歴」(1番目)はシートだけを用意しておいてもらえればよいのですが、コードを検証して頂くには「作業手続き申請書」(2番目)のシートが存在した状態で正しい列の状態に揃えてもらわないと正しい動作にはならないのでご注意ください。
2.前回の作業について
VBScriptのままではなくHTMLと組み合わせよりカスタマイズしやすいツールになるように
切り替え、HTML側では以下の機能を追加しました。
①フォルダのパスと参照先のパスと出力先のパスの入力項目のテーブルの配置
②申請日と作業実施日とサーバーIDとサーバー名と実行ボタンのテーブルの配置
③実行結果のテーブルの配置
3.今回の追加機能について
前回は見た目がしょぼい感じだったのでもう少し見やすさをイメージして改善いたしました。
4.注意点について
もしかするといきなり実行用しても反応がない可能性もあるのでブロック単位で実行確認してもらえると最終的に全部使えるようになるかもしれないので動かなかったときはそのように試してみてください。

<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8">

	<HTA:APPLICATION
	    ID="App"
	    APPLICATIONNAME="実機環境作業手続き申請書"
	    BORDER="dialog"
	    CAPTION="yes"
	    SCROLL="no"
	    SINGLEINSTANCE="yes"
	/>

	<title>実機環境作業手続き申請書</title>

	<style>
	body {
	    overflow-x: hidden;   /* 横スクロール非表示 */
	    overflow-y: auto;    /* 縦スクロールは必要に応じて表示 */
	    width: 940px;       /* コンテンツ領域の幅 */
	    height: 1000px;      /* コンテンツ領域の高さ */
	    font-family: Meiryo, MS Gothic;
	    font-size: 12px;

	}

	h2 {
	    text-align: center;
	    margin-bottom: 15px;
	}

	table {
	    border-collapse: collapse;
	    width: 900px;
	}

	th, td {
	    border: 1px solid #000;
	    padding: 4px;
	}

	input[type="text"] {
	    width: 95%;
	    height: 25px;
	    padding-top: 5px;
	}
	</style>

	<script language="VBScript">
		Option Explicit

		Sub Window_onLoad
		    ' 横幅 954px、高さ 1000px にウィンドウサイズを変更
		    window.resizeTo 954, 986

		    ' オプション:画面中央に配置
		    Dim screenX, screenY
		    screenX = (Screen.Width - 1024) / 2
		    screenY = (Screen.Height - 1050) / 2
		    window.moveTo screenX, screenY
		End Sub

		Sub ExecMain()
			'======================================================================================
			' 変数の設定
			'======================================================================================
			Dim basePath, srcPath, outPath

			Dim xlApp, srcBook, srcSheet, outBook, outSheet

			Dim setDateStr, shinseiUser, shinseiName2, workStartDate, workEndDate

			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)

			'======================================================================================
			' 流用できる情報
			'======================================================================================
			'setDateStr = "2025/12/01"   ' ← 文字列として保持
			'shinseiUser = "藤巻正太郎"
			'workStartDate = "2025/12/20"

			setDateStr = Document.getElementById("setDateStr").Value
			shinseiUser  = Document.getElementById("shinseiUser").Value
			shinseiName2 = Mid(shinseiUser, 1, 2)
			workStartDate  = Document.getElementById("workStartDate").Value


			workEndDate = workStartDate

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

			'======================================================================================
			' 参照元と出力先のファイルの指定してファイルを開く
			'======================================================================================
			basePath = Document.getElementById("basePath").Value
			srcPath  = Document.getElementById("srcPath").Value
			outPath  = Document.getElementById("outPath").Value

			If basePath = "" Or srcPath = "" Or outPath = "" Or setDateStr = "" Or shinseiUser = "" Or workStartDate = "" Then
				MsgBox "未入力の項目があります。すべて入力してください。"
				window.close
		 	else
		                srcPath = basePath & "\" & srcPath
			        outPath = basePath & "\" & outPath
			End If

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

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

			Set outBook = xlApp.Workbooks.Open(outPath)

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

			' 4列目(D列)7~10行に格納
			outSheet.Cells(7, 4).Value = setDateStr 
			outSheet.Cells(8, 4).Value = shinseiUser
			outSheet.Cells(9, 4).Value = workStartDate
			outSheet.Cells(10, 4).Value = workEndDate
			outSheet.Cells(14, 4).Value = workStartDate
			outSheet.Cells(15, 4).Value = 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 = setDateStr
			outSheet.Cells(4, 4).Value = setDateStr
			outSheet.Cells(4, 5).Value = shinseiName2 
			outSheet.Cells(4, 6).Value = setDateStr

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

			'======================================================================================
			'「作業手続き申請書」(シート名)でオートフィルタの設定を確認する
			'======================================================================================
			'「作業手続き申請書」(シート名)を指定する
			Set outSheet = outBook.Sheets(3)

			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

		        MsgBox targetDate

			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

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



			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

		            ' HTAに出力
		            Call AddResultRow(setDateStr, workStartDate, NodeID, NodeName)

			            '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分"
		            
			            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

		            ' HTAに出力
		            Call AddResultRow(setDateStr, workStartDate, NodeID, NodeName)

			            '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分"


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


			MsgBox "対象日付 " & targetDate & " は " & hitcount & " 件です。"

			'======================================================================================
			' コピーして挿入する行の処理
			'======================================================================================
			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
			            MsgBox "挿入する行" & hitcount & "行分です"
			            MsgBox "最初の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-1) = startCopyRow
			        Case 2
			            startCopyRow = startCopyRow + pasteRow + 8
			            MsgBox "次の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-1) = startCopyRow
			        Case 3
			            startCopyRow = startCopyRow + 4
			            MsgBox "次の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-1) = startCopyRow
			        Case 5
			            startCopyRow = startCopyRow + 10
			            MsgBox "次の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-2) = startCopyRow
			        Case 6
			            startCopyRow = startCopyRow + 8
			            MsgBox "次の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-2) = startCopyRow
			        Case 7
			            startCopyRow = startCopyRow + 4
			            MsgBox "次の行の挿入開始位置は" & startCopyRow & "行目です"
			            arr(i-2) = startCopyRow
			        Case Else
			            startCopyRow = startCopyRow - pasteRow
			            MsgBox "次は切戻しの場合の設定値の行に移動します"
			    End Select

			    If i <> 4  Then
			        For j = 1 To hitcount - 1
			            outSheet.Rows(startCopyRow).Insert
			            startCopyRow = startCopyRow + 1
			        Next
			        MsgBox "最終行" & startCopyRow & "行です"
			    End If

			Next

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

			    Select Case i
			        Case 1
			            startCopyRow = arr(i-1) 
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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)
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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)
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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)
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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)
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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)
			            MsgBox "最初の行の追記の開始位置は" & startCopyRow & "行目です"

			            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

		        MsgBox "実行完了"
		 
		End Sub

		Sub AddResultRow(appDate, workDate, serverID, serverName)
		    Dim tbl, newRow
		    Set tbl = Document.getElementById("resultTable")
		    Set newRow = tbl.insertRow(tbl.rows.length)
		    
		    newRow.insertCell(0).innerText = appDate
		    newRow.insertCell(1).innerText = workDate
		    newRow.insertCell(2).innerText = serverID
		    newRow.insertCell(3).innerText = serverName
		End Sub
	</script>
	</head>

	<body onload="Window_onLoad">
		<div style="width:924px; height:943px; solid #000; overflow-x:hidden; overflow-y:auto; margin-top:-1px; margin-left:-3px;">

			<h2 style="background: #80ffbf;">
				実機環境作業手続き申請書
			</h2>

			<!-- ===== 説明1 ===== -->
			<b style="font-size: 15px;">1.以下のフォルダ名のパスとファイル名と作業実施日をご記入ください。</b>
			<br><br>

			<table style="margin-left:4px;">
				<tr>
				    <th width="45%">フォルダ名</th>
				    <th width="25%">参照元ファイル名</th>
				    <th width="30%">出力先ファイル名</th>
				</tr>
				<tr>
				    <td><input type="text" id="basePath"></td>
				    <td><input type="text" id="srcPath"></td>
				    <td><input type="text" id="outPath"></td>
				</tr>
			</table>

			<br><br>

			<!-- ===== 説明2 ===== -->
			<b style="font-size: 15px;">2.作業申請日と作業実施日担当者名をご記入して[データ出力]をクリックして下さい</b>
			<br><br>

			<table style="margin-left:3px;">
				<tr>
				    <th width="25%">作業申請日</th>
				    <th width="25%">作業実施日</th>
				    <th width="30%">作業担当者</th>
				    <th width="20%">申請書作成</th>
				</tr>
				<tr>
				    <td><input type="text" id="setDateStr"></td>
				    <td><input type="text" id="workStartDate"></td>
				    <td><input type="text" id="shinseiUser"></td>
				    <td style="text-align:center;">
				        <input type="button" value="データ出力" id="ExecMain" onclick="ExecMain()" style="width:95%; height:35px;">
				    </td>
				</tr>
			</table>

			<br><br>

			<!-- ===== 実行結果 ===== -->
			<b style="font-size: 15px;"><実行結果></b>
			<br><br>
			<div style="width:924px; height:548px; border:1px solid #000; overflow-x:hidden; overflow-y:auto; margin-top:-1px; margin-left:-1px;">
				<table id="resultTable" style="margin-left:3px;">

					<tr>
					    <th style="width:20%;">作業申請日</th>
					    <th style="width:20%;">作業実施日</th>
					    <th style="width:30%;">サーバーID</th>
					    <th style="width:30%;">サーバー名</th>
					</tr>

				</table>
			</div>
		</div>
	</body>
</html>
タイトルとURLをコピーしました