返回列表 上一主題 發帖

請問規則02F - 04F 如果在Data Base 篩選在這個範圍内的相關資料

回復 174# 198188


    這6個模板把資料分割成多頁列印(如下圖),請前輩再調整 版面配置

用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 180# 198188

1.        BOM表 漏欄C - F, H, I, K
2.        GASKET 表 漏欄C - E, G - H, J
3.        STRUCTURAL 表 資料齊全
4.        DN MATERIAL 表 漏欄F
5.        FABRICATION EXTRUSION 表 資料齊全
6.        FINISH 因爲未導出,所以未知有沒有漏資料

以上這些漏欄資料的是
Part List表或 Material表 欄位儲存格是空格
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2025-11-13 13:36 編輯

回復 180# 198188


合并及加總數量這部分需要對照每個表的數量欄位,如何加不明確,每個表 加工件編號種類不多,先幫排序再一起,請前輩自行以公式相加

Option Explicit
Public A, Z, R&, W, L, i&, Brr, Mrr, Q, Drr, j%, MyPath$
Sub Form()
Dim Arr, Crr(1 To 100000, 1 To 18), xW$, S, T$, T2$, Ts, xFile$, xBook As Workbook, Re
Ts = Timer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
MyPath = ThisWorkbook.Path & "\"
xFile = "Data Base.xlsx"
On Error Resume Next
Set xBook = Workbooks(xFile)
If xBook Is Nothing Then
   Set xBook = Workbooks.Open(MyPath & xFile, , True, , "")
   Re = True: ThisWorkbook.Activate
End If
On Error GoTo 0
Mrr = xBook.Sheets("Material").UsedRange
If Re = True Then xBook.Close 0
Call RuleRun

For i = 2 To UBound(Mrr): Z(Mrr(i, 3) & "/m") = i: Next
For i = Worksheets.Count To 1 Step -1
   If Z(Sheets(i).Name & "/s") <> "" Then Sheets(i).Delete
Next
If Sheets("Part List").FilterMode = True Then Sheets("Part List").ShowAllData
With Range(Sheets("Part List").[P1], Sheets("Part List").[A65536].End(3)(2))
   With .Columns(15): .Cells = "=ROW()": .Value = .Value: End With
   Brr = .Value
   ReDim Arr(1 To UBound(Brr) - 1, 1 To 1)
   For i = 2 To UBound(Brr)
      T = Left(Brr(i, 1), 2) & "-" & Brr(i, 7)
      If InStr("Y-O", Right(T, 1)) Then Arr(i - 1, 1) = Z(T)
   Next
   .Cells(2, 16).Resize(UBound(Brr) - 1, 1) = Arr
   .Sort KEY1:=.Item(16), Order1:=1, KEY2:=.Item(1), Order1:=1, Header:=1
   Brr = .Value
   .Sort KEY1:=.Item(15), Order1:=1, Header:=1
   .Cells(1, 15).Resize(, 2).EntireColumn.Delete
   A = Crr
   For i = 2 To UBound(Brr) - 1
      If Brr(i, 16) = "" Then Exit For Else T = Brr(i, 16)
      R = R + 1: A(R, 1) = R: Run Replace(Z(T & "/s"), " ", "_")
      If T <> Brr(i + 1, 16) Then
         Sheets(Z(T & "/s")).Copy Before:=Sheets(1)
         ActiveSheet.Name = T
         With Cells(Z(Z(T & "/s") & "/UR"), 1).Resize(R, Z(Z(T & "/s") & "/UC"))
            .Value = A
            .Borders.LineStyle = xlContinuous
            ActiveSheet.PageSetup.PrintArea = Range([A1], .Cells).Address
         End With
         With Range(Z(Z(T & "/s") & "/V1")): .Value = Z(T & Switch(InStr("E0-Y", T), "/RE", T = T, "/ER")): .ShrinkToFit = True: End With
         With Range(Z(Z(T & "/s") & "/V2")): .Value = Z(T & Switch(InStr("M4-- M4-Y IG--", T), "/EEC", InStr("E0-Y", T), "/RC", T = T, "/EE")): .ShrinkToFit = True: End With
         With Range(Z(Z(T & "/s") & "/V3")): .Value = Z(T & "/EC"): .ShrinkToFit = True: End With
         A = Crr: R = 0
      End If
   Next
End With
ThisWorkbook.Activate
Set Z = Nothing
Erase Arr, Brr, Crr, A, Mrr
MsgBox "共耗時:" & Timer - Ts & " 秒"
End Sub

Sub RuleRun()
Dim T$, T2$, S$, i&, j%
Set Z = CreateObject("Scripting.Dictionary")
Brr = [Rule!A1].CurrentRegion
For i = 3 To UBound(Brr)
   For j = 2 To 8
      T = Brr(i, j)
      If T <> "" Then
         If Z(T & "|") = "" Or j = 5 Or j = 8 Then
            Z(T & "^") = Brr(2, j)
            Z(T & "|") = Trim(Mid(Brr(2, j), 1, Len(Brr(2, j)) * 2 - LenB(StrConv(Brr(2, j), vbFromUnicode)) - 2))
         End If
         Exit For
      End If
   Next
   For j = 11 To 28
      If Brr(i, j) = "" Then Exit For
      T2 = Brr(i, 11) & "-" & T
      Z(Brr(i, j) & "-" & T) = T2
      If Z(T2 & "/") = "" Then
         Z(T2 & "/") = Brr(i, 9) & "-" & Z(T & "|")
         Z(T2 & "/ER") = Z(T & "^")
         Z(T2 & "/EE") = Brr(i, 9)
         Z(T2 & "/EC") = Brr(i, 10)
         Z(T2 & "/EEC") = Brr(i, 9) & "/" & Brr(i, 10)
         Z(T2 & "/RC") = Trim(Replace(Replace(Z(T & "^"), Z(T & "|"), ""), "-", ""))
         Z(T2 & "/RE") = Z(T & "|")
      End If
      S = Brr(i, 1)
      Z(T2 & "/s") = S
      Z(S & "/UR") = Sheets(S).[A65536].End(3)(2).Row
      Z(S & "/UC") = Sheets(S).Cells(Z(S & "/UR") - 1, 256).End(xlToLeft).Column
      Z(S & "/V1") = Switch(S = "Bom", "L3", S = "Gasket", "D4", S = "Structural", "C4", S = "Fabrication Extrusion", "A3", S = "Finish", "A3", S = "DN Material", "A3")
      Z(S & "/V2") = Switch(S = "Bom", "A4", S = "Gasket", "D3", S = "Structural", "C3", S = "Fabrication Extrusion", "A4", S = "Finish", "A4", S = "DN Material", "A4")
      Z(S & "/V3") = Switch(S = "Bom", "A5", S = "Gasket", "E3", S = "Structural", "D3", S = "Fabrication Extrusion", "B3", S = "Finish", "B3", S = "DN Material", "B3")
   Next
Next
End Sub

Sub Bom()
A(R, 2) = Brr(i, 1)
A(R, 3) = Brr(i, 12)
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   For j = 0 To 5: A(R, Array(4, 5, 6, 8, 9, 13)(j)) = Mrr(Z(A(R, 3) & "/m"), Array(5, 6, 7, 11, 10, 8)(j)): Next
End If
A(R, 7) = Brr(i, 4) & " x " & Brr(i, 5)
A(R, 10) = Brr(i, 3)
A(R, 18) = Brr(i, 7)
End Sub

Sub Gasket()
For j = 0 To 5: A(R, Array(2, 9, 6, 7, 11, 3)(j)) = Brr(i, Array(1, 3, 5, 6, 7, 12)(j)): Next
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   For j = 0 To 2: A(R, Array(4, 5, 8)(j)) = Mrr(Z(A(R, 3) & "/m"), Array(5, 6, 8)(j)): Next
End If
End Sub

Sub Structural()
For j = 0 To 2: A(R, Array(2, 3, 5)(j)) = Brr(i, Array(1, 2, 3)(j)): Next
L = Split(Brr(i, 2) & "mm", "mm")(0)
W = Split(Brr(i, 2) & "mm", "mm")(1)
L = Val(StrReverse(Mid(Val(StrReverse(L & 1)), 2)))
W = Val(StrReverse(Mid(Val(StrReverse(W & 1)), 2)))
A(R, 6) = L * W
A(R, 8) = A(R, 5) * A(R, 6) / 1000
A(R, 7) = Application.RoundUp(A(R, 5) * A(R, 6) / 1000, 0)
End Sub

Sub DN_Material()
For j = 0 To 3: A(R, Array(2, 3, 4, 7)(j)) = Brr(i, Array(1, 12, 5, 3)(j)): Next
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   A(R, 5) = Mrr(Z(A(R, 3) & "/m"), 11)
   A(R, 6) = Mrr(Z(A(R, 3) & "/m"), 8)
   A(R, 8) = A(R, 5) * A(R, 7)
End If
A(R, 9) = Brr(i, 7)
End Sub

Sub Fabrication_Extrusion()
For j = 0 To 5: A(R, Array(2, 3, 4, 5, 6, 7)(j)) = Brr(i, Array(1, 11, 10, 4, 3, 1)(j)): Next
If A(R, 7) Like "*-*-*" Then
   Q = Split(A(R, 7), "-")
   A(R, 7) = Q(0) & "-" & Q(1)
End If
A(R, 8) = Brr(i, 7)
End Sub

Sub Finish()
For j = 0 To 4: A(R, Array(2, 3, 4, 5, 7)(j)) = Brr(i, Array(2, 3, 4, 5, 6)(j)): Next
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2025-11-13 16:08 編輯

回復 187# 198188


    RunForm Module刪除就可執行

加總的問題請將6模板各手動公式加入1列加總範例上傳

Finish模板如何帶入資料都沒有規則,再繼續研究有意義嗎?
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 189# 198188


1.何謂:紫色合并重複的編碼?
2.總數量相加明確,總重量需要相加嗎? 其他欄位是否也有累加的必要?
3.Fabrication Extrusion表[A3:F3]要合併儲存格嗎?
4.BOM有 要求交貨期的三種批次,所上傳範例直接加總正確嗎?
5.Finish模板帶入規則如何?
請上傳範例檔

請問在此之前的結果檔 & PDF檔是怎麼做出來的,請上傳這些舊結果檔或PDF檔(去除個資/商號...等商機資訊)
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2025-11-17 11:12 編輯

回復 192# 198188


    請前輩試試看

Option Explicit
Public A, Z, R&, W, L, i&, Brr, Mrr, Q, Drr, j%, MyPath$
Sub Form()
Dim Arr, Crr(1 To 100000, 1 To 18), xW$, S, T$, T2$, Ts, xFile$, xBook As Workbook, Re
Ts = Timer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
MyPath = ThisWorkbook.Path & "\"
xFile = "Data Base.xlsx"
On Error Resume Next
Set xBook = Workbooks(xFile)
If xBook Is Nothing Then
   Set xBook = Workbooks.Open(MyPath & xFile, , True, , "")
   Re = True: ThisWorkbook.Activate
End If
On Error GoTo 0
Mrr = xBook.Sheets("Material").UsedRange
If Re = True Then xBook.Close 0
Call RuleRun

For i = 2 To UBound(Mrr): Z(Mrr(i, 3) & "/m") = i: Next
For i = Worksheets.Count To 1 Step -1
   If Z(Sheets(i).Name & "/s") <> "" Then Sheets(i).Delete
Next
If Sheets("Part List").FilterMode = True Then Sheets("Part List").ShowAllData
With Range(Sheets("Part List").[P1], Sheets("Part List").[A65536].End(3)(2))
   With .Columns(15): .Cells = "=ROW()": .Value = .Value: End With
   Brr = .Value
   ReDim Arr(1 To UBound(Brr) - 1, 1 To 1)
   For i = 2 To UBound(Brr)
      T = Left(Brr(i, 1), 2) & "-" & Brr(i, 7)
      If InStr("Y-O", Right(T, 1)) Then Arr(i - 1, 1) = Z(T)
   Next
   .Cells(2, 16).Resize(UBound(Brr) - 1, 1) = Arr
   .Sort KEY1:=.Item(16), Order1:=1, KEY2:=.Item(1), Order1:=1, Header:=1
   Brr = .Value
   .Sort KEY1:=.Item(15), Order1:=1, Header:=1
   .Cells(1, 15).Resize(, 2).EntireColumn.Delete
   A = Crr
   For i = 2 To UBound(Brr) - 1
      If Brr(i, 16) = "" Then Exit For Else T = Brr(i, 16)
      Run Replace(Z(T & "/s"), " ", "_")
      If T <> Brr(i + 1, 16) Then
         Sheets(Z(T & "/s")).Copy Before:=Sheets(1)
         ActiveSheet.Name = T
         With Cells(Z(Z(T & "/s") & "/UR"), 1).Resize(R, Z(Z(T & "/s") & "/UC"))
            .Value = A
            .Borders.LineStyle = xlContinuous
            ActiveSheet.PageSetup.PrintArea = Range([A1], .Cells).Address
         End With
         With Range(Z(Z(T & "/s") & "/V1")): .Value = Z(T & Switch(InStr("E0-Y E0--", T) Or InStr("WT", Right(T, 1)), "/RE", T = T, "/ER")): End With
         With Range(Z(Z(T & "/s") & "/V2")): .Value = Z(T & Switch(InStr("M4-- M4-Y IG--", T), "/EEC", InStr("E0-Y E0--", T) Or InStr("WT", Right(T, 1)), "/RC", T = T, "/EE")): End With
         With Range(Z(Z(T & "/s") & "/V3")): .Value = Z(T & "/EC"): .ShrinkToFit = True: End With
         A = Crr: R = 0
      End If
   Next
End With
ThisWorkbook.Activate
Set Z = Nothing
Erase Arr, Brr, Crr, A, Mrr
MsgBox Timer - Ts & " S"
End Sub

Sub RuleRun()
Dim T$, T2$, S$, i&, j%
Set Z = CreateObject("Scripting.Dictionary")
Brr = [Rule!A1].CurrentRegion
For i = 3 To UBound(Brr)
   For j = 2 To 8
      T = Brr(i, j)
      If T <> "" Then
         If Z(T & "|") = "" Or j = 5 Or j = 8 Then
            Z(T & "^") = Brr(2, j)
            Z(T & "|") = Trim(Mid(Brr(2, j), 1, Len(Brr(2, j)) * 2 - LenB(StrConv(Brr(2, j), vbFromUnicode)) - 2))
         End If
         Exit For
      End If
   Next
   For j = 11 To 28
      If Brr(i, j) = "" Then Exit For
      T2 = Brr(i, 11) & "-" & T
      Z(Brr(i, j) & "-" & T) = T2
      If Z(T2 & "/") = "" Then
         Z(T2 & "/") = Brr(i, 9) & "-" & Z(T & "|")
         Z(T2 & "/ER") = Z(T & "^")
         Z(T2 & "/EE") = Brr(i, 9)
         Z(T2 & "/EC") = Brr(i, 10)
         Z(T2 & "/EEC") = Brr(i, 9) & "/" & Brr(i, 10)
         Z(T2 & "/RC") = Trim(Replace(Replace(Z(T & "^"), Z(T & "|"), ""), "-", ""))
         Z(T2 & "/RE") = Z(T & "|")
      End If
      S = Brr(i, 1)
      Z(T2 & "/s") = S
      Z(S & "/UR") = Sheets(S).[A65536].End(3)(2).Row
      Z(S & "/UC") = Sheets(S).Cells(Z(S & "/UR") - 1, 256).End(xlToLeft).Column
      Z(S & "/V1") = Switch(S = "Bom", "L3", S = "Gasket", "D4", S = "Structural", "C4", S = "Fabrication Extrusion", "A3", S = "Finish", "A3", S = "DN Material", "A3")
      Z(S & "/V2") = Switch(S = "Bom", "A4", S = "Gasket", "D3", S = "Structural", "C3", S = "Fabrication Extrusion", "A4", S = "Finish", "A4", S = "DN Material", "A4")
      Z(S & "/V3") = Switch(S = "Bom", "A5", S = "Gasket", "E3", S = "Structural", "D3", S = "Fabrication Extrusion", "B3", S = "Finish", "B3", S = "DN Material", "B3")
   Next
Next
End Sub

Sub Bom()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 10) = A(R, 10) + Brr(i, 3): Exit Sub
R = R + 1: A(R, 1) = R: A(R, 2) = Brr(i, 1): A(R, 3) = Brr(i, 12)
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   For j = 0 To 5: A(R, Array(4, 5, 6, 8, 9, 13)(j)) = Mrr(Z(A(R, 3) & "/m"), Array(5, 6, 7, 11, 10, 8)(j)): Next
End If
A(R, 7) = Brr(i, 4) & " x " & Brr(i, 5)
A(R, 10) = Brr(i, 3)
A(R, 18) = Brr(i, 7)
End Sub

Sub Gasket()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 9) = A(R, 9) + Brr(i, 3):   Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 5: A(R, Array(2, 9, 6, 7, 11, 3)(j)) = Brr(i, Array(1, 3, 5, 6, 7, 12)(j)): Next
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   For j = 0 To 2: A(R, Array(4, 5, 8)(j)) = Mrr(Z(A(R, 3) & "/m"), Array(5, 6, 8)(j)): Next
End If
End Sub

Sub Structural()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 5) = A(R, 5) + Brr(i, 3): Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 2: A(R, Array(2, 3, 5)(j)) = Brr(i, Array(1, 2, 3)(j)): Next
L = Split(Brr(i, 2) & "mm", "mm")(0)
W = Split(Brr(i, 2) & "mm", "mm")(1)
L = Val(StrReverse(Mid(Val(StrReverse(L & 1)), 2)))
W = Val(StrReverse(Mid(Val(StrReverse(W & 1)), 2)))
A(R, 6) = L * W
A(R, 8) = A(R, 5) * A(R, 6) / 1000
A(R, 7) = Application.RoundUp(A(R, 5) * A(R, 6) / 1000, 0)
End Sub

Sub DN_Material()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 7) = A(R, 7) + Brr(i, 3):   Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 3: A(R, Array(2, 3, 4, 7)(j)) = Brr(i, Array(1, 12, 5, 3)(j)): Next
If A(R, 3) <> "" And Z.Exists(A(R, 3) & "/m") Then
   A(R, 5) = Mrr(Z(A(R, 3) & "/m"), 11)
   A(R, 6) = Mrr(Z(A(R, 3) & "/m"), 8)
   A(R, 8) = A(R, 5) * A(R, 7)
End If
A(R, 9) = Brr(i, 7)
End Sub

Sub Fabrication_Extrusion()
If Brr(i, 1) = Brr(i - 1, 1) Then
   A(R, 6) = A(R, 6) + Brr(i, 3)
   Exit Sub
End If
R = R + 1: A(R, 1) = R
For j = 0 To 5: A(R, Array(2, 3, 4, 5, 6, 7)(j)) = Brr(i, Array(1, 11, 10, 4, 3, 1)(j)): Next
If A(R, 7) Like "*-*-*" Then
   Q = Split(A(R, 7), "-")
   A(R, 7) = Q(0) & "-" & Q(1)
End If
A(R, 8) = Brr(i, 7)
End Sub

Sub Finish()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 5) = A(R, 5) + Brr(i, 5): Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 4: A(R, Array(2, 3, 4, 5, 7)(j)) = Brr(i, Array(2, 3, 4, 5, 6)(j)): Next
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 196# 198188


    BOM類 查Part List表 供應商編號 大部分都是 - ,所以都不必再查下去,所以沒有中文/英文描述資料
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

本帖最後由 Andy2483 於 2025-11-19 09:38 編輯

回復 199# 198188


    比對後沒有錯誤
全部 中文/英文描述空格,其加工件編號所對應的 供應商編號都是空格



A(R,3) 改成 A(R,2) 之後,BOM & Gasket 都可以導出 Material 的資料

模板充填規則裡沒有說明是用Part List的 第1欄(加工件編號)去查 Material 表第2欄 (編號)欄,
後學能做的就是用 Part LIst (加工件編號)對應的12欄(供應商編號)去查 Material表弟3欄(供應商編號),
所以 Part LIst (加工件編號)對應的12欄(供應商編號)大部分都是空格,當然就不會有 中文/英文描述
方案修改如下:

Option Explicit
Public A, Z, R&, W, L, i&, Brr, Mrr, Q, Drr, j%, MyPath$
Sub Form()
Dim Arr, Crr(1 To 100000, 1 To 18), xW$, S, T$, T2$, Ts, xFile$, xBook As Workbook, Re
Ts = Timer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
MyPath = ThisWorkbook.Path & "\"
xFile = "Data Base.xlsx"
On Error Resume Next
Set xBook = Workbooks(xFile)
If xBook Is Nothing Then
   Set xBook = Workbooks.Open(MyPath & xFile, , True, , "")
   Re = True: ThisWorkbook.Activate
End If
On Error GoTo 0
Mrr = xBook.Sheets("Material").UsedRange
If Re = True Then xBook.Close 0
Call RuleRun

For i = 2 To UBound(Mrr): Z(Mrr(i, 2) & "/m") = i: Next
For i = Worksheets.Count To 1 Step -1
   If Z(Sheets(i).Name & "/s") <> "" Then Sheets(i).Delete
Next
If Sheets("Part List").FilterMode = True Then Sheets("Part List").ShowAllData
With Range(Sheets("Part List").[P1], Sheets("Part List").[A65536].End(3)(2))
   With .Columns(15): .Cells = "=ROW()": .Value = .Value: End With
   Brr = .Value
   ReDim Arr(1 To UBound(Brr) - 1, 1 To 1)
   For i = 2 To UBound(Brr)
      T = Left(Brr(i, 1), 2) & "-" & Brr(i, 7)
      If InStr("Y-O", Right(T, 1)) Then Arr(i - 1, 1) = Z(T)
   Next
   .Cells(2, 16).Resize(UBound(Brr) - 1, 1) = Arr
   .Sort KEY1:=.Item(16), Order1:=1, KEY2:=.Item(1), Order1:=1, Header:=1
   Brr = .Value
   .Sort KEY1:=.Item(15), Order1:=1, Header:=1
   .Cells(1, 15).Resize(, 2).EntireColumn.Delete
   A = Crr
   For i = 2 To UBound(Brr) - 1
      If Brr(i, 16) = "" Then Exit For Else T = Brr(i, 16)
      Run Replace(Z(T & "/s"), " ", "_")
      If T <> Brr(i + 1, 16) Then
         Sheets(Z(T & "/s")).Copy Before:=Sheets(1)
         ActiveSheet.Name = T
         With Cells(Z(Z(T & "/s") & "/UR"), 1).Resize(R, Z(Z(T & "/s") & "/UC"))
            .Value = A
            .Borders.LineStyle = xlContinuous
            ActiveSheet.PageSetup.PrintArea = Range([A1], .Cells).Address
         End With
         With Range(Z(Z(T & "/s") & "/V1")): .Value = Z(T & Switch(InStr("E0-Y E0--", T) Or InStr("WT", Right(T, 1)), "/RE", T = T, "/ER")): End With
         With Range(Z(Z(T & "/s") & "/V2")): .Value = Z(T & Switch(InStr("M4-- M4-Y IG--", T), "/EEC", InStr("E0-Y E0--", T) Or InStr("WT", Right(T, 1)), "/RC", T = T, "/EE")): End With
         With Range(Z(Z(T & "/s") & "/V3")): .Value = Z(T & "/EC"): .ShrinkToFit = True: End With
         A = Crr: R = 0
      End If
   Next
End With
ThisWorkbook.Activate
Set Z = Nothing
Erase Arr, Brr, Crr, A, Mrr
MsgBox Timer - Ts & " S"
End Sub

Sub RuleRun()
Dim T$, T2$, S$, i&, j%
Set Z = CreateObject("Scripting.Dictionary")
Brr = [Rule!A1].CurrentRegion
For i = 3 To UBound(Brr)
   For j = 2 To 8
      T = Brr(i, j)
      If T <> "" Then
         If Z(T & "|") = "" Or j = 5 Or j = 8 Then
            Z(T & "^") = Brr(2, j)
            Z(T & "|") = Trim(Mid(Brr(2, j), 1, Len(Brr(2, j)) * 2 - LenB(StrConv(Brr(2, j), vbFromUnicode)) - 2))
         End If
         Exit For
      End If
   Next
   For j = 11 To 28
      If Brr(i, j) = "" Then Exit For
      T2 = Brr(i, 11) & "-" & T
      Z(Brr(i, j) & "-" & T) = T2
      If Z(T2 & "/") = "" Then
         Z(T2 & "/") = Brr(i, 9) & "-" & Z(T & "|")
         Z(T2 & "/ER") = Z(T & "^")
         Z(T2 & "/EE") = Brr(i, 9)
         Z(T2 & "/EC") = Brr(i, 10)
         Z(T2 & "/EEC") = Brr(i, 9) & "/" & Brr(i, 10)
         Z(T2 & "/RC") = Trim(Replace(Replace(Z(T & "^"), Z(T & "|"), ""), "-", ""))
         Z(T2 & "/RE") = Z(T & "|")
      End If
      S = Brr(i, 1)
      Z(T2 & "/s") = S
      Z(S & "/UR") = Sheets(S).[A65536].End(3)(2).Row
      Z(S & "/UC") = Sheets(S).Cells(Z(S & "/UR") - 1, 256).End(xlToLeft).Column
      Z(S & "/V1") = Switch(S = "Bom", "L3", S = "Gasket", "D4", S = "Structural", "C4", S = "Fabrication Extrusion", "A3", S = "Finish", "A3", S = "DN Material", "A3")
      Z(S & "/V2") = Switch(S = "Bom", "A4", S = "Gasket", "D3", S = "Structural", "C3", S = "Fabrication Extrusion", "A4", S = "Finish", "A4", S = "DN Material", "A4")
      Z(S & "/V3") = Switch(S = "Bom", "A5", S = "Gasket", "E3", S = "Structural", "D3", S = "Fabrication Extrusion", "B3", S = "Finish", "B3", S = "DN Material", "B3")
   Next
Next
End Sub

Sub Bom()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 10) = A(R, 10) + Brr(i, 3): Exit Sub
R = R + 1: A(R, 1) = R: A(R, 2) = Brr(i, 1) ': A(R, 3) = Brr(i, 12)
If A(R, 2) <> "" And Z.Exists(A(R, 2) & "/m") Then
   For j = 0 To 6
      A(R, Array(3, 4, 5, 6, 8, 9, 13)(j)) = Mrr(Z(A(R, 2) & "/m"), Array(3, 5, 6, 7, 11, 10, 8)(j))
   Next
End If
A(R, 7) = Brr(i, 4) & " x " & Brr(i, 5)
A(R, 10) = Brr(i, 3)
A(R, 18) = Brr(i, 7)
End Sub

Sub Gasket()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 9) = A(R, 9) + Brr(i, 3):   Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 4: A(R, Array(2, 9, 6, 7, 11)(j)) = Brr(i, Array(1, 3, 5, 6, 7)(j)): Next
If A(R, 2) <> "" And Z.Exists(A(R, 2) & "/m") Then
   For j = 0 To 3
      A(R, Array(3, 4, 5, 8)(j)) = Mrr(Z(A(R, 2) & "/m"), Array(3, 5, 6, 8)(j))
   Next
End If
End Sub

Sub Structural()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 5) = A(R, 5) + Brr(i, 3): Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 2: A(R, Array(2, 3, 5)(j)) = Brr(i, Array(1, 2, 3)(j)): Next
L = Split(Brr(i, 2) & "mm", "mm")(0)
W = Split(Brr(i, 2) & "mm", "mm")(1)
L = Val(StrReverse(Mid(Val(StrReverse(L & 1)), 2)))
W = Val(StrReverse(Mid(Val(StrReverse(W & 1)), 2)))
A(R, 6) = L * W
A(R, 8) = A(R, 5) * A(R, 6) / 1000
A(R, 7) = Application.RoundUp(A(R, 5) * A(R, 6) / 1000, 0)
End Sub

Sub DN_Material()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 7) = A(R, 7) + Brr(i, 3):   Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 2: A(R, Array(2, 4, 7)(j)) = Brr(i, Array(1, 5, 3)(j)): Next
If A(R, 2) <> "" And Z.Exists(A(R, 2) & "/m") Then
   A(R, 3) = Mrr(Z(A(R, 2) & "/m"), 3)
   A(R, 5) = Mrr(Z(A(R, 2) & "/m"), 11)
   A(R, 6) = Mrr(Z(A(R, 2) & "/m"), 8)
   A(R, 8) = A(R, 5) * A(R, 7)
End If
A(R, 9) = Brr(i, 7)
End Sub

Sub Fabrication_Extrusion()
If Brr(i, 1) = Brr(i - 1, 1) Then
   A(R, 6) = A(R, 6) + Brr(i, 3)
   Exit Sub
End If
R = R + 1: A(R, 1) = R
For j = 0 To 5: A(R, Array(2, 3, 4, 5, 6, 7)(j)) = Brr(i, Array(1, 11, 10, 4, 3, 1)(j)): Next
If A(R, 7) Like "*-*-*" Then
   Q = Split(A(R, 7), "-")
   A(R, 7) = Q(0) & "-" & Q(1)
End If
A(R, 8) = Brr(i, 7)
End Sub

Sub Finish()
If Brr(i, 1) = Brr(i - 1, 1) Then A(R, 5) = A(R, 5) + Brr(i, 5): Exit Sub
R = R + 1: A(R, 1) = R
For j = 0 To 4: A(R, Array(2, 3, 4, 5, 7)(j)) = Brr(i, Array(2, 3, 4, 5, 6)(j)): Next
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

前輩,測試 Print PDF 後,發現是建立在兩個“資料夾”�堙A如上圖。能不能只建立一個“資料夾 ...
198188 發表於 2025-11-19 09:31


修改方案如下:
Form修改方案 補充在 200樓

Option Explicit
Sub Print_PDF()
Dim T$, NewMyPath, Pj, PP$, Dn$
Application.ScreenUpdating = False
Call RuleRun

Dn = Format(Now, "yyyy_mm_dd_hh_nn_ss")
Pj = ['WO No'!A2].Resize(, 11): Pj = Replace(Join(Application.Transpose(Application.Transpose(Pj)), "_"), "/", "_")
NewMyPath = ThisWorkbook.Path & "\" & Pj & "\"
For i = Worksheets.Count To 1 Step -1
   T = Sheets(i).Name & "/s"
   If Z(T) <> "" Then
      Sheets(i).ExportAsFixedFormat Type:=xlTypePDF, Filename:=NewMyPath & Z(Sheets(i).Name & "/") & ".pdf", _
      Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
   End If
Next
MsgBox "PDF_Save_Address: " & vbLf & NewMyPath
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 204# 198188


    可能是 WO No表[E2]是簡體字造成亂碼
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 人生不一定球球是好球,但是有歷練的強打者,隨時都可以揮棒。
返回列表 上一主題