ken_nogi/XVBA/MSS/抽出マクロ.bas
Kenichiro NOGI 48d993652f 20251006
2025-10-06 09:23:38 +09:00

853 lines
27 KiB
QBasic
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
' 共通シート名定義
Public Const SHEET_N_SASHI As String = "Nサッシ"
Public Const SHEET_N_TATEGU As String = "N建具"
Public Const SHEET_N_SETUBI As String = "N設備"
Public Const SHEET_N_ZATSU As String = "N雑工事"
Public Const SHEET_B_SASHI As String = "Bサッシ"
Public Const SHEET_B_TATEGU As String = "B建具"
Public Const SHEET_B_SETUBI As String = "B設備"
Public Const SHEET_B_ZATSU As String = "B雑工事"
Public Const SHEET_A_SASHI As String = "Aサッシ"
Public Const SHEET_A_TATEGU As String = "A建具"
Public Const SHEET_A_SETUBI As String = "A設備"
Public Const SHEET_A_ZATSU As String = "A雑工事"
Public Const SHEET_MITSUMORI As String = "見積書表紙"
Public Const SHEET_MEISAI As String = "明細書"
Public Const SHEET_KIHON As String = "基本入力"
Public Const SHEET_SHOKEIHI As String = "諸経費"
Sub 明細の抽出()
' 必要項目入力チェック
If Not 必須入力チェック結果() Then
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 srcTblF As ListObject
Dim destRow As Long, i As Long
Dim colProduct As Integer, colPrice As Integer, colQty 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
Dim srcTableNameF As String
srcSheetName = Range(categoryName).Value
srcTableName = Range(categoryName).Value
srcTableNameF = srcTableName & "F"
'--- 設定 ---
Set srcWs = ThisWorkbook.Sheets(srcSheetName)
Set destWs = ThisWorkbook.Sheets(destSheetName)
Set srcTbl = srcWs.ListObjects(srcTableName)
Set srcTblF = srcWs.ListObjects(srcTableNameF)
'列番号取得(列名は実際のものに合わせてください)
colProduct = srcTbl.ListColumns("商品名").Index
colPrice = 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
' 数量は小数点以下第3位以下を切り捨て
Dim qtyValue As Double
qtyValue = srcTbl.DataBodyRange(i, colQty).Value
qtyValue = Int(qtyValue * 100) / 100
destWs.Cells(destRow, 3).Value = qtyValue
destWs.Cells(destRow, 4).Value = srcTbl.DataBodyRange(i, colUnitName).Value
' 金額は単価×数量で計算し、小数点以下切り捨て
金額 = srcTbl.DataBodyRange(i, colPrice).Value * qtyValue
金額 = Int(金額)
destWs.Cells(destRow, 5).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
Next i
For i = 1 To srcTblF.ListRows.Count
If srcTblF.DataBodyRange(i, colQty).Value > 0 Then
destWs.Cells(destRow, 1).Value = " " + srcTblF.DataBodyRange(i, colProduct).Value
destWs.Cells(destRow, 2).Value = srcTblF.DataBodyRange(i, colPrice).Value
' 数量は小数点以下第3位以下を切り捨て
Dim qtyValueF As Double
qtyValueF = srcTblF.DataBodyRange(i, colQty).Value
qtyValueF = Int(qtyValueF * 100) / 100
destWs.Cells(destRow, 3).Value = qtyValueF
destWs.Cells(destRow, 4).Value = srcTblF.DataBodyRange(i, colUnitName).Value
' 金額は単価×数量で計算し、小数点以下切り捨て
金額 = srcTblF.DataBodyRange(i, colPrice).Value * qtyValueF
金額 = Int(金額)
destWs.Cells(destRow, 5).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
Next i
'--- 雑工事の場合、減坪金額を調べて追記 ---
If categoryName = "雑工事" Then
If Range("_1階減坪_金額").Value <> 0 Then
destWs.Cells(destRow, 1).Value = " 1階減坪" & Range("選択階数").Value & ""
destWs.Cells(destRow, 2).Value = Range("_1階減坪_単価").Value
destWs.Cells(destRow, 3).Value = Range("_1階減坪_数量").Value
destWs.Cells(destRow, 4).Value = "坪"
金額 = Range("_1階減坪_金額").Value
destWs.Cells(destRow, 5).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
If Range("_23階減坪_金額").Value <> 0 Then
destWs.Cells(destRow, 1).Value = " 2,3階減坪" & Range("選択階数").Value & ""
destWs.Cells(destRow, 2).Value = Range("_23階減坪_単価").Value
destWs.Cells(destRow, 3).Value = Range("_23階減坪_数量").Value
destWs.Cells(destRow, 4).Value = "坪"
金額 = Range("_23階減坪_金額").Value
destWs.Cells(destRow, 5).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
If Range("オーバーハング用減坪_金額").Value <> 0 Then
destWs.Cells(destRow, 1).Value = " オーバーハング用減坪(" & Range("選択階数").Value & ""
destWs.Cells(destRow, 2).Value = Range("オーバーハング用減坪_単価").Value
destWs.Cells(destRow, 3).Value = Range("オーバーハング用減坪_数量").Value
destWs.Cells(destRow, 4).Value = "坪"
金額 = Range("オーバーハング用減坪_金額").Value
destWs.Cells(destRow, 5).Value = 金額
subtotal = subtotal + 金額
destRow = destRow + 1
End If
End If
'--- 小計行(商品名と同じ列に"小計" ---
destWs.Cells(destRow, 1).Value = " 小計"
destWs.Cells(destRow, 5).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 ws As Worksheet
' 指定以外のシートを非表示
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> SHEET_MITSUMORI And ws.Name <> SHEET_MEISAI And ws.Name <> SHEET_KIHON And ws.Name <> SHEET_SHOKEIHI Then
ws.Visible = xlSheetHidden
Else
ws.Visible = xlSheetVisible
End If
Next ws
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(SHEET_KIHON)
ws.Activate
ws.Range("A1").Select
End Sub
Sub 見積書シートに移動()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(SHEET_MITSUMORI)
ws.Activate
ws.Range("A1").Select
End Sub
Sub 明細書シートに移動()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(SHEET_MEISAI)
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("E4").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 諸経費テーブルへ移動()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(SHEET_SHOKEIHI)
ws.Activate
ws.Range("C6").Select
End Sub
Sub クリア()
Application.ScreenUpdating = False
Dim ws As Worksheet
Set ws = ActiveSheet
Dim tbl As ListObject
On Error Resume Next
Set tbl = ws.ListObjects(ws.Name)
On Error GoTo 0
If Not tbl Is Nothing Then
Dim colQty As Integer
On Error Resume Next
colQty = tbl.ListColumns("数量").Index
On Error GoTo 0
If colQty > 0 Then
' 数量列の入力範囲を一括選択してまとめて削除
tbl.DataBodyRange.Columns(colQty).ClearContents
End If
End If
Application.ScreenUpdating = True
End Sub
Sub フリー入力欄クリア
Application.ScreenUpdating = False
Dim ws As Worksheet
Set ws = ActiveSheet
Dim tblF As ListObject
On Error Resume Next
Set tblF = ws.ListObjects(ws.Name+"F")
If Not tblF Is Nothing Then
tblF.DataBodyRange.ClearContents
End If
' カテゴリ列にB2セルの値を一括セット
Dim colCategory As Integer
On Error Resume Next
colCategory = tblF.ListColumns("カテゴリ").Index
On Error GoTo 0
If colCategory > 0 Then
tblF.DataBodyRange.Columns(colCategory).Value = ws.Range("B2").Value
End If
Application.ScreenUpdating = True
End Sub
Sub 見積書明細書PDF出力()
' 必要項目入力チェック
If Not 必須入力チェック結果() Then
Exit Sub
End If
If MsgBox("PDF形式で出力します。同じ名前のファイルがある場合は上書きされます。よろしいですか", vbYesNo + vbQuestion, "確認") = vbNo Then
Exit Sub
End If
' まずは保存
ThisWorkbook.Save
Dim wsMitsumori As Worksheet, wsMeisai As Worksheet
Dim pdfFileName As String
Dim folderPath As String
Dim koujiName As String, issueDate As String
Set wsMitsumori = ThisWorkbook.Sheets(SHEET_MITSUMORI)
Set wsMeisai = ThisWorkbook.Sheets(SHEET_MEISAI)
' 保存先フォルダ(必要に応じて変更)
folderPath = ThisWorkbook.Path & "\"
' ファイル名用情報取得
koujiName = Range("工事名").Value
issueDate = Range("発行年月日").Value
' 日付を"yyyyMMddHHmmss"形式に
Dim dt As String
dt = Format(issueDate, "yyyymmdd")
' ファイル名作成(見積書番号は含めない)
pdfFileName = folderPath & "マトリックス積算" & " " & koujiName & " 見積書" & dt & ".pdf"
' シートを配列で指定してPDF出力
Sheets(Array(SHEET_MITSUMORI, SHEET_MEISAI)).Select
On Error GoTo ExportError
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=pdfFileName, Quality:=xlQualityStandard
On Error GoTo 0
GoTo ExportEnd
ExportError:
MsgBox "PDFのエクスポートに失敗しました。同じ名前のファイルが開かれていないか確認してください。" & vbCrLf & "ファイル名: " & pdfFileName, vbExclamation
Exit Sub
ExportEnd:
' 元のシートに戻る
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(SHEET_MEISAI)
' B列の最終行取得
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' B列の最終行から上方向に「合計」を探す
合計Row = 0
Dim i As Long
For i = lastRow To 2 Step -1
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 + 1 ' 合計行の次の行まで
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
Application.ScreenUpdating = False
Call 基本入力のE列クリア
Call 複数シート数量クリア
Call すべてのフリー入力欄のクリア
Call 諸経費シートのクリア
Call 抽出シートクリア("抽出")
Call 指定以外のシートを非表示
Application.ScreenUpdating = True
End Sub
Sub 複数シート数量クリア()
Application.ScreenUpdating = False
Dim sheetNames As Variant
Dim i As Integer
Dim ws As Worksheet
' 部材シートの数量クリア
sheetNames = Array(SHEET_N_SASHI, SHEET_N_TATEGU, SHEET_N_SETUBI, SHEET_N_ZATSU, _
SHEET_B_SASHI, SHEET_B_TATEGU, SHEET_B_SETUBI, SHEET_B_ZATSU, _
SHEET_A_SASHI, SHEET_A_TATEGU, SHEET_A_SETUBI, SHEET_A_ZATSU)
For i = LBound(sheetNames) To UBound(sheetNames)
On Error Resume Next
Set ws = ThisWorkbook.Sheets(sheetNames(i))
If Not ws Is Nothing Then
On Error Resume Next
Dim tbl As ListObject
Set tbl = ws.ListObjects(ws.Name)
If Not tbl Is Nothing Then
Dim colQty As Integer
colQty = tbl.ListColumns("数量").Index
' 数量列の入力範囲を一括選択してまとめて削除
tbl.DataBodyRange.Columns(colQty).ClearContents
End If
On Error GoTo 0
End If
On Error GoTo 0
Next i
Application.ScreenUpdating = True
End Sub
Sub すべてのフリー入力欄のクリア()
Application.ScreenUpdating = False
Dim sheetNames As Variant
Dim i As Integer
Dim ws As Worksheet
' 部材シートのフリー入力欄クリア
sheetNames = Array(SHEET_N_SASHI, SHEET_N_TATEGU, SHEET_N_SETUBI, SHEET_N_ZATSU, _
SHEET_B_SASHI, SHEET_B_TATEGU, SHEET_B_SETUBI, SHEET_B_ZATSU, _
SHEET_A_SASHI, SHEET_A_TATEGU, SHEET_A_SETUBI, SHEET_A_ZATSU)
For i = LBound(sheetNames) To UBound(sheetNames)
On Error Resume Next
Set ws = ThisWorkbook.Sheets(sheetNames(i))
If Not ws Is Nothing Then
On Error Resume Next
Dim tblF As ListObject
Set tblF = ws.ListObjects(ws.Name & "F")
If Not tblF Is Nothing Then
tblF.DataBodyRange.ClearContents
Dim colCategory As Integer
colCategory = tblF.ListColumns("カテゴリ").Index
tblF.DataBodyRange.Columns(colCategory).Value = ws.Range("B2").Value
End If
On Error GoTo 0
End If
On Error GoTo 0
Next i
Application.ScreenUpdating = True
End Sub
Sub 諸経費シートのクリア()
Application.ScreenUpdating = False
Dim ws As Worksheet
' 諸経費シートのクリア
Set ws = ThisWorkbook.Sheets(SHEET_SHOKEIHI)
' 諸経費テーブルの「項目」「数量」「金額」列をクリア
Dim tbl As ListObject
Dim colItem As Integer, colQty As Integer, colAmount As Integer, colTotal As Integer
On Error Resume Next
Set tbl = ws.ListObjects(ws.Name)
On Error GoTo 0
If Not tbl Is Nothing Then
On Error Resume Next
colItem = tbl.ListColumns("項目").Index
colQty = tbl.ListColumns("数量").Index
colAmount = tbl.ListColumns("金額").Index
On Error GoTo 0
tbl.DataBodyRange.Columns(colItem).ClearContents
tbl.DataBodyRange.Columns(colQty).ClearContents
tbl.DataBodyRange.Columns(colAmount).ClearContents
End If
Application.ScreenUpdating = True
End Sub
Sub 基本入力のE列クリア()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Sheets(SHEET_KIHON)
For i = 1 To 100
If ws.Cells(i, "B").Value = 1 Then
ws.Cells(i, "E").ClearContents
End If
Next i
For i = 1 To 100
If ws.Cells(i, "L").Value = 1 Then
ws.Cells(i, "N").ClearContents
End If
Next i
Application.ScreenUpdating = True
End Sub
Sub ファイルを別名保存()
If MsgBox("ファイルを別名で保存します。同じ名前のファイルがある場合は上書きされます。よろしいですか?", vbYesNo + vbQuestion, "確認") = vbNo Then
Exit Sub
End If
' まずは保存
ThisWorkbook.Save
Dim folderPath As String
Dim koujiName As String
Dim dt As String
Dim saveFileName As String
' 保存先フォルダ(現在のブックと同じ場所)
folderPath = ThisWorkbook.Path & "\"
' 工事名取得
koujiName = Range("工事名").Value
If koujiName = "" Then
MsgBox "工事名が入力されていません。", vbExclamation
Exit Sub
End If
' 日時取得yyyyMMdd-HHMMSS形式
' dt = Format(Now, "yyyymmdd-HHMMSS")
dt = Format(Now, "yyyymmdd")
' ファイル名作成
saveFileName = folderPath & "マトリックス積算" & " " & koujiName & " 見積書" & dt & ".xlsm"
' 別名で保存
On Error GoTo SaveError
'ThisWorkbook.SaveAs fileName:=saveFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
ThisWorkbook.SaveCopyAs fileName:=saveFileName
On Error GoTo 0
GoTo SaveEnd
SaveError:
MsgBox "ファイルの保存に失敗しました。同じ名前のファイルが開かれていないか確認してください。" & vbCrLf & "ファイル名: " & saveFileName, vbExclamation
Exit Sub
SaveEnd:
MsgBox "ファイルを保存しました。" & vbCrLf & saveFileName, vbInformation
End Sub
Sub シート保護と非表示処理()
Dim ws As Worksheet
Dim pwd As String
pwd = ThisWorkbook.Sheets(SHEET_KIHON).Range("Z10000").Value
Application.ScreenUpdating = False
' 全シートをパスワードで保護
For Each ws In ThisWorkbook.Worksheets
ws.Protect Password:=pwd, UserInterfaceOnly:=True
Next ws
' 指定以外のシートを非表示
Call 指定以外のシートを非表示
Application.ScreenUpdating = True
End Sub
Sub シート保護解除()
Dim ws As Worksheet
Dim pwd As String
pwd = ThisWorkbook.Sheets(SHEET_KIHON).Range("Z10000").Value
Application.ScreenUpdating = False
For Each ws In ThisWorkbook.Worksheets
ws.Unprotect Password:=pwd
Next ws
Application.ScreenUpdating = True
Call 基本入力シートに戻る
ActiveSheet.Range("E4").Select
End Sub
Sub 指定以外のシートを非表示()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> SHEET_MITSUMORI And ws.Name <> SHEET_MEISAI And ws.Name <> SHEET_KIHON And ws.Name <> SHEET_SHOKEIHI Then
ws.Visible = xlSheetHidden
Else
ws.Visible = xlSheetVisible
End If
Next ws
Call 基本入力シートに戻る
ActiveSheet.Range("E4").Select
End Sub
Sub すべてのシートを表示するマクロ()
Application.ScreenUpdating = False
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
Application.ScreenUpdating = True
Call 基本入力シートに戻る
ActiveSheet.Range("E4").Select
End Sub
Sub テーブル並び順ソート()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim tbl As ListObject
Dim sortCol As ListColumn
Set ws = ActiveSheet
On Error Resume Next
Set tbl = ws.ListObjects(ws.Name)
On Error GoTo 0
If tbl Is Nothing Then
MsgBox "シート名と同じテーブルが見つかりません。", vbExclamation
Exit Sub
End If
Set sortCol = Nothing
On Error Resume Next
Set sortCol = tbl.ListColumns("並び順")
On Error GoTo 0
If sortCol Is Nothing Then
MsgBox "「並び順」列が見つかりません。", vbExclamation
Exit Sub
End If
With tbl.Sort
.SortFields.Clear
.SortFields.Add key:=sortCol.DataBodyRange, Order:=xlAscending
.Header = xlYes
.Apply
End With
Application.ScreenUpdating = True
MsgBox "並び順でソートが完了しました。", vbInformation
End Sub
Function 必須入力チェック結果() As Boolean
Dim ws As Worksheet
Dim i As Long
Set ws = ThisWorkbook.Sheets(SHEET_KIHON)
For i = 1 To 100
If ws.Cells(i, "F").Value = "※" Then
If ws.Cells(i, "E").Value = "" Then
ws.Activate
ws.Cells(i, "E").Select
MsgBox "「" & ws.Cells(i, "C").Value & "」が未入力です。", vbExclamation
必須入力チェック結果 = False
Exit Function
End If
End If
Next i
必須入力チェック結果 = True
End Function
Sub パターン別一括設定_ガス仕様()
Call パターン別一括設定("ガス仕様")
End Sub
Sub パターン別一括設定_電気仕様()
Call パターン別一括設定("電気仕様")
End Sub
Sub パターン別一括設定_ZEH仕様()
Call パターン別一括設定("ZEH仕様")
End Sub
Sub パターン別一括設定(ByVal pattern As String)
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim tbl As ListObject
Dim colPattern As Integer, colQty As Integer
Dim r As Long
Set ws = ActiveSheet
On Error Resume Next
Set tbl = ws.ListObjects(ws.Name)
On Error GoTo 0
If tbl Is Nothing Then
MsgBox "シート名と同じテーブルが見つかりません。", vbExclamation
Exit Sub
End If
colPattern = 0
colQty = 0
On Error Resume Next
colPattern = tbl.ListColumns(pattern).Index
colQty = tbl.ListColumns("数量").Index
On Error GoTo 0
If colPattern = 0 Or colQty = 0 Then
MsgBox "「数量」列または「" & pattern & "」列が見つかりません。", vbExclamation
Exit Sub
End If
tbl.DataBodyRange.Columns(colQty).Value = tbl.DataBodyRange.Columns(colPattern).Value
Application.ScreenUpdating = True
End Sub
Sub 商品名列範囲を非表示()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim tbl As ListObject
Dim colProduct As Integer
Dim lastRow As Long, freeItemRow As Long
Dim i As Long
Set ws = ActiveSheet
On Error Resume Next
Set tbl = ws.ListObjects(ws.Name)
On Error GoTo 0
If tbl Is Nothing Then
MsgBox "シート名と同じテーブルが見つかりません。", vbExclamation
Exit Sub
End If
On Error Resume Next
colProduct = tbl.ListColumns("商品名").Index
On Error GoTo 0
If colProduct = 0 Then
MsgBox "「商品名」列が見つかりません。", vbExclamation
Exit Sub
End If
On Error Resume Next
ws.Rows.Hidden = False
On Error GoTo 0
lastRow = tbl.DataBodyRange.Rows.Count + tbl.HeaderRowRange.Row + 1
freeItemRow = 0
For i = tbl.HeaderRowRange.Row To ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
If ws.Cells(i, "B").Value = "フリー項目欄" Then
freeItemRow = i
Exit For
End If
Next i
If freeItemRow = 0 Then
MsgBox "「フリー項目欄」が見つかりません。", vbExclamation
Exit Sub
End If
If lastRow + 1 < freeItemRow - 1 Then
ws.Rows((lastRow + 1) & ":" & (freeItemRow - 2)).Hidden = True
End If
Application.ScreenUpdating = True
ws.Cells(freeItemRow + 2, "B").Select
End Sub
Sub すべてのシートボタン文字色一括変更()
Dim ws As Worksheet
Dim shp As Shape
Dim btn As Object
Dim targetColor As Long
targetColor = RGB(0, 0, 0) ' 赤色(例)
For Each ws In ThisWorkbook.Worksheets
' Formコントロールボタン
For Each shp In ws.Shapes
If shp.Type = msoFormControl Then
If shp.FormControlType = xlButtonControl Then
shp.TextFrame.Characters.Font.Color = targetColor
End If
End If
Next shp
' ActiveXコントロールボタン
For Each btn In ws.OLEObjects
If TypeName(btn.Object) = "CommandButton" Then
btn.Object.ForeColor = targetColor
End If
Next btn
Next ws
End Sub