Lọc thông tin của linh kiện điện tử

  • Thread starter Thread starter th7
  • Ngày gửi Ngày gửi
Liên hệ QC
Chào bạn HUONGHCKT,
Mình diễn giải thêm thông tin:
Dữ liệu mình đưa là các linh kiện SMD (linh kiện dán bề mặt)
Các linh kiện Điện trở, tụ điện thì sẽ được đóng gói theo dạng băng (mình hay gọi là Reel) các linh kiện này thường có kích thước hình chữ nhật nên sẽ có một loại đóng gói cho nó, các con số 0201, 0805, 1206, 2512,..nó là mô tả kích thước như hình dưới,
View attachment 273601
Thường thì hơn 95% linh kiện tụ điện (CAP) sẽ có mô tả chữ CAPACITOR hoặc CAP, nhưng như ví dụ này, .0022UF 50V SM1206 10% , không có để nên mình dựa vào đơn vị UF,( microfara) hoặc PF ( picofara) hoặc NF ( nanofara) để đặt cho nó cái tên đại điện để nhận dạng nó là "C"
các thông số 50V mình không lấy nó, 10% là sai số, SM1206 là đóng gói linh kiện,
Đơn vị của tụ, mình chỉ lấy UF, PF, NF, chứ V mình không có lấy.
Đơn vị của điện trở, mình chỉ lấy, K (kilo om), M, (mega om), R (om)
Tương tự cho Inductor, varistor, mình cũng có để trong diễn giải sheet "requirement"

Để rõ .0022UF 50V SM1206 10% thì sẽ có một mã MPN (manufacturing part number) từ nhà sản xuất, sẽ có datasheet chi tiết nói vè các con số này,
Mình đưa mã MPN cho bạn tham khảo thêm "C1206C222K5RACTU" https://www.mouser.vn/ProductDetail/KEMET/C1206C222K5RACTU?qs=8786zKh2EOwEPvtogAbwBg==

Như bạn befaint có diễn giải:
View attachment 273602
Đúng mong muốn,
Mình có làm mẫu thêm một số các ví dụ ở cột E, bạn tham khảo để biết thêm,
Cái sheet "Requirement-v1" nó giống như database để so sánh tìm kiếm dữ liệu giống để hỗ trợ cho sheet "data-v1"
mình sẽ tải dữ liệu về và sẽ có 4 cột thông tin (part number, description, location, qty.) kết quả mình mong muốn là nhận được ở cột E.
(sau khi làm xong bước này, mình còn một bước nữa đó là Vlookup thông tin Location (trong file tọa độ linh kiện, nhưng bước này, mình làm sau.)
View attachment 273609

Còn thông tin nào chưa rõ, Bạn chia sẻ thêm, mình bổ xung nha.
Cảm ơn.
Data không đồng bộ như này rất khó để làm. Ví dụ như vị trí của các giá trị tương đồng trong chuỗi khác nhau, kể cả cùng là CAP nhưng giá trị chất liệu vị trí cũng khác nhau, phải lồng thêm câu điều kiện, nếu có lỗi thì truy xuất cũng mất nhiều thời gian.
Ví dụ như riêng trường hợp UF đã trả ra nhiều kết quả, liệu có biết là bao nhiêu trường hợp xả ra trong đơn vị UF.
Các trường hợp không đồng bộ như này thì dùng Pivot để tạo bảng data như danh mục để suy ra kết quả mong muốn cuối cùng thôi.
 
Data không đồng bộ như này rất khó để làm. Ví dụ như vị trí của các giá trị tương đồng trong chuỗi khác nhau, kể cả cùng là CAP nhưng giá trị chất liệu vị trí cũng khác nhau, phải lồng thêm câu điều kiện, nếu có lỗi thì truy xuất cũng mất nhiều thời gian.
Ví dụ như riêng trường hợp UF đã trả ra nhiều kết quả, liệu có biết là bao nhiêu trường hợp xả ra trong đơn vị UF.
Các trường hợp không đồng bộ như này thì dùng Pivot để tạo bảng data như danh mục để suy ra kết quả mong muốn cuối cùng thôi.
Đúng là dữ liệu data không đồng bộ nên làm để tính hết các trường hợp quả là quá khó. Cùng là tên gọi của 1 loại linh kiện nhưng không biết có giống nhau không khi toàn bộ phần đầu giồng nhau nhưng có cái thì có thêm dấu ".", khi thì có thêm dấu "," hay dấu"-"...., có cái cũng không có tên trong bảng danh mục và cũng chẳng có thông số nào để xác định nó là gì , thuộc loại nào. (Vi dụ : SMD 2N2222A SOT-23 MMBT2222A thì đây thuộc loại nào? ) hay SOT-223 bên cột "Đóng gói linh kiện cho IC,OP, FET" dòng 122 và bên cột " Đóng gói linh kiện cho DIODE" cũng có ở dòng 46, Bên cột "Đóng gói ... cho TRANSISTOR" cũng có ở dòng 22.
Tôi không thạo Pivot, nên không biết nghĩ cách nào để làm được bằng Pivot.
Bạn thông thạo Pivot thì HÃY giúp tôi (để học hỏi thêm) và bạn ấy nhé.
Tôi có cảm giác bạn chủ thớt hình như cũng không hào hứng lắm mà đang có ý chờ đợi những giải pháp cao cấp hơn. Bởi thấy khi đăng bài để hỏi, được các thành viên trao đổi sôi nổi thế, thế nhưng chẳng thấy bạn ấy ở đâu. (đừng nói với tôi rằng bận quá không lên diễn đàn để xem được nhé!?). Cách bạn ấy mô tả thì như kiểu " tạo cho người khác có cơ hội phát triển tư duy, óc suy đoán" ấy trong khi biết chắc người giúp không tinh anh như người ta.
Tôi đã cày cả ngày nay và cũng đã được hòm hòm (theo ý hiểu của mình), tuy vẫn còn khúc mắc ở 1 vài đoạn và có lẽ lại ốm ra rồi.
 
Đúng là dữ liệu data không đồng bộ nên làm để tính hết các trường hợp quả là quá khó. Cùng là tên gọi của 1 loại linh kiện nhưng không biết có giống nhau không khi toàn bộ phần đầu giồng nhau nhưng có cái thì có thêm dấu ".", khi thì có thêm dấu "," hay dấu"-"...., có cái cũng không có tên trong bảng danh mục và cũng chẳng có thông số nào để xác định nó là gì , thuộc loại nào. (Vi dụ : SMD 2N2222A SOT-23 MMBT2222A thì đây thuộc loại nào? ) hay SOT-223 bên cột "Đóng gói linh kiện cho IC,OP, FET" dòng 122 và bên cột " Đóng gói linh kiện cho DIODE" cũng có ở dòng 46, Bên cột "Đóng gói ... cho TRANSISTOR" cũng có ở dòng 22.
Tôi không thạo Pivot, nên không biết nghĩ cách nào để làm được bằng Pivot.
Bạn thông thạo Pivot thì HÃY giúp tôi (để học hỏi thêm) và bạn ấy nhé.
Tôi có cảm giác bạn chủ thớt hình như cũng không hào hứng lắm mà đang có ý chờ đợi những giải pháp cao cấp hơn. Bởi thấy khi đăng bài để hỏi, được các thành viên trao đổi sôi nổi thế, thế nhưng chẳng thấy bạn ấy ở đâu. (đừng nói với tôi rằng bận quá không lên diễn đàn để xem được nhé!?). Cách bạn ấy mô tả thì như kiểu " tạo cho người khác có cơ hội phát triển tư duy, óc suy đoán" ấy trong khi biết chắc người giúp không tinh anh như người ta.
Tôi đã cày cả ngày nay và cũng đã được hòm hòm (theo ý hiểu của mình), tuy vẫn còn khúc mắc ở 1 vài đoạn và có lẽ lại ốm ra rồi.
Em chào Anh HUONGHCKT,
Thật sự em cũng ngóng lắm, cũng muốn chia sẻ tất cả những gì mọi người đang thắc mắc để hỗ trợ bài này, cố gắng diễn giải và cũng đưa hết dữ liệu em có ra rồi, ngoài viết hàm bằng tay từng cái với tham khảo code VBA của mọi người hỗ trợ, em cũng còn biết giải pháp nào nữa đâu để trong mong, thiệt sự, dữ liệu có như thế nào, em cũng đã diễn giải hết ra rồi, và dữ liệu này, nó cũng không được đồng nhất hết ở phần mô tả là bởi vì, mỗi loại linh kiện được sản xuất bởi các nhà cung cấp khác nhau, rồi cái người thiết kế, phòng nghiên cứu và phát triển (R&D) có nhiều nơi, trên thế giới, họ đặt và ghi tên như vậy, nên dữ liệu mới có nhiều loại như vậy.
Em có để hàm vào nhưng cũng lấy loạn xạ lên hết, nếu mà không được, chắc em sẽ tạm chấp nhận và dùng như vậy, nhưng trong công việc, sẽ khó nhìn nhận hơn,
Em cũng cám ơn mọi người rất nhiều, đã hỗ trợ.
 

File đính kèm

Đúng là dữ liệu data không đồng bộ nên làm để tính hết các trường hợp quả là quá khó. Cùng là tên gọi của 1 loại linh kiện nhưng không biết có giống nhau không khi toàn bộ phần đầu giồng nhau nhưng có cái thì có thêm dấu ".", khi thì có thêm dấu "," hay dấu"-"...., có cái cũng không có tên trong bảng danh mục và cũng chẳng có thông số nào để xác định nó là gì , thuộc loại nào. (Vi dụ : SMD 2N2222A SOT-23 MMBT2222A thì đây thuộc loại nào? ) hay SOT-223 bên cột "Đóng gói linh kiện cho IC,OP, FET" dòng 122 và bên cột " Đóng gói linh kiện cho DIODE" cũng có ở dòng 46, Bên cột "Đóng gói ... cho TRANSISTOR" cũng có ở dòng 22.
Tôi không thạo Pivot, nên không biết nghĩ cách nào để làm được bằng Pivot.
Bạn thông thạo Pivot thì HÃY giúp tôi (để học hỏi thêm) và bạn ấy nhé.
Tôi có cảm giác bạn chủ thớt hình như cũng không hào hứng lắm mà đang có ý chờ đợi những giải pháp cao cấp hơn. Bởi thấy khi đăng bài để hỏi, được các thành viên trao đổi sôi nổi thế, thế nhưng chẳng thấy bạn ấy ở đâu. (đừng nói với tôi rằng bận quá không lên diễn đàn để xem được nhé!?). Cách bạn ấy mô tả thì như kiểu " tạo cho người khác có cơ hội phát triển tư duy, óc suy đoán" ấy trong khi biết chắc người giúp không tinh anh như người ta.
Tôi đã cày cả ngày nay và cũng đã được hòm hòm (theo ý hiểu của mình), tuy vẫn còn khúc mắc ở 1 vài đoạn và có lẽ lại ốm ra rồi.
Pivot thực chất là điểm danh sản phẩm ví dụ như khi dùng fiter bộ lọc đã lọc các sản phẩm cùng thông tin, pivot sẽ tương tự như filter nhưng lập thành 1 bảng tổng hợp số lượng để biết danh sách có bao nhiêu sản phẩm, số lượng mỗi sản phẩm.
Ví dụ: Khi thi công đã bóc tách vật tư tại các điểm thi công, mỗi điểm thi công nằm trên 1 sheet, trong mỗi điểm có 1 số sản phẩm giống nhau. Vậy để tính tổng khối lượng sản phẩm của tất cả vị trí, và biết được có tổng cộng bao nhiêu sản phẩm lúc này ta sẽ dùng vba để gộp tất cả các sheet, sau đó bôi đen toàn bộ bảng và sử dụng Insert -> PivotTable ta sẽ có đc bảng tổng hợp
 
Bạn thông thạo Pivot thì HÃY giúp tôi (để học hỏi thêm) và bạn ấy nhé.
Em mượn cái dép tổ ong của bác nhé.
Lót dép tổ ong xem Pivot mần bài xử lý chuỗi này thế nào.
Lần đầu tiên trong đời thấy ý tưởng hay quá nên em cũng rất tò mò.
 
Em mượn cái dép tổ ong của bác nhé.
Lót dép tổ ong xem Pivot mần bài xử lý chuỗi này thế nào.
Lần đầu tiên trong đời thấy ý tưởng hay quá nên em cũng rất tò mò.
Ý mình là khi nhìn bảng của bạn ấy đưa ra, có rất nhiều đợt nhập hàng từ các nhà sản xuất, thì sẽ có những lần nhập về sản phẩm cùng mã, nếu Find từng sản phẩm 1 thì khá lâu, thay vào đó ta dùng Pivot để tổng hợp nó lại thành 1 bảng data và vlookup code từ bảng data đó.
 
Ý mình là khi nhìn bảng của bạn ấy đưa ra, có rất nhiều đợt nhập hàng từ các nhà sản xuất, thì sẽ có những lần nhập về sản phẩm cùng mã, nếu Find từng sản phẩm 1 thì khá lâu, thay vào đó ta dùng Pivot để tổng hợp nó lại thành 1 bảng data và vlookup code từ bảng data đó.

Bạn có biết thớt đang cần làm gì không?
 
Chào bạn HUONGHCKT,
Mình diễn giải thêm thông tin:
Dữ liệu mình đưa là các linh kiện SMD (linh kiện dán bề mặt)
Các linh kiện Điện trở, tụ điện thì sẽ được đóng gói theo dạng băng (mình hay gọi là Reel) các linh kiện này thường có kích thước hình chữ nhật nên sẽ có một loại đóng gói cho nó, các con số 0201, 0805, 1206, 2512,..nó là mô tả kích thước như hình dưới,

Thường thì hơn 95% linh kiện tụ điện (CAP) sẽ có mô tả chữ CAPACITOR hoặc CAP, nhưng như ví dụ này, .0022UF 50V SM1206 10% , không có để nên mình dựa vào đơn vị UF,( microfara) hoặc PF ( picofara) hoặc NF ( nanofara) để đặt cho nó cái tên đại điện để nhận dạng nó là "C"
các thông số 50V mình không lấy nó, 10% là sai số, SM1206 là đóng gói linh kiện,
Đơn vị của tụ, mình chỉ lấy UF, PF, NF, chứ V mình không có lấy.
Đơn vị của điện trở, mình chỉ lấy, K (kilo om), M, (mega om), R (om)
Tương tự cho Inductor, varistor, mình cũng có để trong diễn giải sheet "requirement"

Để rõ .0022UF 50V SM1206 10% thì sẽ có một mã MPN (manufacturing part number) từ nhà sản xuất, sẽ có datasheet chi tiết nói vè các con số này,
Mình đưa mã MPN cho bạn tham khảo thêm "C1206C222K5RACTU" https://www.mouser.vn/ProductDetail/KEMET/C1206C222K5RACTU?qs=8786zKh2EOwEPvtogAbwBg==

Như bạn befaint có diễn giải:

Đúng mong muốn,
Mình có làm mẫu thêm một số các ví dụ ở cột E, bạn tham khảo để biết thêm,
Cái sheet "Requirement-v1" nó giống như database để so sánh tìm kiếm dữ liệu giống để hỗ trợ cho sheet "data-v1"
mình sẽ tải dữ liệu về và sẽ có 4 cột thông tin (part number, description, location, qty.) kết quả mình mong muốn là nhận được ở cột E.
(sau khi làm xong bước này, mình còn một bước nữa đó là Vlookup thông tin Location (trong file tọa độ linh kiện, nhưng bước này, mình làm sau.)

Còn thông tin nào chưa rõ, Bạn chia sẻ thêm, mình bổ xung nha.
Cảm ơn.
Dữ liệu khá rối, code dựa vào các bảng tra, các giá trị phải xếp thứ tự theo số ký tự từ lớn tới nhỏ. Chạy sub main
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aCap(), aLK(), aDG(), res$(), sRow&, i&, j&
  With Sheets("Data-v1")
    sArr = .Range("B2", .Range("B999999").End(xlUp)).Value
  End With
  With Sheets("Requirement-v1")
    aCap = .Range("A4", .Range("B999999").End(xlUp)).Value
    aLK = .Range("C4", .Range("D999999").End(xlUp)).Value
    aDG = .Range("E3:I3").Resize(.Range("F3").CurrentRegion.Rows.Count).Value
  End With
  For j = 1 To UBound(aDG, 2)
    aDG(1, j) = "," & aDG(1, j) & ","
  Next j
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLK(aCap, aLK, aDG, sArr(i, 1))
    Next i
    Sheets("Data-v1").Range("F2").Resize(sRow) = res
End Sub

Private Function MaLK(aCap, aLK, aDG, ByVal str As String) As String
  Dim LK$, S, aUni, aUni2, tmp$, t$, N&, i&, j&, c&
 
  For i = 1 To UBound(aLK)
    If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
  Next i
 
  aUni = Array("*#UH", "*#NH", "*#MH", "*#OHM")
  aUni2 = Array("*#NF", "*#PF", "*#UF", "*#N")
  S = Split(str, " ")
  For c = 0 To UBound(S)
    For j = 0 To UBound(aUni)
      If S(c) Like aUni(j) Then
        LK = "IND"
        Exit For
      ElseIf S(c) Like aUni2(j) Then
        LK = "C"
        Exit For
      End If
    Next j
  Next c
  If LK = Empty Then
    For i = 1 To UBound(aLK)
      If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
    Next i
  End If
  If LK = Empty Then LK = "???"

  tmp = LK
  If LK = "C" Then
    For i = 1 To UBound(aCap)
      If InStr(1, str, aCap(i, 1)) Then tmp = aCap(i, 2) & tmp: Exit For
    Next i
  End If
 
  If LK = "IND" Then
    aUni = Array("UH", "NH", "MH", "OHM")
    For j = 0 To UBound(aUni)
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        For c = 0 To UBound(S)
          If InStr(1, S(c), aUni(j)) Then
            If S(c) = aUni(j) Then
              tmp = tmp & S(c - 1) & " " & S(c)
            Else
              tmp = tmp & S(c)
            End If
            tmp = Replace(tmp, "OHM", "R")
            Exit For
          End If
        Next c
        Exit For
      End If
    Next j
    If j > UBound(aUni) Then tmp = tmp & "???" '***
  ElseIf LK = "D" Then
    S = Split(str, " ")
    If InStr(1, S(UBound(S)), "(") = 0 Then tmp = tmp & S(UBound(S))
  ElseIf LK = "C" Then
    aUni = Array("*#NF", "*#PF", "*#UF", "*#N")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        End If
      Next j
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "R" Or LK = "FER" Or LK = "TMT" Then '***
    aUni = Array("*#K", "*#KOHM", "*#M", "*#MOHM", "*#OHM")
    aUni2 = Array("K", "KOHM", "M", "MOHM", "OHM")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        ElseIf S(c) = aUni2(j) Then
          tmp = tmp & S(c - 1) & " " & S(c)
          Exit For
        End If
      Next j
      tmp = Replace(Replace(Replace(tmp, "KOHM", "K"), "MOHM", "M"), "OHM", "R")
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "VAR" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#V" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "FUS" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#A" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "P" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#K" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  End If
  LK = "," & LK & ","
  For j = 1 To UBound(aDG, 2)
    If InStr(1, aDG(1, j), LK) Then
      For i = 2 To UBound(aDG)
        If InStr(1, str, aDG(i, j)) Then tmp = tmp & aDG(i, j): Exit For
      Next i
      If i <= UBound(aDG) Then Exit For
    End If
  Next j
  MaLK = tmp
End Function
 

File đính kèm

Dữ liệu khá rối, code dựa vào các bảng tra, các giá trị phải xếp thứ tự theo số ký tự từ lớn tới nhỏ. Chạy sub main
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aCap(), aLK(), aDG(), res$(), sRow&, i&, j&
  With Sheets("Data-v1")
    sArr = .Range("B2", .Range("B999999").End(xlUp)).Value
  End With
  With Sheets("Requirement-v1")
    aCap = .Range("A4", .Range("B999999").End(xlUp)).Value
    aLK = .Range("C4", .Range("D999999").End(xlUp)).Value
    aDG = .Range("E3:I3").Resize(.Range("F3").CurrentRegion.Rows.Count).Value
  End With
  For j = 1 To UBound(aDG, 2)
    aDG(1, j) = "," & aDG(1, j) & ","
  Next j
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLK(aCap, aLK, aDG, sArr(i, 1))
    Next i
    Sheets("Data-v1").Range("F2").Resize(sRow) = res
End Sub

Private Function MaLK(aCap, aLK, aDG, ByVal str As String) As String
  Dim LK$, S, aUni, aUni2, tmp$, t$, N&, i&, j&, c&
 
  For i = 1 To UBound(aLK)
    If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
  Next i
 
  aUni = Array("*#UH", "*#NH", "*#MH", "*#OHM")
  aUni2 = Array("*#NF", "*#PF", "*#UF", "*#N")
  S = Split(str, " ")
  For c = 0 To UBound(S)
    For j = 0 To UBound(aUni)
      If S(c) Like aUni(j) Then
        LK = "IND"
        Exit For
      ElseIf S(c) Like aUni2(j) Then
        LK = "C"
        Exit For
      End If
    Next j
  Next c
  If LK = Empty Then
    For i = 1 To UBound(aLK)
      If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
    Next i
  End If
  If LK = Empty Then LK = "???"

  tmp = LK
  If LK = "C" Then
    For i = 1 To UBound(aCap)
      If InStr(1, str, aCap(i, 1)) Then tmp = aCap(i, 2) & tmp: Exit For
    Next i
  End If
 
  If LK = "IND" Then
    aUni = Array("UH", "NH", "MH", "OHM")
    For j = 0 To UBound(aUni)
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        For c = 0 To UBound(S)
          If InStr(1, S(c), aUni(j)) Then
            If S(c) = aUni(j) Then
              tmp = tmp & S(c - 1) & " " & S(c)
            Else
              tmp = tmp & S(c)
            End If
            tmp = Replace(tmp, "OHM", "R")
            Exit For
          End If
        Next c
        Exit For
      End If
    Next j
    If j > UBound(aUni) Then tmp = tmp & "???" '***
  ElseIf LK = "D" Then
    S = Split(str, " ")
    If InStr(1, S(UBound(S)), "(") = 0 Then tmp = tmp & S(UBound(S))
  ElseIf LK = "C" Then
    aUni = Array("*#NF", "*#PF", "*#UF", "*#N")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        End If
      Next j
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "R" Or LK = "FER" Or LK = "TMT" Then '***
    aUni = Array("*#K", "*#KOHM", "*#M", "*#MOHM", "*#OHM")
    aUni2 = Array("K", "KOHM", "M", "MOHM", "OHM")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        ElseIf S(c) = aUni2(j) Then
          tmp = tmp & S(c - 1) & " " & S(c)
          Exit For
        End If
      Next j
      tmp = Replace(Replace(Replace(tmp, "KOHM", "K"), "MOHM", "M"), "OHM", "R")
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "VAR" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#V" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "FUS" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#A" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "P" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#K" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  End If
  LK = "," & LK & ","
  For j = 1 To UBound(aDG, 2)
    If InStr(1, aDG(1, j), LK) Then
      For i = 2 To UBound(aDG)
        If InStr(1, str, aDG(i, j)) Then tmp = tmp & aDG(i, j): Exit For
      Next i
      If i <= UBound(aDG) Then Exit For
    End If
  Next j
  MaLK = tmp
End Function[/CODE

[/QUOTE]

Em chào Anh HieuCD,
Anh cho em hỏi ba chỗ như hình được không ạ,
[ATTACH type="full"]273647[/ATTACH]
Chỗ này, mình có thể lấy IC như cột G được không Anh?
[ATTACH type="full"]273646[/ATTACH]
Đối với linh kiện Diode, dữ liệu bị trùng của phần đóng gói linh kiện,
[ATTACH type="full"]273648[/ATTACH]
Chỗ này, mình lấy là IC,
Tất cả tên đại diện,mình chỉ lấy phía ngoài cùng bên trái theo tên mình có để trong dữ liệu,
Nhờ Anh kiểm tra thêm cho em được không,
Cảm ơn Anh!.
 

File đính kèm

  • 1648360910811.png
    1648360910811.png
    229.8 KB · Đọc: 5
  • 1648360939780.png
    1648360939780.png
    135.9 KB · Đọc: 5
  • 1648360968478.png
    1648360968478.png
    215 KB · Đọc: 5
Kết quả có "???" là thiếu dữ liệu trong bảng tra, bổ xung thêm bảng tra, khi ổn xóa các dòng lệnh có ghi chú trong code
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aCap(), aLK(), aDG(), res$(), sRow&, i&, j&
  With Sheets("Data-v1")
    sArr = .Range("B2", .Range("B999999").End(xlUp)).Value
  End With
  With Sheets("Requirement-v1")
    aCap = .Range("A4", .Range("B999999").End(xlUp)).Value
    aLK = .Range("C4", .Range("D999999").End(xlUp)).Value
    aDG = .Range("E3:I3").Resize(.Range("F3").CurrentRegion.Rows.Count).Value
  End With
  For j = 1 To UBound(aDG, 2)
    aDG(1, j) = "," & aDG(1, j) & ","
  Next j
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLK(aCap, aLK, aDG, sArr(i, 1))
    Next i
    Sheets("Data-v1").Range("F2").Resize(sRow) = res
End Sub

Private Function MaLK(aCap, aLK, aDG, ByVal str As String) As String
  Dim LK$, S, aUni, aUni2, tmp$, t$, N&, i&, j&, c&
 
  S = Split(str, " ")
  tmp = S(0)
  For i = 1 To UBound(aLK)
    If InStr(1, tmp, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
  Next i
  If LK = Empty Then
    aUni = Array("*#UH", "*#NH", "*#MH", "*#OHM")
    aUni2 = Array("*#NF", "*#PF", "*#UF", "*#N")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          LK = "IND"
          Exit For
        ElseIf S(c) Like aUni2(j) Then
          LK = "C"
          Exit For
        End If
      Next j
    Next c
  End If
  If LK = Empty Then
    For i = 1 To UBound(aLK)
      If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
    Next i
  End If
  If LK = Empty Then LK = "???"

  tmp = LK
  If LK = "C" Then
    For i = 1 To UBound(aCap)
      If InStr(1, str, aCap(i, 1)) Then tmp = aCap(i, 2) & tmp: Exit For
    Next i
  End If
 
  If LK = "IND" Then
    aUni = Array("UH", "NH", "MH", "OHM")
    For j = 0 To UBound(aUni)
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        For c = 0 To UBound(S)
          If InStr(1, S(c), aUni(j)) Then
            If S(c) = aUni(j) Then
              tmp = tmp & S(c - 1) & " " & S(c)
            Else
              tmp = tmp & S(c)
            End If
            tmp = Replace(tmp, "OHM", "R")
            Exit For
          End If
        Next c
        Exit For
      End If
    Next j
    If j > UBound(aUni) Then tmp = tmp & "???" '***
  ElseIf LK = "D" Then
    'S = Split(str, " ")
    'If InStr(1, S(UBound(S)), "(") = 0 Then tmp = tmp & S(UBound(S))
  ElseIf LK = "C" Then
    aUni = Array("*#NF", "*#PF", "*#UF", "*#N#*", "*#N")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        End If
      Next j
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "R" Or LK = "FER" Or LK = "TMT" Then '***
    aUni = Array("*#K", "*#KOHM", "*#M", "*#MOHM", "*#OHM")
    aUni2 = Array("K", "KOHM", "M", "MOHM", "OHM")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        ElseIf S(c) = aUni2(j) Then
          tmp = tmp & S(c - 1) & " " & S(c)
          Exit For
        End If
      Next j
      tmp = Replace(Replace(Replace(tmp, "KOHM", "K"), "MOHM", "M"), "OHM", "R")
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "VAR" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#V" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "FUS" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#A" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "P" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#K" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  End If
  LK = "," & LK & ","
  For j = 1 To UBound(aDG, 2)
    If InStr(1, aDG(1, j), LK) Then
      For i = 2 To UBound(aDG)
        If aDG(i, j) <> Empty Then
          If InStr(1, str, aDG(i, j)) Then tmp = tmp & aDG(i, j): Exit For
        End If
      Next i
      If i <= UBound(aDG) Then Exit For
    End If
  Next j
  If j > UBound(aDG, 2) Then tmp = tmp & "???" '***
  MaLK = tmp
End Function
File đính kèm đã xếp thứ tự các bảng tra theo số ký tự
 

File đính kèm

Kết quả có "???" là thiếu dữ liệu trong bảng tra, bổ xung thêm bảng tra, khi ổn xóa các dòng lệnh có ghi chú trong code
Mã:
Option Explicit
Sub Main()
  Dim sArr(), aCap(), aLK(), aDG(), res$(), sRow&, i&, j&
  With Sheets("Data-v1")
    sArr = .Range("B2", .Range("B999999").End(xlUp)).Value
  End With
  With Sheets("Requirement-v1")
    aCap = .Range("A4", .Range("B999999").End(xlUp)).Value
    aLK = .Range("C4", .Range("D999999").End(xlUp)).Value
    aDG = .Range("E3:I3").Resize(.Range("F3").CurrentRegion.Rows.Count).Value
  End With
  For j = 1 To UBound(aDG, 2)
    aDG(1, j) = "," & aDG(1, j) & ","
  Next j
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLK(aCap, aLK, aDG, sArr(i, 1))
    Next i
    Sheets("Data-v1").Range("F2").Resize(sRow) = res
End Sub

Private Function MaLK(aCap, aLK, aDG, ByVal str As String) As String
  Dim LK$, S, aUni, aUni2, tmp$, t$, N&, i&, j&, c&
 
  S = Split(str, " ")
  tmp = S(0)
  For i = 1 To UBound(aLK)
    If InStr(1, tmp, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
  Next i
  If LK = Empty Then
    aUni = Array("*#UH", "*#NH", "*#MH", "*#OHM")
    aUni2 = Array("*#NF", "*#PF", "*#UF", "*#N")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          LK = "IND"
          Exit For
        ElseIf S(c) Like aUni2(j) Then
          LK = "C"
          Exit For
        End If
      Next j
    Next c
  End If
  If LK = Empty Then
    For i = 1 To UBound(aLK)
      If InStr(1, str, aLK(i, 1)) Then LK = aLK(i, 2): Exit For
    Next i
  End If
  If LK = Empty Then LK = "???"

  tmp = LK
  If LK = "C" Then
    For i = 1 To UBound(aCap)
      If InStr(1, str, aCap(i, 1)) Then tmp = aCap(i, 2) & tmp: Exit For
    Next i
  End If
 
  If LK = "IND" Then
    aUni = Array("UH", "NH", "MH", "OHM")
    For j = 0 To UBound(aUni)
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        For c = 0 To UBound(S)
          If InStr(1, S(c), aUni(j)) Then
            If S(c) = aUni(j) Then
              tmp = tmp & S(c - 1) & " " & S(c)
            Else
              tmp = tmp & S(c)
            End If
            tmp = Replace(tmp, "OHM", "R")
            Exit For
          End If
        Next c
        Exit For
      End If
    Next j
    If j > UBound(aUni) Then tmp = tmp & "???" '***
  ElseIf LK = "D" Then
    'S = Split(str, " ")
    'If InStr(1, S(UBound(S)), "(") = 0 Then tmp = tmp & S(UBound(S))
  ElseIf LK = "C" Then
    aUni = Array("*#NF", "*#PF", "*#UF", "*#N#*", "*#N")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        End If
      Next j
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "R" Or LK = "FER" Or LK = "TMT" Then '***
    aUni = Array("*#K", "*#KOHM", "*#M", "*#MOHM", "*#OHM")
    aUni2 = Array("K", "KOHM", "M", "MOHM", "OHM")
    S = Split(str, " ")
    For c = 0 To UBound(S)
      For j = 0 To UBound(aUni)
        If S(c) Like aUni(j) Then
          tmp = tmp & S(c)
          Exit For
        ElseIf S(c) = aUni2(j) Then
          tmp = tmp & S(c - 1) & " " & S(c)
          Exit For
        End If
      Next j
      tmp = Replace(Replace(Replace(tmp, "KOHM", "K"), "MOHM", "M"), "OHM", "R")
      If j <= UBound(aUni) Then Exit For
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "VAR" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#V" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "FUS" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#A" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  ElseIf LK = "P" Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
        If S(c) Like "*#K" Then
          tmp = tmp & S(c)
          Exit For
        End If
    Next c
    If c > UBound(S) Then tmp = tmp & "???" '***
  End If
  LK = "," & LK & ","
  For j = 1 To UBound(aDG, 2)
    If InStr(1, aDG(1, j), LK) Then
      For i = 2 To UBound(aDG)
        If aDG(i, j) <> Empty Then
          If InStr(1, str, aDG(i, j)) Then tmp = tmp & aDG(i, j): Exit For
        End If
      Next i
      If i <= UBound(aDG) Then Exit For
    End If
  Next j
  If j > UBound(aDG, 2) Then tmp = tmp & "???" '***
  MaLK = tmp
End Function
File đính kèm đã xếp thứ tự các bảng tra theo số ký tự
Em cảm ơn Anh HieuCD đã hỗ trợ em bài viết này ạ,
 
Em chào Anh HUONGHCKT,
Thật sự em cũng ngóng lắm, cũng muốn chia sẻ tất cả những gì mọi người đang thắc mắc để hỗ trợ bài này, cố gắng diễn giải và cũng đưa hết dữ liệu em có ra rồi, ngoài viết hàm bằng tay từng cái với tham khảo code VBA của mọi người hỗ trợ, em cũng còn biết giải pháp nào nữa đâu để trong mong, thiệt sự, dữ liệu có như thế nào, em cũng đã diễn giải hết ra rồi, và dữ liệu này, nó cũng không được đồng nhất hết ở phần mô tả là bởi vì, mỗi loại linh kiện được sản xuất bởi các nhà cung cấp khác nhau, rồi cái người thiết kế, phòng nghiên cứu và phát triển (R&D) có nhiều nơi, trên thế giới, họ đặt và ghi tên như vậy, nên dữ liệu mới có nhiều loại như vậy.
Em có để hàm vào nhưng cũng lấy loạn xạ lên hết, nếu mà không được, chắc em sẽ tạm chấp nhận và dùng như vậy, nhưng trong công việc, sẽ khó nhìn nhận hơn,
Em cũng cám ơn mọi người rất nhiều, đã hỗ trợ.
Kết quả sau 2 ngày chiến đấu với dữ liệu không đồng bộ. Vừa làm vừa đoán ý.
Xem file đính kèm. Hy vọng giải quyết được phần nào.
Phần bảng tra không nên di chuyển. Trong Kết quả trả về đang để dấu cách.
Hãy chạy thử và kiểm tra lai thật kỹ.
 

File đính kèm

Kết quả sau 2 ngày chiến đấu với dữ liệu không đồng bộ. Vừa làm vừa đoán ý.
Xem file đính kèm. Hy vọng giải quyết được phần nào.
Phần bảng tra không nên di chuyển. Trong Kết quả trả về đang để dấu cách.
Hãy chạy thử và kiểm tra lai thật kỹ.
Thật sự, kể từ lúc em tham gia diễn đàn giải pháp excel từ 2015 tới giờ, những bài viết em có đăng lên nhờ mọi người trợ giúp, ai cũng nhiệt tình chia sẻ, nhiều lúc còn bất ngờ vì những gì mình thấy lâu nay ở các trang và diễn đàn khác trả lời và hỗ trợ, ở Giaiphapexcel thì khác, rất là sảng khoái chia sẽ hỗ trợ, nếu em dùng từ, sợ phạm luật đó là từ fair, nhưng rất fair.
Rất cám ơn các Anh,.
"Kết quả sau 2 ngày chiến đấu..." Em thực sự cảm ơn Anh HUONGHCKT rất là nhiều với thời gian và suy nghĩ đã bỏ ra và hỗ trợ em.
Chân thành cám ơn Anh Hương.
Chân thành cám ơn Anh HieuCD.
 
Web KT

Bài viết mới nhất

Back
Top Bottom