エクセルVBAマクロ実例【生産現場実使用-定型作業自動化】

2019/10/15

プログラム

t f B! P L
私が約2年前(2017年)の社員時代に
趣味で作成して生産現場で実使用していた
定型事務作業自動化の
エクセルVBAマクロ、プログラムコード実例の1つを示す。

■対象者
生産現場で使用実績あるエクセルVBAマクロをみて参考にしたい人。
マクロ記述部分がどんなものかをざっくり把握したい人。

■注意
「LibreOffice Basic」使用しているので冒頭に
「Rem Attribute VBA_ModuleType=VBAModule」
「Option VBASupport 1」
あるがエクセルVBAでは不要。

■Module1-サンプルA(共通部分マクロ)

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Option Private Module

Sub フィルタ削除01()
'ω'フィルタ非該当不要行削除作業、フィルタ該当分のデータを残す

Dim sname As String
sname = ActiveSheet.Name

Worksheets(sname).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除01"
Worksheets("削除01").Range("A1").PasteSpecial Paste:=xlPasteAll

Worksheets(sname).AutoFilterMode = False
Sheets(sname).Cells.Clear

Worksheets("削除01").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets(sname).Range("A1").PasteSpecial Paste:=xlPasteAll
Sheets("削除01").Cells.Clear

'ω'不要作業シート削除
Sheets("削除01").Delete

End Sub

Sub 連番1以外削除01()
'ω'8列目に対し26列目に連番追加

Dim MR As Long
Dim i As Long
Dim j As Long

MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
j = 1

ZZ = Range(Cells(1, 26), Cells(MR, 26))
HH = Range(Cells(1, 8), Cells(MR + 1, 8))

For i = 2 To MR
ZZ(i, 1) = j
j = j + 1
If HH(i, 1) <> HH(i + 1, 1) Then
j = 1
End If
Next i
Range(Cells(1, 26), Cells(MR, 26)) = ZZ

'ω'連番1以外削除
Cells(1, 26) = "削除"
Cells(1, 26).AutoFilter Field:=1, Criteria1:=1
End Sub

Sub サンプルA01_1() 'ω'K
'ω'部品割当リスト、部品割当リスト_最新.xlsxで保存、検討データ・祝日シート追加

'ω'アクティブシート以外のシートを削除
Worksheets("サンプルAデータリスト").Activate
Dim mySht As Worksheet
For Each mySht In Worksheets
If mySht.Name <> ActiveSheet.Name Then mySht.Delete
Next

End Sub

Sub サンプルA01_2()
'ω'該当倉庫以外データ削除
ActiveSheet.Cells(1, 1).AutoFilter Field:=32, Criteria1:=Array("99924", "99925", "99927", "99903", "99904", "99905"), Operator:=xlFilterValues
フィルタ削除01

'ω'B予定日書き換え
Dim MR As Long
Dim MC As Long
MR = Cells(Rows.Count, 20).End(xlUp).Row 'ω'最終行,T:T
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列

Range(Cells(1, 18), Cells(MR, 18)).Replace What:="現地生産", replacement:="AAA"

'ω'リスト並べ替え(1:現地生産,2:倉庫コード)
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 18), Order1:=xlAscending, _
Header:=xlYes

JJ = Range(Cells(1, 10), Cells(MR, 10)) 'ω'A予定日→B予定日を逐次代入
FF = Range(Cells(1, 18), Cells(MR, 18)) 'ω'現地生産,AAA
ZZ = Range(Cells(1, 52), Cells(MR, 52)) 'ω'B予定日

For i = 2 To MR
If FF(i, 1) <> "AAA" Then
Range(Cells(1, 10), Cells(MR, 10)) = JJ
i = MR
Else
JJ(i, 1) = ZZ(i, 1)
End If
Next i

End Sub

Sub サンプルA01_3() 'ω'K
'ω'アクティブシート倍率100%,メモリ不足回避
ActiveWindow.Zoom = 100

'ω'先行処理データを元データに加算
Dim MR As Long
MR = Cells(Rows.Count, 20).End(xlUp).Row 'ω'最終行,T:T

'ω'36=AJ,37=AK,Variant
Dim i As Long, K As Long, L As Long, M As Long
c = Range(Cells(1, 36), Cells(MR, 37))
d = Range(Cells(1, 36), Cells(MR, 36))
For i = 2 To MR
K = c(i, 1)
L = c(i, 2)
d(i, 1) = K + L
Next i
Range(Cells(1, 36), Cells(MR, 36)) = d

'ω'不要列削除
Range("BI:BP").Delete
Range("BD:BF").Delete
Range("AR:BA").Delete
Range("AK:AP").Delete
Range("AG:AI").Delete
Range("AC:AE").Delete
Range("Z:Z").Delete
Range("U:X").Delete
Range("K:S").Delete
Range("F:I").Delete
Range("C:C").Delete

'ω'列並替
Range("F:F").Cut 'ω'Sオーダ
Range("B:B").Insert

'ω'看板列空白MRP置換
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
Range(Cells(1, 16), Cells(MR, 16)).Replace What:="", replacement:="MRP" 'ω'16=P

ActiveWorkbook.SaveAs "D:\部品割当リスト_最新.xlsx", FileFormat:=xlOpenXMLWorkbook

Workbooks.Open ("D:\a.csv")
Workbooks("a.csv").Worksheets("a").Copy After:=Workbooks("部品割当リスト_最新.xlsx").Sheets(Workbooks("部品割当リスト_最新.xlsx").Sheets.Count)
Workbooks("a.csv").Close
End Sub

Sub サンプルA01_4()
Workbooks.Open ("D:\STA化検討リスト.xls")
Workbooks("STA化検討リスト.xls").Worksheets("祝日").Copy After:=Workbooks("部品割当リスト_最新.xlsx").Sheets(Workbooks("部品割当リスト_最新.xlsx").Sheets.Count)
Workbooks("STA化検討リスト.xls").Close

End Sub

Sub サンプルA02()
'ω'STA化検討データ事前保存
'ω'オーダSYK計算
Workbooks.Open ("D:\QSAMP_STA化検討データ.xls")
Dim wb1 As Workbook
Set wb1 = ActiveWorkbook

Cells(1, 17) = "オーダSYK"

Dim MR As Long
MR = Cells(Rows.Count, 1).End(xlUp).Row 'ω'最終行,A:A
'ω'11=K,13=M,17=Q,Variant
Dim i As Long, K As Long, L As Long, M As Long
c = Range(Cells(1, 11), Cells(MR, 13))
d = Range(Cells(1, 17), Cells(MR, 17))
For i = 2 To MR
K = c(i, 1)
L = c(i, 2)
M = c(i, 3)
d(i, 1) = K + L - M
Next i
Range(Cells(1, 17), Cells(MR, 17)) = d

'ω'STA化検討データ→部品割当リスト、シートコピー
ActiveSheet.Copy After:=Workbooks("部品割当リスト_最新.xlsx").Sheets(Workbooks("部品割当リスト_最新.xlsx").Sheets.Count)
ActiveSheet.Name = "検デ"
wb1.Close

End Sub

Sub サンプルA03() 'ω'K

'ω'部品割当リストから不要行(Kオーダ割当重複)削除

Worksheets("サンプルAデータリスト").Activate

Dim MR As Long
Dim MC As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
'ω'key1=Sオーダ,key2=位置
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 2), Order1:=xlAscending, _
Key2:=Cells(2, 7), Order2:=xlAscending, _
Header:=xlYes

'ω'2=Sオーダ,7=位置,26=Z,C,DVariant
Dim i As Long, K As String, L As String
c = Range(Cells(1, 2), Cells(MR, 7))
d = Range(Cells(1, 26), Cells(MR, 26))
For i = 2 To MR
K = c(i, 1)
L = c(i, 6)
d(i, 1) = K + L
Next i
Range(Cells(1, 26), Cells(MR, 26)) = d

Dim j As Long
With Cells(2, 26)
For j = .CurrentRegion.Rows.Count To 1 Step -1
If .Offset(j, 0) = .Offset(j - 1, 0) Then .Offset(j, 0).EntireRow.Delete
Next j
End With

Range("Z:Z").Delete

End Sub

Sub サンプルA04_1() 'ω'K
'ω'D部門以外必要割当データ追加
'ω'サンプルAデータPN検索行A列追加
Dim ws1 As Worksheet
Set ws1 = Worksheets("サンプルAデータリスト")

ws1.Activate
Range("H:H").Copy 'ω'PN
Range("A:A").Insert

Worksheets("a").Activate
Range("E:E").Cut 'ω'Sオーダ
Range("B:B").Insert
Range("E:E").Cut 'ω'終了予定日
Range("C:C").Insert
Range("C:E").Insert
Range("G:I").Insert
Range("1:1").Insert
Range("A1:P1") = "-"

Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B

Range(Cells(2, 3), Cells(MR, 5)) = "-"
Range(Cells(2, 7), Cells(MR, 7)) = "-"
'ω'PN
Range(Cells(2, 8), Cells(MR, 8)).Formula = "=MID(A2,10,15)"
Range(Cells(2, 8), Cells(MR, 8)).Value = Range(Cells(2, 8), Cells(MR, 8)).Value

For i = 2 To MR
Cells(i, 9) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 10, False) 'ω'品名
Cells(i, 12) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 13, False) 'ω'サプライヤ
Cells(i, 13) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 14, False) 'ω'手持在庫
Cells(i, 14) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 15, False) 'ω'使用予定在庫
Cells(i, 15) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 16, False) 'ω'供給時間
Next i

'ω'「計画担当者」書き換え,看板
Range(Cells(2, 16), Cells(MR, 16)) = "看板"

End Sub

Sub サンプルA04_2()

'ω'サンプルAにデータがない場合検デより追加
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = Worksheets("検デ")
Set ws2 = Worksheets("a")

'ω'Worksheets("a").Activate
Cells(1, 1).AutoFilter Field:=9, Criteria1:=Array("#N/A"), Operator:=xlFilterValues
If ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
'ω'なにもしない,MsgBox "データがありません"
Else
'ω'検デより値取得,99924,99925,99927以外データなし,MsgBox "データがあります"

Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除02"
'ω'Worksheets("削除02").Activate
Cells(1, 1).PasteSpecial Paste:=xlPasteAll

Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
For i = 2 To MR
Cells(i, 9) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 3, False) 'ω'品名
Cells(i, 12) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 8, False) 'ω'サプライヤ
Cells(i, 13) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 11, False) 'ω'手持在庫
Cells(i, 14) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 13, False) 'ω'使用予定在庫
Cells(i, 15) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 5, False) 'ω'供給時間
Next i

ws2.Activate
ws2.AutoFilterMode = False
Cells(1, 1).AutoFilter Field:=9, Criteria1:="<>#N/A"
フィルタ削除01

ws2.Activate
Dim MS As Long
MS = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B

Worksheets("削除02").Activate
Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy

ws2.Activate
Cells(MS + 1, 1).PasteSpecial Paste:=xlPasteAll
Rows(MS + 1).Delete

'ω'不要作業シート削除
Sheets("削除02").Delete

End If

End Sub

Sub サンプルA04_3()

'ω'99924,99925,99927以外の倉庫を削除
Worksheets("a").Activate
ActiveSheet.Cells(1, 1).AutoFilter Field:=10, Criteria1:=Array("99924", "99925", "99927"), Operator:=xlFilterValues
フィルタ削除01
End Sub

Sub サンプルA04_4() 'ω'K
'ω'データコピー追加
Worksheets("a").Activate
Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B

Range(Cells(2, 2), Cells(MR, 16)).Copy
Worksheets("サンプルAデータリスト").Activate
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
Cells(MR + 1, 3).PasteSpecial Paste:=xlPasteAll

'ω'サンプルAデータPN検索行A列削除
Columns(1).Delete

End Sub

Sub サンプルA05() 'ω'K
'ω'S製品、工程3日追加L製品に合わせる

'ω'    Worksheets("サンプルAデータリスト").Activate
Dim MR As Long
Dim MC As Long
Dim X As Date
'ω'Dim D As Variant

MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B

d = Range(Cells(1, 6), Cells(MR, 6))
Range(Cells(1, 17), Cells(MR, 17)) = d

'ω'機名S製品フィルタ
Call S製品F("C1", 3)
Cells(1, 1).AutoFilter Field:=10, Criteria1:=Array("99925", "99927", "99928", "99929"), Operator:=xlFilterValues
Cells(1, 1).AutoFilter Field:=16, Criteria1:=Array("看板"), Operator:=xlFilterValues

If ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then
Worksheets("サンプルAデータリスト").AutoFilterMode = False
Else

'ω'F列可視セル終了予定日にQ2,S製品工程3日追加終了予定日を相対位置で入力
For Each c In Worksheets("サンプルAデータリスト").Range(Cells(2, 6), Cells(MR, 6)).SpecialCells(xlCellTypeVisible)
X = Cells(c.Row, 17) + 3
Cells(c.Row, 6) = X
Next c

Range(Cells(2, 6), Cells(MR, 6)).SpecialCells(xlVisible).Interior.ColorIndex = 22
Worksheets("サンプルAデータリスト").AutoFilterMode = False

End If

'ω'不要列削除
Columns(17).Delete

'ω'部品割当リスト並べ替え(1:pn,2:終了予定日1)
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列

Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 8), Order1:=xlAscending, _
Key2:=Cells(2, 6), Order2:=xlAscending, _
Header:=xlYes

End Sub

Sub サンプルA06() 'ω'K
'ω'部品割当リスト、使用数(見積数)加算、列追加、MC追加列、K出庫数、HPN
'ω'Worksheets("サンプルAデータリスト").Activate

Dim i As Long
Dim j As Long
Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
j = 0

QQ = Range(Cells(1, 17), Cells(MR, 17))
KK = Range(Cells(1, 11), Cells(MR, 11))
HH = Range(Cells(1, 8), Cells(MR + 1, 8))

'ω'11=K,8=H
For i = 2 To MR
QQ(i, 1) = KK(i, 1) + j
j = QQ(i, 1)
If HH(i, 1) <> HH(i + 1, 1) Then
j = 0
End If
Next i
Range(Cells(1, 17), Cells(MR, 17)) = QQ


'ω''ω'上書保存メモリ解放
'ω'ActiveWorkbook.SaveAs "D:\部品割当リスト_最新.xlsx", FileFormat:=xlOpenXMLWorkbook

End Sub
Sub サンプルA07()
'ω'部品割当リスト、在庫-使用数=残り、列追加
'ω'部品割当リスト、注残、列追加
'ω'部品割当リスト、残り+注残=注残分含残り、列追加
'ω'部品割当リスト、オーダSYK、列追加
'ω'Worksheets("サンプルAデータリスト").Activate

Dim i As Long
Dim MR As Long
Dim ws1 As Worksheet
Set ws1 = Worksheets("検デ")
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
For i = 2 To MR
Cells(i, 19) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 12, False) 'ω'オーダ済
Cells(i, 21) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 17, False) 'ω'オーダSYK
Next i

Dim M As Long, Q As Long, R As Long, S As Long
MM = Range(Cells(1, 13), Cells(MR, 13))
QQ = Range(Cells(1, 17), Cells(MR, 17))
RR = Range(Cells(1, 18), Cells(MR, 18))
SS = Range(Cells(1, 19), Cells(MR, 19))
TT = Range(Cells(1, 20), Cells(MR, 20))
On Error Resume Next 'ω'#N/A無視
For i = 2 To MR
M = MM(i, 1)
Q = QQ(i, 1)
RR(i, 1) = M - Q
R = RR(i, 1)
S = SS(i, 1)
TT(i, 1) = R + S
Next i
On Error GoTo 0 'ω'#N/A無視解除
Range(Cells(1, 18), Cells(MR, 18)) = RR
Range(Cells(1, 20), Cells(MR, 20)) = TT

'ω'部品割当リスト、MC最終列取得の為最後に項目追記
Cells(1, 17) = "使用数"
Cells(1, 18) = "残り"
Cells(1, 19) = "注残"
Cells(1, 20) = "注残含残り"
Cells(1, 21) = "オーダSYK"

End Sub

Sub サンプルAS1(ByVal str As String, ByVal i As Long, ByVal j As Long) 'ω'シート名,フィルタ列,フィルタ使用1or0

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = str
Worksheets("サンプルAデータリスト").Activate
Cells(1, 1).AutoFilter Field:=16, Criteria1:=Array("発注停止", "マニュアル", "看板"), Operator:=xlFilterValues
If j = 1 Then
Cells(1, 1).AutoFilter Field:=i, Criteria1:="<=0" 'ω'注残含む残り
End If
Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets(str).Activate
Cells(1, 1).PasteSpecial Paste:=xlPasteAll
Worksheets("サンプルAデータリスト").AutoFilterMode = False

End Sub

Sub サンプルAS2(ByVal i As Long, ByVal j As Long) 'ω'シート名,フィルタ列,フィルタ使用1or0
Dim MR As Long
Dim MC As Long

'ω'リスト並べ替え
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, i), Order1:=xlAscending, _
Key2:=Cells(2, j), Order2:=xlAscending, _
Header:=xlYes

End Sub

Sub サンプルA09_1() 'ω'K
'ω'仮01、シートコピー(欠品防止購買用,SJ倉庫10日,SK倉庫12日先,部品使用3日前,フィルタで使用)
Dim MR As Long
Dim MC As Long
Dim ws1 As Worksheet
Set ws1 = Worksheets("祝日")

Call サンプルAS1("仮01", 20, 1)

MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 15), Order1:=xlDescending, _
Header:=xlYes

'ω'U列可視セルに相対位置で入力,U列:LT考慮終了予定日

VV = Range(Cells(1, 6), Cells(MR, 6)) 'ω'A予定日→LT考慮日を逐次代入
OO = Range(Cells(1, 15), Cells(MR, 15))

For i = 2 To MR
If OO(i, 1) = 5 Then
Range(Cells(1, 22), Cells(MR, 22)) = VV
i = MR
Else
VV(i, 1) = WorksheetFunction.Workday(Cells(i, 6), -1 * Cells(i, 15).Value + 5, ws1.Range("A1:A10"))
End If
Next i
Cells(1, 22) = "LT考慮終了予定日"

Range(Cells(2, 22), Cells(MR, 22)).NumberFormatLocal = "yyyy/m/d"

Call サンプルAS2(8, 20) 'ω'リスト並べ替え(1:PN,2:注残含む残り)

End Sub

Sub サンプルA09_2() 'ω'K
'ω'仮02、シートコピー(1週間先使用分,未納確認用)
Call サンプルAS1("仮02", 18, 1)

連番1以外削除01
フィルタ削除01

Worksheets("仮02").Activate
Call サンプルAS2(6, 8) 'ω'リスト並べ替え(1:終了予定日1,2:pn)

End Sub

Sub サンプルA09_3() 'ω'K
'ω'仮03、シートコピー(注残含残り欠品日確認用)

Worksheets("仮01").Copy After:=Workbooks("部品割当リスト_最新.xlsx").Sheets(Workbooks("部品割当リスト_最新.xlsx").Sheets.Count)
ActiveSheet.Name = "仮03"

Worksheets("仮03").AutoFilterMode = False
Call サンプルAS2(8, 6) 'ω'リスト並べ替え(1:PN,2:A予定日)

連番1以外削除01
フィルタ削除01

Call サンプルAS2(6, 8) 'ω'リスト並べ替え(1:終了予定日1,2:pn)

End Sub

Sub サンプルA10() 'ω'K
'ω'部品割当リスト、列幅調整、ウィンドウ固定、オートフィルタ追加

Sheets("サンプルAデータリスト").Select
Columns("A:B").AutoFit 'ω'S番,Sオーダ
Columns("E:E").ColumnWidth = 3 'ω'台数
Range("F:F").NumberFormatLocal = "yyyy/m/d" 'ω'終了予定
Columns("F:F").ColumnWidth = 12 'ω'終了予定
Columns("G:H").AutoFit 'ω'位置,PN
Columns("J:K").ColumnWidth = 6 'ω'倉庫,出庫
Columns("M:O").ColumnWidth = 6 'ω'在庫,割当,時間
Columns("Q:U").ColumnWidth = 6 'ω'使用数~

Rows("2:2").Select
ActiveWindow.FreezePanes = True
Rows("1:1").Select
Selection.AutoFilter

For i = 4 To 6 'ω'仮01,仮02,仮03
With Worksheets(i)
.Select
Columns("A:B").AutoFit 'ω'S番,Sオーダ
Columns("E:E").ColumnWidth = 3 'ω'台数
Range("F:F").NumberFormatLocal = "yyyy/m/d" 'ω'終了予定
Columns("F:F").ColumnWidth = 12 'ω'終了予定
Columns("G:H").AutoFit 'ω'位置,PN
Columns("J:K").ColumnWidth = 6 'ω'倉庫,出庫
Columns("M:O").ColumnWidth = 6 'ω'在庫,引当,時間
Columns("Q:U").ColumnWidth = 6 'ω'使用数~

Rows("2:2").Select
ActiveWindow.FreezePanes = True
Rows("1:1").Select
Selection.AutoFilter
End With
Next

End Sub

Sub サンプルA11() 'ω'K
'ω'部品割当リスト、Dドライブ保存

'ω'アクティブシート倍率85%
Worksheets("サンプルAデータリスト").Activate
ActiveWindow.Zoom = 85

ActiveWorkbook.SaveAs "D:\部品割当リスト_最新bu.xlsx", FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.SaveAs "D:\部品割当リスト_最新.xlsx", FileFormat:=xlOpenXMLWorkbook

End Sub

Sub S製品F(ByVal str As String, ByVal fld As Long)

'ω'str:フィルタをかけるセル(例:"A1"),fld:フィルタをかける列番号(例:9)
Range(str).AutoFilter Field:=fld, Criteria1:=Array( _
"TUO100G", "TUO100GZ", "TUO15-D", "TUO200G", "TUO200G-H", "TUO25-D", "TUO25-D-CE", "TUO70MZ-D", "TUO70MZ-D-CE", "TUO70G", "TUO70G-D", "TUO70G-D-CE", "TUO70GL-ZK", "TUO70GZ", "TUO70GZ-D", "TUO80G-HDF", "TUO80GZ-HDF", "CQC100", "CQC100-CZ", "CQC100GZ", "CQC101G", "CQC200G", "CQC200GZ", "CQC200GZ-CE", "CQC201G", "CQC20Z", "CQC20Z-CE", "CQC20Z-HTESD", "CQC30", "CQC30Z", "CQC80G", "CQC80GZ", "CQC80GZ-CE", "ZT-F06", "ZT-F10", "ZT-F10-2S", "ZT-F10-2S-FRD", "ZT-F10-2U", "ZT-F10-2U-FRD", "ZT-F10-3S", "ZT-F10-3S-FRD", "ZT-F10-3U", "ZT-F10-3U-FRD", "ZT-S100", "ZT-S100Z", "ZT-S100Z-CR", "ZT-S100Z", "ZT-S20", "ZT-S200", "ZT-S200Z", "ZT-S200Z", "ZT-S20Z", "ZT-S20Z-ERDC", "ZT-S20ZE", "ZT-S20Z", "ZT-S20Z-ERD", "ZT-S21", "ZT-S30", "ZT-S30L", "ZT-S50", "ZT-S50Z", "ZT-S50Z", "ZT-SF20", "ZT-M20Z", "ZT-M20Z-E", "ZT-M20Z-E-HZ", "ZT-M20Z-HZ", "ZT-M20Z-M", "ZT-M20Z-M-HZ", "ZT-M20Z-ME", "ZT-M20Z-ME-HZ", "ZT-M20ZS", "ZT-M20ZS-E", "ZT-M20ZS-E-HZ", "ZT-M20ZS-HZ", "ZT-M20ZS-M", "ZT-M20ZS-M-HZ", "ZT-M20ZS-ME", "ZT-M20ZS-ME-HZ", _
"CQC40GZ-CE", "CQC70GZ", "CQC70GZ-CE", "CQC72GZ", "TUO25D", "TUO70-MZ", "TUO70GD", "TUO100F", "CQC100G", "CQC200GZ-IU", "CQC20Z", "ZT-S", "ZTS100Z", "ZTS200Z", "ZT-S20F", "ZTS20Z ", "ZT-S50Z-CE", "ZT-S804G", "ZT-S804", "CQC100", "CQC100Z", "CQC100ZF", "CQC100Z-CE", "ZDV", "ZDV250", "ZDV250-GB", "ZDV250-DSZ", "ZDV500", "ZDV500-GB", "ZDV500-DSZ", "ZDV50", "ZT-F03", "TUO70GL", "ZTーS200Z", "ZTーS100Z", "ZTーS100Z", "ZTーS20Z", "GDD80GZ", "ZT-S20Z ", "ZTF10", "ZT-S200GZ", "CQC80Z", "CQC20Z-HT", "ZT-F03-1", "ZT-F03-3", "ZT-F06-1", "ZT-S20Z ", "ZTーS020Z", "CQC20ZHT-ESD", "ZTS-200Z", "ZT-F03-2", "ZT-M100Z", "CQC20", "ZT-M505ZF-BE-HZ", "TUO100G-EM", "FF200G-H-LT ", "ZT-F06-2", "CQC20Z-HTSED", "CQC100-CE", "ZT-20Z", "ZT-M20-E", "ZDV500GB", "CQC100GZ-CE", "ZT-F10-3", "EV-SA20", "CQC100GZ-HT", "ZT-S50orZT-S20", "ZT-S100Z-M", "ZT-S20Z(400V)", "ZDV250GB", "CQC20Z HTESD", "ZDV50-F", "ZDV50-MZ", "ZDV50-M", "ZT-L100Z", "ZT-L100ZS-H", "ZT-F10-3U-Z"), _
Operator:=xlFilterValues

'ω'S製品リスト

End Sub

Sub 発送SF(ByVal str As String, ByVal fld As Long)

'ω'str:フィルタをかけるセル(例:"A1"),fld:フィルタをかける列番号(例:9)
Range(str).AutoFilter Field:=fld, Criteria1:=Array( _
"557274999", "522757999", "592724999", "595525999", "595625999", "524498999", "529654999", "556755999", "592262999", "596952999", _
"229289999", "587462999", "599494999", "529525999", "499522999", "555565999", "598822999", "569672999", "599274999", _
"522992999", "522485999", "522562999", "595685999", "594994999", "592579999", "592262999", "599956999", "556959999", "595996999", _
"526288999", "522785999", "596875999", "429555999"), _
Operator:=xlFilterValues

End Sub

■Module2-サンプルK(実行部分マクロ)

Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1

Private Sub サンプルK01()
Workbooks.Open ("D:\サンプルAデータ_" & Format(Date, "yymmdd") & ".xlsx")
End Sub

Private Sub サンプルK02()
サンプルA01_1
End Sub

Private Sub サンプルK04_1()

Dim wb1 As Workbook
Set wb1 = ActiveWorkbook
Workbooks("■■■看板発注マクロ.xlsm").Worksheets("祝日").Copy After:=wb1.Sheets(wb1.Sheets.Count)

'ω'看板以外データ削除
Worksheets("サンプルAデータリスト").Activate
ActiveSheet.Cells(1, 1).AutoFilter Field:=60, Criteria1:=Array("看板"), Operator:=xlFilterValues
フィルタ削除01

'ω'99928,99929,5日以前削除
Dim ws1 As Worksheet
Set ws1 = Worksheets("祝日")
Dim buf As Date
Dim MR As Long
MR = 0

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "作業01"
buf = WorksheetFunction.WorkDay(Date, -5, ws1.Range("A1:A10"))

Worksheets("サンプルAデータリスト").Activate
Cells(1, 1).AutoFilter Field:=32, Criteria1:=Array("99924", "99925", "99927"), Operator:=xlFilterValues

Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets("作業01").Cells(MR + 1, 1).PasteSpecial Paste:=xlPasteAll

Worksheets("作業01").Activate
MR = Cells(Rows.Count, 20).End(xlUp).Row 'ω'最終行,T:T


Worksheets("サンプルAデータリスト").Activate
Cells(1, 1).AutoFilter Field:=32, Criteria1:=Array("99928", "99929"), Operator:=xlFilterValues
Cells(1, 1).AutoFilter Field:=52, Criteria1:=">=" & buf

Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets("作業01").Cells(MR + 1, 1).PasteSpecial Paste:=xlPasteAll

Worksheets("作業01").Activate
Rows(MR + 1).Delete

Worksheets("サンプルAデータリスト").Delete
Worksheets("作業01").Name = "サンプルAデータリスト"

End Sub

Private Sub サンプルK04_2()

'ω'99928,99929,A予定⇒部品使用予定日書き換え
'ω'99924,99925,99927,kd,A予定⇒部品使用予定日書き換え
Dim MR As Long
Dim MC As Long
MR = Cells(Rows.Count, 20).End(xlUp).Row 'ω'最終行,T:T
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列

'ω'リスト並べ替え(1:倉庫コード)
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 32), Order1:=xlDescending, _
Header:=xlYes

JJ = Range(Cells(1, 10), Cells(MR, 10)) 'ω'A予定日→部品使用予定日を逐次代入
FF = Range(Cells(1, 32), Cells(MR, 32)) 'ω'倉庫コード
ZZ = Range(Cells(1, 52), Cells(MR, 52)) 'ω'部品使用予定日

For i = 2 To MR
If FF(i, 1) <= 99927 Then
Range(Cells(1, 10), Cells(MR, 10)) = JJ
i = MR
Else
JJ(i, 1) = ZZ(i, 1)
End If
Next i

Range(Cells(1, 18), Cells(MR, 18)).Replace What:="現地生産", replacement:="AAA"
'ω'リスト並べ替え(1:kd,2:倉庫コード)
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 18), Order1:=xlAscending, _
Key2:=Cells(2, 32), Order2:=xlAscending, _
Header:=xlYes

JJ = Range(Cells(1, 10), Cells(MR, 10)) 'ω'A予定予定日→部品使用予定日を逐次代入
FF = Range(Cells(1, 32), Cells(MR, 32)) 'ω'倉庫コード
ZZ = Range(Cells(1, 52), Cells(MR, 52)) 'ω'部品使用予定日

For i = 2 To MR
If FF(i, 1) >= 99928 Then
Range(Cells(1, 10), Cells(MR, 10)) = JJ
i = MR
Else
JJ(i, 1) = ZZ(i, 1)
End If
Next i

End Sub

Private Sub サンプルK05()
サンプルA01_3
End Sub

Private Sub サンプルK07()
'ω'注残計算
Dim MP As String
MP = "D:\"
Workbooks.Open Filename:="D:\" & Dir(MP & "czan_H*.csv")
Dim wb1 As Workbook
Set wb1 = ActiveWorkbook

'ω'注番[*計画*]データ削除
ActiveSheet.Cells(1, 1).AutoFilter Field:=2, Criteria1:="<>*計画*", Operator:=xlFilterValues
フィルタ削除01
'ω'該当倉庫以外データ削除
ActiveSheet.Cells(1, 1).AutoFilter Field:=18, Criteria1:=Array("99924", "99925", "99927", "99928", "99929", "99903", "99904", "99905"), Operator:=xlFilterValues
フィルタ削除01

'ω'不要列削除
Range("H:U").Delete
Range("A:D").Delete

'ω'数の合計,A列についてC列の数を合計する
MR = Cells(Rows.Count, 1).End(xlUp).Row 'ω'最終行,B:B
For i = 2 To MR
Cells(i, 4) = WorksheetFunction.SumIf(Range(Cells(2, 1), Cells(MR, 1)), Cells(i, 1), Range(Cells(2, 3), Cells(i, 3)))
Next i

Cells(1, 4) = "注残"

'ω'連番追加1以外削除
'ω'Dim MR As Long
Dim MC As Long
'ω'Dim i As Long
Dim j As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(2, 1), Order1:=xlAscending, _
Header:=xlYes
j = 1
ZZ = Range(Cells(1, 26), Cells(MR, 26))
AA = Range(Cells(1, 1), Cells(MR + 1, 1))
For i = 2 To MR
ZZ(i, 1) = j
j = j + 1
If AA(i, 1) <> AA(i + 1, 1) Then
j = 1
End If
Next i
Range(Cells(1, 26), Cells(MR, 26)) = ZZ
Cells(1, 26) = "削除"
Cells(1, 26).AutoFilter Field:=1, Criteria1:=1
フィルタ削除01

'ω'STA化検討データ→部品割当リスト、シートコピー
ActiveSheet.Copy After:=Workbooks("部品割当リスト_最新.xlsx").Sheets(Workbooks("部品割当リスト_最新.xlsx").Sheets.Count)
ActiveSheet.Name = "検デ"
wb1.Close

End Sub

Private Sub サンプルK08()
サンプルA03
End Sub

Private Sub サンプルK09()
サンプルA04_1
End Sub

Private Sub サンプルK10()
'ω'サンプルAにデータがない場合ドライ以外必要割当削除
'ω'品名[#N/A]データ削除
Cells(1, 1).AutoFilter Field:=9, Criteria1:="<>#N/A", Operator:=xlFilterValues
フィルタ削除01
End Sub

Private Sub サンプルK11()

'ω'99924,99925,99927,99928,99929以外の倉庫を削除
Worksheets("a").Activate
ActiveSheet.Cells(1, 1).AutoFilter Field:=10, Criteria1:=Array("99924", "99925", "99927", "99928", "99929"), Operator:=xlFilterValues
フィルタ削除01
End Sub

Private Sub サンプルK12()
サンプルA04_4
End Sub

Private Sub サンプルK13()
サンプルA05
End Sub

Private Sub サンプルK14()
サンプルA06
End Sub
Private Sub サンプルK15()
'ω'部品割当リスト、在庫-使用数=残り、列追加
'ω'部品割当リスト、注残、列追加
'ω'部品割当リスト、残り+注残=注残分含残り、列追加
'ω'部品割当リスト、在庫+注残-割当引済=オーダ使用可、列追加

'ω'Worksheets("サンプルAデータリスト").Activate
Dim i As Long
Dim MR As Long
Dim X As String
Dim ws1 As Worksheet
Set ws1 = Worksheets("検デ")

ws1.Cells(1, 1).CurrentRegion.Name = "list1"
Dim SA As Range
Set SA = ws1.Range("list1")

MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B

AA = Range(Cells(1, 19), Cells(MR, 19))
XX = Range(Cells(1, 8), Cells(MR, 8))
For i = 2 To MR
X = XX(i, 1)
AA(i, 1) = Application.VLookup(X, SA, 4, False) 'ω'注残
Next i
Range(Cells(1, 19), Cells(MR, 19)) = AA

'ω'#N/A→0置換
'ω'MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
Range(Cells(1, 19), Cells(MR, 19)).Replace What:="#N/A", replacement:="0"

Dim M As Long, N As Long, Q As Long, R As Long, S As Long
MM = Range(Cells(1, 13), Cells(MR, 13))
NN = Range(Cells(1, 14), Cells(MR, 14))
QQ = Range(Cells(1, 17), Cells(MR, 17))
RR = Range(Cells(1, 18), Cells(MR, 18))
SS = Range(Cells(1, 19), Cells(MR, 19))
TT = Range(Cells(1, 20), Cells(MR, 20))
UU = Range(Cells(1, 21), Cells(MR, 21))
On Error Resume Next 'ω'#N/A無視
For i = 2 To MR
M = MM(i, 1)
N = NN(i, 1)
Q = QQ(i, 1)
RR(i, 1) = M - Q
R = RR(i, 1)
S = SS(i, 1)
TT(i, 1) = R + S
UU(i, 1) = M + S - N
Next i
On Error GoTo 0 'ω'#N/A無視解除
Range(Cells(1, 18), Cells(MR, 18)) = RR
Range(Cells(1, 20), Cells(MR, 20)) = TT
Range(Cells(1, 21), Cells(MR, 21)) = UU

'ω'部品割当リスト、MC最終列取得の為最後に項目追記
Cells(1, 17) = "使用数"
Cells(1, 18) = "残り"
Cells(1, 19) = "注残"
Cells(1, 20) = "注残含残り"
Cells(1, 21) = "オーダ使用可"

End Sub

Private Sub サンプルK16()
サンプルA09_1
End Sub

Private Sub サンプルK17()
サンプルA09_2
End Sub

Private Sub サンプルK18()
サンプルA09_3
End Sub

Private Sub サンプルK21()
サンプルA10
End Sub

Private Sub サンプルK22()
サンプルA11
End Sub

Sub サンプルK00()
'ω'サンプルKマクロ実行
Application.WindowState = xlMinimized
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.AutoRecover.Enabled = False
Application.Calculation = xlCalculationManual

サンプルK01
サンプルK02
サンプルK04_1
サンプルK04_2
サンプルK05
サンプルK07
サンプルK08
サンプルK09
サンプルK10
サンプルK11
サンプルK12
サンプルK13
サンプルK14
サンプルK15
サンプルK16
サンプルK17
サンプルK18
サンプルK21
サンプルK22

Application.Calculation = xlCalculationAutomatic
Application.AutoRecover.Enabled = True
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.DisplayStatusBar = True
Application.ScreenUpdating = True
Application.WindowState = xlNormal

End Sub

■解説

「Module1-サンプルA(共通部分マクロ)」は「Module1」に
他のマクロと共有して使用する「Sub」単位のプログラムが入っている。
「Module2-サンプルK(実行部分マクロ)」は「Module2」に
まとめられた実行マクロで、一部「Module1」から
「Sub」を呼び出して使用している。

実行するとデータ群(xlsxファイル等)から必要な情報を抽出加工して示す。
「インプット(データ群)」⇒「■(ブラックボックス:マクロ)」⇒「アウトプット(抽出加工データ)」
当然参照先のxlsxファイル等ないのでこれだけでは動作しない。
マクロ記述参考のための例示。

「へぇー、VBAマクロの記述ってこんなカンジなんだ」みたいな認識でいいと思う。
人によっては部分的に参考になるかもしれない。
もしくは「この記述はもっとこうしたほうがいい」という意見もあると思う。

初心者向けに言うと、上記みてわかるように
VBAマクロは「Sub」単位のプログラムが集まったもの。
なのでまずは「エクセルファイルを保存したい」
とか、自分が自動化したい工程の一部分を「Sub」単位で記述して
実際に作って動かすのがよい。

マクロが完成したら次工程を「Sub」単位で追記していく。
最終的には全工程を「Sub」単位で記述して、
つないで1つの「Module」にするイメージ。

まずは実際に小さく1つ完成させること。
はじめから大きなモノを作らなくても、
積み重なれば自然と大きくなる。

初心者向けにもう少し細かい解説記事いずれ書くかも。
需要あるのかしらんけど。

シングルクオーテーション「'」だけだどPC版記事
文字色止まらないので、
⇒「'」を「'ω'」に置換。カオ('ω')っぽくした。特に意味はない。
「'」は行右側全部をコメントアウト(プログラム実行しない)
なので実行結果は同じ。苦肉。スマホ版は文字色ないから関係ない。
以上。

ブログ アーカイブ

ラベル

このブログを検索

スポンサーリンク

自己紹介

機械メーカー総合職正社員10年勤務後退職。 エクセルVBAプログラム歴 5年。 LibreOffice(無料)でVBAマクロ検証。
■Fortniteクエスト攻略動画■
■Twitter■
⇒詳細プロフィールを表示

QooQ