Tôi đã tính nói:Nếu bỏ Merge cell thì đa phần có thể dùng hàm vlookup.
Làm theo ý hiểu.Em muốn làm bảng phân tích nhanh hơn từ BOM bên khách hàng cho, Bình thường em làm thủ công rất là lâu, Mong anh chị giúp đỡ ạ
Option Explicit
Sub Doan()
Dim i&, j&, Lr&, t&, k&, R&, C&, A&
Dim Arr(), DaTa(), KQ()
Dim Sh As Worksheet, Ws As Worksheet
Dim Dic As Object, Key, Temp
Set Sh = Sheets("DuLieu")
Lr = Sh.Range("A100000").End(xlUp).Row
DaTa = Sh.Range("A2:J" & Lr).Value
R = UBound(DaTa)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To R
Key = VBA.Trim(DaTa(i, 2))
Dic(Key) = i
Next i
Set Ws = Sheets("BOM KH")
Lr = Ws.Range("A100000").End(xlUp).Row
Arr = Ws.Range("A7:K" & Lr).Value
R = UBound(Arr)
ReDim KQ(1 To R * 10, 1 To 15)
For i = 1 To R
k = k + 1: A = 0
Temp = VBA.Trim(Arr(i, 1))
For j = 1 To Arr(i, 6)
If j > 1 Then k = k + 1: A = 1
KQ(k, 1) = k
KQ(k, 2) = Arr(i, 1)
KQ(k, 3) = Arr(i, 2)
If A = 0 Then
KQ(k, 4) = Arr(i, 6)
KQ(k, 5) = Split(Arr(i, 2), ">")(0)
KQ(k, 6) = "SMT"
End If
If Dic.Exists(Temp) Then
KQ(k, 7) = DaTa(Dic(Temp), 4)
KQ(k, 8) = DaTa(Dic(Temp), 8)
KQ(k, 9) = DaTa(Dic(Temp), 5)
KQ(k, 10) = DaTa(Dic(Temp), 7)
KQ(k, 11) = DaTa(Dic(Temp), 9)
KQ(k, 12) = DaTa(Dic(Temp), 8)
KQ(k, 13) = DaTa(Dic(Temp), 10)
KQ(k, 14) = DaTa(Dic(Temp), 8)
End If
If Arr(i, 11) <> Empty Then KQ(k, 15) = Split(Arr(i, 11), ",")(j - 1)
Next j
Next i
Sheets("BangPhanTic").Range("X13").Resize(k, 15) = KQ
Set Dic = Nothing
End Sub
Vâng, để em xem có được không ạLàm theo ý hiểu.
Trong khi chờ các giải pháp khác, bạn chủ thớt có thể tham khảo code sau:
Kết quả trả về đang để ở Vùng X13:AL...để dex đối chiếu.Mã:Option Explicit Sub Doan() Dim i&, j&, Lr&, t&, k&, R&, C&, A& Dim Arr(), DaTa(), KQ() Dim Sh As Worksheet, Ws As Worksheet Dim Dic As Object, Key, Temp Set Sh = Sheets("DuLieu") Lr = Sh.Range("A100000").End(xlUp).Row DaTa = Sh.Range("A2:J" & Lr).Value R = UBound(DaTa) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To R Key = VBA.Trim(DaTa(i, 2)) Dic(Key) = i Next i Set Ws = Sheets("BOM KH") Lr = Ws.Range("A100000").End(xlUp).Row Arr = Ws.Range("A7:K" & Lr).Value R = UBound(Arr) ReDim KQ(1 To R * 10, 1 To 15) For i = 1 To R k = k + 1: A = 0 Temp = VBA.Trim(Arr(i, 1)) For j = 1 To Arr(i, 6) If j > 1 Then k = k + 1: A = 1 KQ(k, 1) = k KQ(k, 2) = Arr(i, 1) KQ(k, 3) = Arr(i, 2) If A = 0 Then KQ(k, 4) = Arr(i, 6) KQ(k, 5) = Split(Arr(i, 2), ">")(0) KQ(k, 6) = "SMT" End If If Dic.Exists(Temp) Then KQ(k, 7) = DaTa(Dic(Temp), 4) KQ(k, 8) = DaTa(Dic(Temp), 8) KQ(k, 9) = DaTa(Dic(Temp), 5) KQ(k, 10) = DaTa(Dic(Temp), 7) KQ(k, 11) = DaTa(Dic(Temp), 9) KQ(k, 12) = DaTa(Dic(Temp), 8) KQ(k, 13) = DaTa(Dic(Temp), 10) KQ(k, 14) = DaTa(Dic(Temp), 8) End If If Arr(i, 11) <> Empty Then KQ(k, 15) = Split(Arr(i, 11), ",")(j - 1) Next j Next i Sheets("BangPhanTic").Range("X13").Resize(k, 15) = KQ Set Dic = Nothing End Sub
Xem file. Nhấn nút mũi tên để xem và kiểm tra kết quả.
Bác thêm chỗ " Công Đoạn" đang không hoạt động ạ, em cảm ơnLàm theo ý hiểu.
Trong khi chờ các giải pháp khác, bạn chủ thớt có thể tham khảo code sau:
Kết quả trả về đang để ở Vùng X13:AL...để dex đối chiếu.Mã:Option Explicit Sub Doan() Dim i&, j&, Lr&, t&, k&, R&, C&, A& Dim Arr(), DaTa(), KQ() Dim Sh As Worksheet, Ws As Worksheet Dim Dic As Object, Key, Temp Set Sh = Sheets("DuLieu") Lr = Sh.Range("A100000").End(xlUp).Row DaTa = Sh.Range("A2:J" & Lr).Value R = UBound(DaTa) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To R Key = VBA.Trim(DaTa(i, 2)) Dic(Key) = i Next i Set Ws = Sheets("BOM KH") Lr = Ws.Range("A100000").End(xlUp).Row Arr = Ws.Range("A7:K" & Lr).Value R = UBound(Arr) ReDim KQ(1 To R * 10, 1 To 15) For i = 1 To R k = k + 1: A = 0 Temp = VBA.Trim(Arr(i, 1)) For j = 1 To Arr(i, 6) If j > 1 Then k = k + 1: A = 1 KQ(k, 1) = k KQ(k, 2) = Arr(i, 1) KQ(k, 3) = Arr(i, 2) If A = 0 Then KQ(k, 4) = Arr(i, 6) KQ(k, 5) = Split(Arr(i, 2), ">")(0) KQ(k, 6) = "SMT" End If If Dic.Exists(Temp) Then KQ(k, 7) = DaTa(Dic(Temp), 4) KQ(k, 8) = DaTa(Dic(Temp), 8) KQ(k, 9) = DaTa(Dic(Temp), 5) KQ(k, 10) = DaTa(Dic(Temp), 7) KQ(k, 11) = DaTa(Dic(Temp), 9) KQ(k, 12) = DaTa(Dic(Temp), 8) KQ(k, 13) = DaTa(Dic(Temp), 10) KQ(k, 14) = DaTa(Dic(Temp), 8) End If If Arr(i, 11) <> Empty Then KQ(k, 15) = Split(Arr(i, 11), ",")(j - 1) Next j Next i Sheets("BangPhanTic").Range("X13").Resize(k, 15) = KQ Set Dic = Nothing End Sub
Xem file. Nhấn nút mũi tên để xem và kiểm tra kết quả.
Không hiểu?Bác thêm chỗ " Công Đoạn" đang không hoạt động ạ
Chỗ sheet dữ liệu em có list những mã vật liệu linh kiện gắn tay ạ.Không hiểu?
Bạn đã chạy thử chưa? Code hoạt động thế nào?
Những chỗ bạn muốn nó là "lặp tay", hay "gì gì đó" mà không nó điều kiện như thế nào thì là "lắp tay" hay như thế nào thì là "SMT" thì chỉ có thánh mới hiểu và làm được.
Chỗ sheet dữ liệu em có list những mã vật liệu linh kiện gắn tay ạ.
còn mã nào không nằm trong list sẽ là mã vật liệu gắn SMT ạ.
Chỗ sheet dữ liệu em có list những mã vật liệu linh kiện gắn tay ạ.
Bài đã được tự động gộp:
Thay code cũ bằng code này
Option Explicit
Sub Doan()
Dim i&, j&, Lr&, t&, k&, R&, C&, A&
Dim Arr(), DaTa(), CongDoan(), KQ(), S
Dim Sh As Worksheet, Ws As Worksheet
Dim Dic As Object, Key, Temp
Set Sh = Sheets("DuLieu")
Lr = Sh.Range("A100000").End(xlUp).Row
DaTa = Sh.Range("A3:J" & Lr).Value
CongDoan = Sh.Range("N2:P" & Sh.Range("P100000").End(xlUp).Row).Value
R = UBound(DaTa)
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To R
Key = VBA.Trim(DaTa(i, 2))
Dic(Key) = i
Next i
For i = 1 To UBound(CongDoan)
Key = VBA.Trim(CongDoan(i, 1))
If Not Dic.Exists(Key) Then
Dic(Key) = i & "," & CongDoan(i, 3)
Else
Dic(Key) = Dic(Key) & "," & CongDoan(i, 3)
End If
Next i
Set Ws = Sheets("BOM KH")
Lr = Ws.Range("A100000").End(xlUp).Row
Arr = Ws.Range("A7:K" & Lr).Value
R = UBound(Arr)
ReDim KQ(1 To R * 10, 1 To 15)
For i = 1 To R
k = k + 1: A = 0
Temp = VBA.Trim(Arr(i, 1))
For j = 1 To Arr(i, 6)
If j > 1 Then k = k + 1: A = 1
KQ(k, 1) = k
KQ(k, 2) = Arr(i, 1)
KQ(k, 3) = Arr(i, 2)
If A = 0 Then
KQ(k, 4) = Arr(i, 6)
KQ(k, 5) = Split(Arr(i, 2), ">")(0)
End If
If Dic.Exists(Temp) Then
S = Split(Dic(Temp), ",")
If UBound(S) > 0 Then
KQ(k, 6) = S(1)
Else
KQ(k, 6) = "SMT"
End If
KQ(k, 7) = DaTa(S(0), 4)
KQ(k, 8) = DaTa(S(0), 8)
KQ(k, 9) = DaTa(S(0), 5)
KQ(k, 10) = DaTa(S(0), 7)
KQ(k, 11) = DaTa(S(0), 9)
KQ(k, 12) = DaTa(S(0), 8)
KQ(k, 13) = DaTa(S(0), 10)
KQ(k, 14) = DaTa(S(0), 8)
Else
KQ(k, 6) = "SMT"
End If
If Arr(i, 11) <> Empty Then KQ(k, 15) = Split(Arr(i, 11), ",")(j - 1)
Next j
Next i
Sheets("BangPhanTic").Range("X13").Resize(k, 15) = KQ
Set Dic = Nothing
End Sub
Tuyệt vời ông mặt trời luôn ạ. Em cảm ơnThay code cũ bằng code này
Chạy thử ->>Hồi âmMã:Option Explicit Sub Doan() Dim i&, j&, Lr&, t&, k&, R&, C&, A& Dim Arr(), DaTa(), CongDoan(), KQ(), S Dim Sh As Worksheet, Ws As Worksheet Dim Dic As Object, Key, Temp Set Sh = Sheets("DuLieu") Lr = Sh.Range("A100000").End(xlUp).Row DaTa = Sh.Range("A3:J" & Lr).Value CongDoan = Sh.Range("N2:P" & Sh.Range("P100000").End(xlUp).Row).Value R = UBound(DaTa) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To R Key = VBA.Trim(DaTa(i, 2)) Dic(Key) = i Next i For i = 1 To UBound(CongDoan) Key = VBA.Trim(CongDoan(i, 1)) If Not Dic.Exists(Key) Then Dic(Key) = i & "," & CongDoan(i, 3) Else Dic(Key) = Dic(Key) & "," & CongDoan(i, 3) End If Next i Set Ws = Sheets("BOM KH") Lr = Ws.Range("A100000").End(xlUp).Row Arr = Ws.Range("A7:K" & Lr).Value R = UBound(Arr) ReDim KQ(1 To R * 10, 1 To 15) For i = 1 To R k = k + 1: A = 0 Temp = VBA.Trim(Arr(i, 1)) For j = 1 To Arr(i, 6) If j > 1 Then k = k + 1: A = 1 KQ(k, 1) = k KQ(k, 2) = Arr(i, 1) KQ(k, 3) = Arr(i, 2) If A = 0 Then KQ(k, 4) = Arr(i, 6) KQ(k, 5) = Split(Arr(i, 2), ">")(0) End If If Dic.Exists(Temp) Then S = Split(Dic(Temp), ",") If UBound(S) > 0 Then KQ(k, 6) = S(1) Else KQ(k, 6) = "SMT" End If KQ(k, 7) = DaTa(S(0), 4) KQ(k, 8) = DaTa(S(0), 8) KQ(k, 9) = DaTa(S(0), 5) KQ(k, 10) = DaTa(S(0), 7) KQ(k, 11) = DaTa(S(0), 9) KQ(k, 12) = DaTa(S(0), 8) KQ(k, 13) = DaTa(S(0), 10) KQ(k, 14) = DaTa(S(0), 8) Else KQ(k, 6) = "SMT" End If If Arr(i, 11) <> Empty Then KQ(k, 15) = Split(Arr(i, 11), ",")(j - 1) Next j Next i Sheets("BangPhanTic").Range("X13").Resize(k, 15) = KQ Set Dic = Nothing End Sub