返回列表 上一主題 發帖

請求改良程式

請求改良程式


請求改良程式:
下面程式有下面問題:
1) 如果Sheet1在 B欄沒有資料的,後面C欄-F欄資料都不會顯示出來。
2)原設計沒有中箱一行
3)資料庫輸入有時會有微改

現想修改比較簡單的規則,只修改圖片部分的規則。
圖片下方是資料庫,每個都固定有5行,但不固定欄數
左上圖為固定模板,按照下方資料庫的位置,排入固定模板。

分割兩欄,
如果有"SR" , 第一欄抽取SR開始到 "(" 或者  ” “ 空格;   
如果沒有"SR" ,第一欄抽取從第一個字到 ” “ 空格;   
舉例
"下架 SR1106(15F单元)" 抽取 "SR1106"   
"SR02 SM-057-094S (T-bolt螺丝垫片)" 抽取 "SR02"
"#2312302240 門框玻璃 280MM =4PCS"  抽取 "#2312302240"
"W001 (OT3工程门玉玻璃GL1-008)" 抽取 "W001"

第二欄抽取第一欄抽取后的所有資料,如果頭尾是“(”“)”就去掉
舉例
"下架 SR1106(15F单元)" 抽取 "15F单元"   
"SR02 SM-057-094S (T-bolt螺丝垫片)" 抽取 "SM-057-094S (T-bolt螺丝垫片"
"#2312302240 門框玻璃 280MM =4PCS"  抽取 "門框玻璃 280MM =4PCS"
"W001 (OT3工程门玉玻璃GL1-008)" 抽取 "OT3工程门玉玻璃GL1-008"

Sub Map()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Brr, Crr, Ar, Arr, V, Z, A, i&, r&, C%, j%, T$, K$, Qs$, Qd$, No$, Mk$, Q$
For i = Worksheets.Count To 4 Step -1: Worksheets(i).Delete: Next
Set Z = CreateObject("Scripting.Dictionary")
Brr = Union(Sheets(1).UsedRange, Sheets(1).UsedRange.Offset(1))
Crr = Range(Sheets(2).[A1], Sheets(2).UsedRange): K = [B1]
For i = 1 To UBound(Brr) - 1
   If InStr(Brr(i, 1), Left(K, 4)) = 0 Then GoTo i01
   A = Split(Replace(Brr(i, 1), "  ", " "), " "): Q = Mid(A(0), 5, 4): Qd = A(1)
   If UBound(A) > 1 Then Qs = A(UBound(A)) Else Qs = ""
   A = Z(Q): r = Z(Q & "/r"): C = 1
   If Not IsArray(A) Then A = Crr: A(3, 2) = Q: A(3, 6) = Qs: A(3, 9) = Qd: A(4, 13) = Date: r = 5
   r = r + 1: V = A(r, 2)
   If InStr(Brr(i, 2), V) = 0 Or r = 10 Then GoTo i01
   For j = 2 To UBound(Brr, 2)
      C = C + 2: T = Trim(Brr(i, j)): If T = "" Then GoTo j01
      If InStr(T, V) Then
         A(r, C) = Mid(T, 4, 6): A(r, C + 1) = Replace(Mid(T, 11), ")", "")
         Else
         Ar = Split(T, Chr(10))
         For Each Arr In Ar
            If Not Split(Arr & " ", " ")(1) Like "[A-z][A-z]" Then GoTo j01
            No = No & Chr(10) & Split(Arr, " ")(0)
            Mk = Mk & Chr(10) & Mid(Arr, InStr(Arr, Split(Arr, " ")(1)))
         Next
         A(r, C) = Mid(No, 2): A(r, C + 1) = Mid(Mk, 2): No = "": Mk = ""
      End If
j01: Next
   Z(Q) = A: Z(Q & "/r") = r
i01: Brr(i + 1, 1) = IIf(Brr(i + 1, 1) = "", Brr(i, 1), Brr(i + 1, 1))
Next
If Z.Count = 0 Then Exit Sub
For Each A In Z.KEYS
   If Not IsArray(Z(A)) Then GoTo A01
   With Sheets(2).Copy(after:=Worksheets(Sheets.Count))
      ActiveSheet.Name = A
      [A1].Resize(UBound(Z(A)), UBound(Z(A), 2)) = Z(A)
   End With
A01: Next
Application.Goto Sheets(1).[A1]
End Sub

BH#001-004 排 櫃 表.rar (67.69 KB)

回復 2# Andy2483



原本的程式是分上架 & 下架來分辨。

因爲實際情況調整了,所以改爲 按照改下圖工程内5行來直接分配入上圖的5行内。

而欄位同樣分割兩部分,套入2個欄位, A / B 欄
欄位内的規則有少許改動。
首欄  A:
如果有 "SR", 就抽取 從“SR" 開始計算到下一個 "空格" / "("  
舉例
下架 SR7000 (22F)               => SR7000
上架 SR70 (22F)                   => SR70
下架SR700(2F)                     => SR700
SR12(32F)                             =>SR12
如果沒有"SR", 就抽取第一個字到第一個空格
舉例
W201 (3-10F)                                       =>W201
2312302240 GLASS                           => 2312302240
#2402190275 WING                          =>#2402190275
TENU7325721-1 GLASS                    =>TENU7325721-1

首欄  B:
抽取首欄A之後的字元,如果首尾是”()“就去掉”()“
舉例
W201 (3F-5F單元)                                         =>3F-5F單元
2312302240 GLASS                                      => GLASS
#2402190275 WING                                    =>WING
TENU7325721-1(5-6F水槽)1500*1200    =>  5-6F水槽)1500*1200
下架 SR7000 WINDOW(22F)                                         => WINDOW(22F
上架 SR70 (22F)                                              => 22F
下架SR700 (2F)                                               => 2F
SR12 (32F)                                                       =>32F

TOP

回復 4# Andy2483


#2312302239 門框玻璃 550MM =11PCS
#2312302236 門框玻璃 300MM =4PCS
#2312302240 門框玻璃 280MM =4PCS
#2402190275 門框玻璃 300MM =4PCS
下架 SR7006 (07F門玉)
這�堿O5行


全部按照資料的順序排列
Sheet1 工作頁 第一行 #2312302239 門框玻璃 550MM =11PCS    等於   MAP 工作頁第6列    最一行的上架
Sheet1 工作頁 第二行 #2312302236 門框玻璃 300MM =4PCS       等於   MAP 工作頁第7列    最二行的下架
Sheet1 工作頁 第三行 #2312302240 門框玻璃 280MM =4PCS      等於    MAP 工作頁第8列    最三行的中箱
Sheet1 工作頁 第四行 #2402190275 門框玻璃 300MM =4PCS      等於    MAP 工作頁第9列    最四行的上架
Sheet1 工作頁 第五行 下架 SR7006 (07F門玉)                                  等於    MAP 工作頁第10列  最五行的下架

不需要根據上架 / 下架來讀取

TOP

本帖最後由 198188 於 2024-3-16 10:16 編輯

回復 6# Andy2483





"MAP" 工作表模板固定行數5行 (列6 "上架",列7 "下架",列8 "中箱",列9 "上架",列10 "下架"), 欄位固定從欄C開始,欄數不固定,取決于 "SHEET1"資料庫

"SHEET1" 工作表資料庫,行數最少5行,欄位固定從欄B開始,欄數不固定

對應數據的規則
Sheet1 該組的第一行  對應 MAP 列6 "上架"
Sheet1 該組的第二行  對應 MAP 列7 "下架"

Sheet1 該組的第三行 (或者第三行 至 尾三行)  對應 MAP 列8 "中箱", 如上圖藍色部分
舉例如果總共6行,第3,4行 對應 MAP 列8 "中箱";如果總共7行,第3,4,5行 對應 MAP 列8 "中箱",如果總共8行,第3,4,5,6行 對應 MAP 列8 "中箱",如此類推

Sheet1 該組的尾二行  對應 MAP 列9 "上架"
Sheet1 該組的第尾行  對應 MAP 列10 "下架"

Sheet1 欄B 對應 MAP 欄 C&D, 欄C 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有); 欄D 抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)
Sheet1 欄C 對應 MAP 欄 E&F, 欄E 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有); 欄F 抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)
Sheet1 欄D 對應 MAP 欄 G&H,欄G 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有); 欄H抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)
Sheet1 欄E 對應 MAP 欄 I&J ,如上
Sheet1 欄F 對應 MAP 欄 K&L , 如上
Sheet1 欄G 對應 MAP 欄 M&N , 如上
Sheet1 欄H 對應 MAP 欄 O&P  ,如上
如此類推

排 櫃 表.rar (59.88 KB)

TOP

回復 8# Andy2483


    #06 是最終的變化了,之前的操作是初步了解。已經經過三個月的測試,才有這個定案。

TOP

回復 10# Andy2483



沒有上箱,下箱 複製上錯誤。 全部都是“上架”,“中箱”,“下架”。
我將Sheet1 & Map 相對的數據,貼在上面同一個圖片,並加入注釋,以便清晰了解。
如果同一個儲存格内有兩個數據,分辨困難的話,可以忽略,將它當作一個數據來做

一個儲存格内有兩個數據,第兩個數據會分開并列,如下。
W105  AA工程FC116   1幅
#2311200805 (VP工程5F栏杆玻璃)=1p

W105   AA工程FC116   1幅
2311200805  VP工程5F栏杆玻璃=1p

如果上面效果分辨困難,就當作一個數據操作,其餘的手動修改,如下:
W105  AA工程FC116   1幅
#2311200805 (VP工程5F栏杆玻璃)=1p

W105   AA工程FC116   1幅       #2311200805 VP工程5F栏杆玻璃=1p

TOP

回復 12# Andy2483


以“Sheet1“ 工作表 欄A來為依據, 用MAP模板分拆不同Sheet
取欄A 以 “#” 開始到第一個空格來命名Sheet Name, 及錄入“B3”儲存格内
Sheet Name空格后的日期,錄入到Map “i3”儲存格内
日期后的45HQ, 40HC, 40GP, 40OT, 40RF, 20GP, 錄入到Map“F3”儲存格内
Map“M4”儲存格内 = TODAY


"MAP" 工作表模板固定行數5行 (列6 "上架",列7 "下架",列8 "中箱",列9 "上架",列10 "下架"), 欄位固定從欄C開始,欄數不固定,取決于 "SHEET1"資料庫

"SHEET1" 工作表資料庫,行數最少5行,欄位固定從欄B開始,欄數不固定

對應數據的規則
欄位規則對應:
Sheet1 欄B 對應 MAP 欄 C&D,
欄C 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有);
欄D 抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)

Sheet1 欄C 對應 MAP 欄 E&F,
欄E 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有);
欄F 抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)

Sheet1 欄D 對應 MAP 欄 G&H,
欄G 抽取 (如有 "SR" ,從"SR"開始 到 第一個空格或者 "(" ;  如沒有"SR" ,從第1個字 到 第一個空格或者 "(" ,並刪除符號 "#" 如有);
欄H抽取 (欄C 取到的字元之後的所有字元,並刪除符號 "(" & ")" 如有)

Sheet1 欄E 對應 MAP 欄 I&J ,如上
Sheet1 欄F 對應 MAP 欄 K&L , 如上
Sheet1 欄G 對應 MAP 欄 M&N , 如上
Sheet1 欄H 對應 MAP 欄 O&P  ,如上
如此類推

如果欄位内一個儲存格内有兩組或以上數據。
一個儲存格内有兩個數據,第兩個數據會分開并列,如下。
W105  AA工程FC116   1幅
#2311200805 (VP工程5F栏杆玻璃)=1p

W105   AA工程FC116   1幅
2311200805  VP工程5F栏杆玻璃=1p

如果上面效果分辨困難,就當作一個數據操作,其餘的手動修改,如下:
W105  AA工程FC116   1幅
#2311200805 (VP工程5F栏杆玻璃)=1p

W105   AA工程FC116   1幅       #2311200805 VP工程5F栏杆玻璃=1p

列位規則對應:

Sheet1 該組的第一列  對應 MAP 列6 "上架"
Sheet1 該組的第二列  對應 MAP 列7 "下架"

Sheet1 該組的第三列 (或者第三行 至 尾三行)  
舉例Sheet1,
如果總共6列,第3,4列 對應 MAP 列8 "中箱"; 第3,4列的分拆欄位數據錄入同一個相對應的欄位

如果總共7列,第3,4,5列 對應 MAP 列8 "中箱",第3,4,5列的分拆欄位數據錄入同一個相對應的欄位

如果總共8列,第3,4,5,6列 對應 MAP 列8 "中箱"第3,4,5,6列的分拆欄位數據錄入同一個相對應的欄位

如此類推


Sheet1 該組的尾二列  對應 MAP 列9 "上架"
Sheet1 該組的第尾列  對應 MAP 列10 "下架"

TOP

回復 14# Andy2483


我運行后,在#004卡住了,不知道哪�堨X現問題。附上Excel.

另外分割第一欄位 C, E, G, I, K, M,沒有去掉 “ # ”,分割第二欄位D, F, H, J, L, N 沒有去掉 " ( " & " ) "

排 櫃 表.rar (40.43 KB)

TOP

回復 16# Andy2483

好像是中英文的)問題,實際就不知道是不是。那些有問題的儲存格改了英文的)就沒問題。

另外下面這個功能是否做不到?

分割第一欄位 C, E, G, I, K, M,沒有去掉 “ # ”,分割第二欄位D, F, H, J, L, N 沒有去掉 " ( " & " ) "

下面這些去掉 “(” & “)”
(02F单元)
(02F单元)
(9-12F门散件)
(2-7F栏杆)

下面這些去掉  “ # ”
#2312302239
#2312302236
#2312302240
#2402190275

TOP

回復 18# Andy2483


    加在哪個位置上?

TOP

        靜思自在 : 地上種了菜,就不易長草;心中有善,就不易生惡。
返回列表 上一主題