Lọc thông tin của linh kiện điện tử (1 người xem)

  • Thread starter Thread starter th7
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

th7

Thành viên thường trực
Tham gia
3/3/15
Bài viết
215
Được thích
52
Giới tính
Nam
Chào các Bạn,
Mình cần lấy các thông tin của linh kiện theo một số quy tắc cho từng loại linh kiện trong một chuỗi mô tả của linh kiện đó.
Do dữ liệu rất là nhiều và có tính chất lặp lại nên mình lấy các chuỗi đại diện như trong tập tin đính kèm,
Nhờ các Bạn hỗ trợ mình công thức để xử lý dữ liệu đó.
1648097517450.png
Cảm ơn!
 

File đính kèm

Chào các Bạn,
Mình cần lấy các thông tin của linh kiện theo một số quy tắc cho từng loại linh kiện trong một chuỗi mô tả của linh kiện đó.
Do dữ liệu rất là nhiều và có tính chất lặp lại nên mình lấy các chuỗi đại diện như trong tập tin đính kèm,
Nhờ các Bạn hỗ trợ mình công thức để xử lý dữ liệu đó.
Cảm ơn!
Làm bằng VBA được không?
 
  • Yêu thích
Reactions: th7
Chào các Bạn,
Mình cần lấy các thông tin của linh kiện theo một số quy tắc cho từng loại linh kiện trong một chuỗi mô tả của linh kiện đó.
Do dữ liệu rất là nhiều và có tính chất lặp lại nên mình lấy các chuỗi đại diện như trong tập tin đính kèm,
Nhờ các Bạn hỗ trợ mình công thức để xử lý dữ liệu đó.
View attachment 273512
Cảm ơn!
Công thức hơi dài, nhưng hy vọng là giúp được bác.
 

File đính kèm

Công thức hơi dài, nhưng hy vọng là giúp được bác.
Chào Bạn htin1997,
Cột C là mình đã tự lấy ra bằng tay nên khi mình "&" với cột C thì vẫn chưa giải quyết được vấn đề bạn ơi, mình cũng có làm nhưng mà đang bị rối,
Bạn HUONGHCKT có gợi ý làm bằng VBA, nên để mình gửi tập tin chi tiết hơn nữa và một số các bước nếu kết hợp bằng VBA có thể giải quyết được vấn đề nhanh hơn.
Cảm ơn Bạn.
 

File đính kèm

Hình như đơn vị chưa đủ dữ kiện bác ơi, những dòng dưới dùng có ngoại lệ.
Cho dù có dùng công thức hay vba thì bài này bắt buộc phải đủ điều kiện mới thực hiện được, chứ ví dụ không hết sau này cứ đi sửa là nhọc phết đấy.
 
@Thớt:
Bạn cần ghi rõ là:
- Dữ liệu ban đầu chỉ có duy nhất cột A mà thôi.
- Kết quả mong muốn là cột D.

Cột B, C chỉ là diễn giải trung gian để hiểu cách thức lấy kết quả, không hề có trong dữ liệu ban đầu.

Xem mấy bài trên là biết họ không rành về linh kiện điện tử, tưởng cột B, C có rồi.
 
Nhìn công thức bài #6 ngán hơn ăn cơm nếp nhão. Dành thời gian viết cái UDF, nhét tất cả điều kiện vào trong nó.

Chỉ cần nhập: = TenLinhKien(A2) là có kết quả.

.
 

Tên linh kiện là ở cột A rồi.

Ví dụ: RESISTOR 63.4K OHM 1% 0805 SMD
Nghĩa là: Linh kiện điện trở có giá trị trở kháng là 63.4 ngàn Ohm, sai số trở kháng 1%, kích thước dài x rộng = 0.08 inches x 0.05 inches, loại linh kiện dán (dán lên mặt tấm PCB).

Cái ở cột E có thể gọi là Kí hiệu, tên rút gọn gì đó.
 
Chào các Bạn,
Mình cần lấy các thông tin của linh kiện theo một số quy tắc cho từng loại linh kiện trong một chuỗi mô tả của linh kiện đó.
Do dữ liệu rất là nhiều và có tính chất lặp lại nên mình lấy các chuỗi đại diện như trong tập tin đính kèm,
Nhờ các Bạn hỗ trợ mình công thức để xử lý dữ liệu đó.
View attachment 273512
Cảm ơn!
Dùng hàm tự tạo
Mã:
Function MaLinhKien(ByVal str As String) As String
  Dim S, aUni, tmp$, N&, j&, c&
  If InStr(1, str, "INDUCTOR") Then
    aUni = Array("UH", "MH")
    For j = 0 To 1
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        MaLinhKien = "IND " & S(UBound(S))
        Exit Function
      End If
    Next j
  ElseIf InStr(1, str, "DIODE") Then
    S = Split(str, " ")
    MaLinhKien = "D " & S(UBound(S))
    Exit Function
  ElseIf InStr(1, str, "RES") Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
      tmp = Right(S(c), 1)
      If tmp = "K" Or tmp = "M" Then
        If IsNumeric(Mid(S(c), Len(S(c)) - 1, 1)) Then
          MaLinhKien = "R " & S(c)
          Exit Function
        End If
      ElseIf c < UBound(S) Then
        If S(c + 1) = "OHM" Then
          MaLinhKien = "R " & S(c) & "R" '*****
          Exit Function
        End If
      End If
    Next c
  ElseIf InStr(1, str, "SOT") Or InStr(1, str, "TRANS") Then
    S = Split(str, " ")
    MaLinhKien = "T " & S(UBound(S))
    Exit Function
  ElseIf InStr(1, str, "VARISTOR") Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
      If Right(S(c), 1) = "V" Then
        If IsNumeric(Mid(S(c), Len(S(c)) - 1, 1)) Then
          MaLinhKien = "VAR " & S(c)
          Exit Function
        End If
      End If
    Next c
  Else
    aUni = Array("UF", "PF", "NF")
    str = "Z " & str
    For j = 0 To 2
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        tmp = S(UBound(S))
        For c = UBound(S) - 1 To 0 Step -1
          If IsNumeric(S(c)) Or S(c) = "-" Then tmp = S(c) & " " & tmp Else Exit For
        Next
        MaLinhKien = "C " & tmp
        Exit Function
      End If
    Next j
  End If
End Function
Có thể nhập công thức trực tiếp trên sheet hoặc chạy sub Main lấy giá trị kết quả
Mã:
Sub Main()
  Dim sArr(), res$(), sRow&, i&
  With Sheets("Sheet6")
    sArr = .Range("A2", .Range("A999999").End(xlUp)).Value
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLinhKien(sArr(i, 1))
    Next i
    .Range("C2").Resize(sRow) = res
  End With
End Sub
 

File đính kèm

GPE vừa là nơi tìm ra giải pháp, vừa là nơi hoạt động của các nhà thám tử. ;)
 
Làm bằng VBA được không?
Chào Bạn HUONGHCKT,
Từ hôm bạn nói có sử dụng VBA được không, mình đã lấy hết dữ liệu lại và mô tả lại cách lấy dữ liệu để phù hợp hơn với công việc,
Mình vừa thấy bài của Bạn đăng dựa theo mong muốn của bài #1, mình sẽ xem bài của Bạn để chỉnh sửa thêm.
Các Bạn khác có hỏi nêu cụ thể hơn nên mình có mô tả chi tiết hơn, mình lỡ đưa ra rồi, nên mình vẫn gửi lên nha, mình để chi tiết trong tập tin đính kèm.
(Mình chia sẻ thêm là mình đang làm chương trình cho máy gắn linh kiện, mình cần tạo một Database của linh kiện, dựa theo tên part và tên mô tả, việc mình trích xuất các thông tin cần lấy kết hợp với part linh kiện quan trọng và sẽ cố định cái tên này để làm Database)
Cảm ơn.
 

File đính kèm

Dùng hàm tự tạo
Mã:
Function MaLinhKien(ByVal str As String) As String
  Dim S, aUni, tmp$, N&, j&, c&
  If InStr(1, str, "INDUCTOR") Then
    aUni = Array("UH", "MH")
    For j = 0 To 1
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        MaLinhKien = "IND " & S(UBound(S))
        Exit Function
      End If
    Next j
  ElseIf InStr(1, str, "DIODE") Then
    S = Split(str, " ")
    MaLinhKien = "D " & S(UBound(S))
    Exit Function
  ElseIf InStr(1, str, "RES") Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
      tmp = Right(S(c), 1)
      If tmp = "K" Or tmp = "M" Then
        If IsNumeric(Mid(S(c), Len(S(c)) - 1, 1)) Then
          MaLinhKien = "R " & S(c)
          Exit Function
        End If
      ElseIf c < UBound(S) Then
        If S(c + 1) = "OHM" Then
          MaLinhKien = "R " & S(c) & "R" '*****
          Exit Function
        End If
      End If
    Next c
  ElseIf InStr(1, str, "SOT") Or InStr(1, str, "TRANS") Then
    S = Split(str, " ")
    MaLinhKien = "T " & S(UBound(S))
    Exit Function
  ElseIf InStr(1, str, "VARISTOR") Then
    S = Split(str, " ")
    For c = 0 To UBound(S)
      If Right(S(c), 1) = "V" Then
        If IsNumeric(Mid(S(c), Len(S(c)) - 1, 1)) Then
          MaLinhKien = "VAR " & S(c)
          Exit Function
        End If
      End If
    Next c
  Else
    aUni = Array("UF", "PF", "NF")
    str = "Z " & str
    For j = 0 To 2
      N = InStr(1, str, aUni(j))
      If N > 0 Then
        S = Split(Mid(str, 1, N + 1), " ")
        tmp = S(UBound(S))
        For c = UBound(S) - 1 To 0 Step -1
          If IsNumeric(S(c)) Or S(c) = "-" Then tmp = S(c) & " " & tmp Else Exit For
        Next
        MaLinhKien = "C " & tmp
        Exit Function
      End If
    Next j
  End If
End Function
Có thể nhập công thức trực tiếp trên sheet hoặc chạy sub Main lấy giá trị kết quả
Mã:
Sub Main()
  Dim sArr(), res$(), sRow&, i&
  With Sheets("Sheet6")
    sArr = .Range("A2", .Range("A999999").End(xlUp)).Value
    sRow = UBound(sArr)
    ReDim res(1 To sRow, 1 To 1)
    For i = 1 To sRow
      res(i, 1) = MaLinhKien(sArr(i, 1))
    Next i
    .Range("C2").Resize(sRow) = res
  End With
End Sub
Em chào Anh HieuCD,
Em cảm ơn CODE của Anh nha, kết quả như mong đợi của bài #1 ạ.
 
Chào Bạn HUONGHCKT,
Từ hôm bạn nói có sử dụng VBA được không, mình đã lấy hết dữ liệu lại và mô tả lại cách lấy dữ liệu để phù hợp hơn với công việc,
Mình vừa thấy bài của Bạn đăng dựa theo mong muốn của bài #1, mình sẽ xem bài của Bạn để chỉnh sửa thêm.
Các Bạn khác có hỏi nêu cụ thể hơn nên mình có mô tả chi tiết hơn, mình lỡ đưa ra rồi, nên mình vẫn gửi lên nha, mình để chi tiết trong tập tin đính kèm.
(Mình chia sẻ thêm là mình đang làm chương trình cho máy gắn linh kiện, mình cần tạo một Database của linh kiện, dựa theo tên part và tên mô tả, việc mình trích xuất các thông tin cần lấy kết hợp với part linh kiện quan trọng và sẽ cố định cái tên này để làm Database)
Cảm ơn.
Ai có hiểu được bạn đó muốn gì thì thông não cho tôi với, chứ thực sự là tôi căng não ra để hiểu bạn muốn gì mà vẫn không thể biết được?
Bạn phải mô tả kỹ đóng gói linh kiện thì lấy dữ liệu của Dòng nào cột nào? tiêu chí nào để lấy? lấy những gì? ... lấy được kết quả rồi thì để vào đâu? Làm thủ công vài chục trường hợp tiêu biểu? Làm chương trình cho máy gắn linh kiện mà mô tả thì tù mù thế này thì code sao nổi===> máy sao hiểu được để chạy đúng.
Từ chỗ rõ ràng, dành mạch như vậy thì có thể sẽ có nhiều người họ biết họ code cho bạn, hoặc họ có thể sửa code khi có code sai hướng.
 
  • Yêu thích
Reactions: th7
Ai có hiểu được bạn đó muốn gì

Dễ hiểu vậy mà bác.
----
Từ thông tin mô tả chi tiết của linh kiện (bên sheet Data)
tạo thành mã rút gọn, với cấu trúc
[ Nhận dạng phụ cho linh kiện Capacitor ]+ Tên kí tự đại diện linh kiện + [Giá trị của linh kiện (chỉ áp dụng cho Resistor và Capacitor, Inductor, Varistor)] + Đóng gói linh kiện.

Tức là:
* Nhận dạng phụ cho linh kiện Capacitor: The mô tả cột A:B
* Tên kí tự đại diện linh kiện: Theo mô tả cột C: D
* Giá trị của linh kiện: Theo mô tả ở file bài #1 (ở cột C và cột F)
* Đóng gói linh kiện: Theo mô tả cột E:H
+ Tất cả căn cứ vào thông tin mô tả chi tiết của linh kiện đã cho.
+ Ngoặc vuông [ ] không bắt buộc phải có.

------
@Thớt: Kiểm tra lại mấy chỗ có phải nhầm nhọt gì không?

1/ Màu vàng

1648201314288.png

2/ Inductor -> IND, vậy sao ví dụ lại là IN?

1648201374123.png
 
Dễ hiểu vậy mà bác.
----
Từ thông tin mô tả chi tiết của linh kiện (bên sheet Data)
tạo thành mã rút gọn, với cấu trúc
[ Nhận dạng phụ cho linh kiện Capacitor ]+ Tên kí tự đại diện linh kiện + [Giá trị của linh kiện (chỉ áp dụng cho Resistor và Capacitor, Inductor, Varistor)] + Đóng gói linh kiện.
Cảm ơn anh đã xem bài.
Như tôi đã trình bày là : Tôi muốn bạn ấy( chủ thớt) phân tích rõ cái kết quả mong muốn ấy có được từ đâu? Ví dụ: mã IC16MSOP được cấu thành từ đâu ở Sheet DATA, cách thức tìm ra nó để lấy? Lấy được rồi thì ghi lại các kết quả ấy vào đâu?
Như bài #1 thì .0022UF 50V SM1206 10% sẽ được mổ xẻ là
.0022UF=C
50V=??
SM=??
1260=thấy có trong E7 nghĩa là gì?
10% =là trị số gì?
 
Dễ hiểu vậy mà bác.
----
Từ thông tin mô tả chi tiết của linh kiện (bên sheet Data)
tạo thành mã rút gọn, với cấu trúc
[ Nhận dạng phụ cho linh kiện Capacitor ]+ Tên kí tự đại diện linh kiện + [Giá trị của linh kiện (chỉ áp dụng cho Resistor và Capacitor, Inductor, Varistor)] + Đóng gói linh kiện.

Tức là:
* Nhận dạng phụ cho linh kiện Capacitor: The mô tả cột A:B
* Tên kí tự đại diện linh kiện: Theo mô tả cột C: D
* Giá trị của linh kiện: Theo mô tả ở file bài #1 (ở cột C và cột F)
* Đóng gói linh kiện: Theo mô tả cột E:H
+ Tất cả căn cứ vào thông tin mô tả chi tiết của linh kiện đã cho.
+ Ngoặc vuông [ ] không bắt buộc phải có.

------
@Thớt: Kiểm tra lại mấy chỗ có phải nhầm nhọt gì không?

1/ Màu vàng

View attachment 273562

2/ Inductor -> IND, vậy sao ví dụ lại là IN?

View attachment 273563
Chào Bạn befaint,
Màu vàng mình quy định nó là ALU luôn Bạn, còn chỗ IND là mình ghi thiếu chữ D.
Các diễn giải của ban hoàn toàn đúng rồi Bạn ah.
Cảm ơn Bạn.
 
Cảm ơn anh đã xem bài.
Như tôi đã trình bày là : Tôi muốn bạn ấy( chủ thớt) phân tích rõ cái kết quả mong muốn ấy có được từ đâu? Ví dụ: mã IC16MSOP được cấu thành từ đâu ở Sheet DATA, cách thức tìm ra nó để lấy? Lấy được rồi thì ghi lại các kết quả ấy vào đâu?
Như bài #1 thì .0022UF 50V SM1206 10% sẽ được mổ xẻ là
.0022UF=C
50V=??
SM=??
1260=thấy có trong E7 nghĩa là gì?
10% =là trị số gì?
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,
1648284151511.png
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:
1648284684071.png
Đú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.)
1648287435772.png

Còn thông tin nào chưa rõ, Bạn chia sẻ thêm, mình bổ xung nha.
Cảm ơn.
 

File đính kèm

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.
 

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

Back
Top Bottom