ken_nogi/pleasanter/develop/##実行予算承認WF/sites/scripts/抽出マクロ.vbs
Kenichiro NOGI 973ad0a0fe 2025-09-18
2025-09-18 15:52:11 +09:00

327 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Option Explicit
Sub 明細の抽出()
If Range("選択ブランド").Value = "" Then
MsgBox "ブランドが選択されていません。", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
Call 抽出シートクリア("抽出")
Call 明細情報抽出("サッシ工事", "抽出")
Call 明細情報抽出("内部建具工事", "抽出")
Call 明細情報抽出("設備工事", "抽出")
Call 明細情報抽出("雑工事", "抽出")
Call 明細書シートに移動()
Call 明細書印刷範囲設定()
Application.ScreenUpdating = True
End Sub
' filepath: c:\Users\k.nogi\#GitHub\ken_nogi\pleasanter\develop\##実行予算承認WF\sites\scripts\抽出マクロ.vbs
Sub 明細情報抽出(Byval categoryName As String, Byval destSheetName As String)
Dim srcWs As Worksheet, destWs As Worksheet
Dim srcTbl As ListObject
Dim destRow As Long, i As Long
Dim colProduct As Integer, colPrice As Integer, colQty As Integer, colUnit As Integer, colUnitName As Integer
Dim 金額 As Double, subtotal As Double
Dim lastRow As Long
Dim isFirst As Boolean
'--- 対象のテーブル情報 ---
Dim srcSheetName As String
Dim srcTableName As String
srcSheetName = Range(categoryName).Value
srcTableName = Range(categoryName).Value
'--- 設定 ---
Set srcWs = ThisWorkbook.Sheets(srcSheetName)
Set destWs = ThisWorkbook.Sheets(destSheetName)
Set srcTbl = srcWs.ListObjects(srcTableName)
'列番号取得(列名は実際のものに合わせてください)
colProduct = srcTbl.ListColumns("商品名").Index
colPrice = srcTbl.ListColumns("単価").Index
colUnit = srcTbl.ListColumns("単位").Index
colQty = srcTbl.ListColumns("数量").Index
colUnitName = srcTbl.ListColumns("単位名").Index
'--- データ書き込み開始行の決定 ---
lastRow = destWs.Cells(destWs.Rows.Count, 1).End(xlUp).Row
If destWs.Cells(1, 1).Value = "" Then
' シートが空の場合
destRow = 1
isFirst = True
Else
destRow = lastRow + 1
isFirst = False
End If
'--- カテゴリ名・ヘッダー出力 ---
destWs.Cells(destRow, 1).Value = categoryName
destRow = destRow + 1
subtotal = 0
'--- データ抽出と金額計算 ---
For i = 1 To srcTbl.ListRows.Count
If srcTbl.DataBodyRange(i, colQty).Value > 0 Then
destWs.Cells(destRow, 1).Value = " " + srcTbl.DataBodyRange(i, colProduct).Value
destWs.Cells(destRow, 2).Value = srcTbl.DataBodyRange(i, colPrice).Value
destWs.Cells(destRow, 3).Value = srcTbl.DataBodyRange(i, colUnit).Value
destWs.Cells(destRow, 4).Value = srcTbl.DataBodyRange(i, colQty).Value
destWs.Cells(destRow, 5).Value = srcTbl.DataBodyRange(i, colUnitName).Value
金額 = srcTbl.DataBodyRange(i, colPrice).Value * srcTbl.DataBodyRange(i, colUnit).Value * srcTbl.DataBodyRange(i, colQty).Value
destWs.Cells(destRow, 6).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
Next
'--- 小計行(商品名と同じ列に"小計" ---
destWs.Cells(destRow, 1).Value = " 小計"
destWs.Cells(destRow, 6).Value = subtotal
'MsgBox "抽出と金額計算が完了しました", vbInformation
End Sub
Sub 抽出シートクリア(Byval destSheetName As String)
Dim destWs As Worksheet
Set destWs = ThisWorkbook.Sheets(destSheetName)
destWs.Cells.ClearContents
End Sub
Sub シートの切り替え()
Application.ScreenUpdating = False
'全シート非表示
Call 全シート非表示
'必要なシートのみ表示
Call 指定シート表示("サッシ工事")
Call 指定シート表示("内部建具工事")
Call 指定シート表示("設備工事")
Call 指定シート表示("雑工事")
Application.ScreenUpdating = True
End Sub
Sub 全シート非表示()
Dim sheetNames As Variant
Dim i As Integer
sheetNames = Array("NBサッシ工事", "NB内部建具", "NB設備", "B雑工事", "N雑工事", "Aサッシ工事", "A内部建具", "A設備", "A雑工事")
For i = LBound(sheetNames) To UBound(sheetNames)
On Error Resume Next
ThisWorkbook.Sheets(sheetNames(i)).Visible = xlSheetHidden
On Error Goto 0
Next i
End Sub
Sub 指定シート表示(Byval shName As String)
Dim sh As String
sh = Range(shName).Value
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(sh)
ws.Visible = xlSheetVisible
End Sub
Sub 基本入力シートに戻る()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("基本入力")
ws.Activate
ws.Range("A1").Select
End Sub
Sub 見積書シートに移動()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("見積書")
ws.Activate
ws.Range("A1").Select
End Sub
Sub 明細書シートに移動()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("明細書")
ws.Activate
ws.Range("A1").Select
End Sub
Sub セル参照でシート移動(Byval sheetName As String)
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(sheetName)
If ws.Visible = xlSheetHidden Or ws.Visible = xlSheetVeryHidden Then
Call シートの切り替え
End If
ws.Activate
ws.Range("F4").Select
End Sub
Sub サッシ工事テーブルへ移動()
If Range("選択ブランド").Value = "" Then
MsgBox "ブランドが選択されていません。", vbExclamation
Exit Sub
End If
Call セル参照でシート移動(Range("サッシ工事").Value)
End Sub
Sub 内部建具工事テーブルへ移動()
If Range("選択ブランド").Value = "" Then
MsgBox "ブランドが選択されていません。", vbExclamation
Exit Sub
End If
Call セル参照でシート移動(Range("内部建具工事").Value)
End Sub
Sub 設備工事テーブルへ移動()
If Range("選択ブランド").Value = "" Then
MsgBox "ブランドが選択されていません。", vbExclamation
Exit Sub
End If
Call セル参照でシート移動(Range("設備工事").Value)
End Sub
Sub 雑工事テーブルへ移動()
If Range("選択ブランド").Value = "" Then
MsgBox "ブランドが選択されていません。", vbExclamation
Exit Sub
End If
Call セル参照でシート移動(Range("雑工事").Value)
End Sub
Sub クリア()
ActiveSheet.Range("F4:F10000").ClearContents
End Sub
Sub 見積書明細書PDF出力()
Dim wsMitsumori As Worksheet, wsMeisai As Worksheet
Dim pdfFileName As String
Dim folderPath As String
Dim mitsumoriNo As String, koujiName As String, issueDate As String
Set wsMitsumori = ThisWorkbook.Sheets("見積書")
Set wsMeisai = ThisWorkbook.Sheets("明細書")
' 保存先フォルダ(必要に応じて変更)
folderPath = ThisWorkbook.Path & "\"
' ファイル名用情報取得
mitsumoriNo = Range("見積書番号").Value
koujiName = Range("工事名").Value
issueDate = Range("発行年月日").Value
' 日付を"yyyyMMddHHmmss"形式に
Dim dt As String
dt = Format(issueDate, "yyyymmdd-HHMMSS")
' ファイル名作成
pdfFileName = folderPath & mitsumoriNo & "■" & koujiName & "■" & dt & ".pdf"
' シートを配列で指定してPDF出力
Sheets(Array("見積書", "明細書")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFileName, Quality:=xlQualityStandard
' 元のシートに戻る
Call 基本入力シートに戻る()
MsgBox "PDF出力が完了しました。" & vbCrLf & pdfFileName, vbInformation
End Sub
Sub 明細書印刷範囲設定()
Dim ws As Worksheet
Dim lastRow As Long
Dim 合計Row As Long
Dim printStartRow As Long, printEndRow As Long
Set ws = ThisWorkbook.Sheets("明細書")
' B列の最終行取得
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' B2から下方向に「合計」を探す
合計Row = 0
Dim i As Long
For i = 2 To lastRow
If IsError(ws.Cells(i, "B").Value) Or ws.Cells(i, "B").Value = CVErr(xlErrNA) Then
Continue For
End If
If ws.Cells(i, "B").Value = "合計" Then
合計Row = i
Exit For
End If
Next i
If 合計Row = 0 Then
MsgBox "「合計」が見つかりません。", vbExclamation
Exit Sub
End If
printStartRow = 2
printEndRow = 合計Row + 3
ws.PageSetup.PrintArea = ws.Range("B" & printStartRow & ":F" & printEndRow).Address
'MsgBox "印刷範囲をF" & printStartRow & "F" & printEndRow & "に設定しました。", vbInformation
End Sub
Sub 入力内容をすべてクリア()
If MsgBox("基本情報および部材リストの選択をすべてクリアします、よろしいですか?", vbYesNo + vbQuestion, "確認") = vbNo Then
Exit Sub
End If
Call 基本入力のE列クリア()
Call 複数シートF列クリア()
End Sub
Sub 複数シートF列クリア()
Dim sheetNames As Variant
Dim i As Integer
Dim ws As Worksheet
sheetNames = Array("NBサッシ工事", "NB内部建具", "NB設備", "B雑工事", "N雑工事", "Aサッシ工事", "A内部建具", "A設備", "A雑工事")
For i = LBound(sheetNames) To UBound(sheetNames)
On Error Resume Next
Set ws = ThisWorkbook.Sheets(sheetNames(i))
If Not ws Is Nothing Then
ws.Range("F4:F10000").ClearContents
End If
Set ws = Nothing
On Error Goto 0
Next i
End Sub
Sub 基本入力のE列クリア()
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Sheets("基本入力")
For i = 1 To 100
If ws.Cells(i, "B").Value = 1 Then
ws.Cells(i, "E").ClearContents
End If
Next i
End Sub
Sub ファイルを別名保存()
Dim folderPath As String
Dim koujiName As String
Dim dt As String
Dim saveFileName As String
' 保存先フォルダ(現在のブックと同じ場所)
folderPath = ThisWorkbook.Path & "\"
' 工事名取得
koujiName = Range("工事名").Value
' 日時取得yyyyMMdd-HHMMSS形式
dt = Format(Now, "yyyymmdd-HHMMSS")
' ファイル名作成
saveFileName = folderPath & "nBAH積算システム" & "■" & koujiName & "■" & dt & ".xlsm"
' 別名で保存
ThisWorkbook.SaveAs Filename:=saveFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "ファイルを保存しました。" & vbCrLf & saveFileName, vbInformation
End Sub