Hỗ trợ hàm UDF tách dữ liệu và xóa trùng

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Tình nghĩa giang hồ

Thanh sơn bất cải, lục thủy trường lưu
Tham gia
29/9/20
Bài viết
330
Được thích
429
Chào anh chị em có trường hợp này nhờ anh chị hỗ trợ giúp
Dữ liệu của em là cột C, kết quả mong muốn của em là cột B
Đầu tiên em xin giải thích:
1000 là công ty 1, 1001 là chi nhánh 1 của công ty 1, 1002 là chi nhánh 2 của công ty .....
2000 là công ty 2, 2001 là chi nhánh 1 của công ty 2, 2002 là chi nhánh 2 của công ty 2.....
3000 là công ty 3, 3001 là chi nhánh 1 của công ty 3, 3002 là chi nhánh 3 của công ty 3
4000 là công ty 4, nơi đây không có chi nhánh, nếu có thì 4001 là chi nhánh 1 của công ty 4

Vấn đề của em muốn tách lấy dữ liệu của công ty và chi nhánh như hình.
VD:
Z1000_SD_CHUNG_REPORTS Z1000_SD_REPORTS_NO_PRICE_1000 Z4000_SD_CHUNG_REPORTS Z4000_SD_REPORTS_NO_PRICE_4000
Ở dòng trên thì có nhiều chữ 1000 và nhiều chữ 4000. Nhưng kết quả em cần là 1000 4000 thôi

Z1000_SD_CHUNG_REPORTS Z1000_SD_REPORTS_NO_PRICE_1000 Z1000_SD_REPORTS_NO_PRICE_1001 Z4000_SD_CHUNG_REPORTS Z4000_SD_REPORTS_NO_PRICE_4000
Ở dòng này thì cũng vậy. Kết quả em cần là: 1000 1001 4000

Bài này dạng là lấy dữ liệu số và xóa trùng.
Em nghĩ bài này làm bằng Sub thì dễ hơn, nhưng dùng hàm UDF thì thuận tiện cho công việc của em hơn.
Nhờ anh chị hỗ trợ giúp em trường hợp này.
Em cảm ơn anh chị.
 

File đính kèm

  • Tách dữ liệu công ty chi nhánh.xlsx
    10.6 KB · Đọc: 18
  • Tách dữ liệu.PNG
    Tách dữ liệu.PNG
    289.3 KB · Đọc: 18
dùng hàm UDF thì thuận tiện cho công việc của em hơn.
Thử code này:

Mã:
Public Function Extract_ID(s As String) As String
Dim i As Long, tmp As String, v As Variant
For i = 1 To Len(s)
    If Mid(s, i, 1) Like "#" = False Then Mid(s, i, 1) = " "
Next
    For Each v In Split(Application.Trim(s), " ")
        If Len(v) = 4 Then
            If InStr(1, tmp, v) = 0 Then tmp = tmp & ", " & v
        End If
    Next v
    If Len(tmp) > 0 Then Extract_ID = VBA.Mid(tmp, 3)
End Function
 
Upvote 0
Thử code này:

Mã:
Public Function Extract_ID(s As String) As String
Dim i As Long, tmp As String, v As Variant
For i = 1 To Len(s)
    If Mid(s, i, 1) Like "#" = False Then Mid(s, i, 1) = " "
Next
    For Each v In Split(Application.Trim(s), " ")
        If Len(v) = 4 Then
            If InStr(1, tmp, v) = 0 Then tmp = tmp & ", " & v
        End If
    Next v
    If Len(tmp) > 0 Then Extract_ID = VBA.Mid(tmp, 3)
End Function
Dạ em cảm ơn anh nhiều.
 
Upvote 0
Chào anh chị em có trường hợp này nhờ anh chị hỗ trợ giúp
Dữ liệu của em là cột C, kết quả mong muốn của em là cột B
Đầu tiên em xin giải thích:
1000 là công ty 1, 1001 là chi nhánh 1 của công ty 1, 1002 là chi nhánh 2 của công ty .....
2000 là công ty 2, 2001 là chi nhánh 1 của công ty 2, 2002 là chi nhánh 2 của công ty 2.....
3000 là công ty 3, 3001 là chi nhánh 1 của công ty 3, 3002 là chi nhánh 3 của công ty 3
4000 là công ty 4, nơi đây không có chi nhánh, nếu có thì 4001 là chi nhánh 1 của công ty 4

Vấn đề của em muốn tách lấy dữ liệu của công ty và chi nhánh như hình.
VD:
Z1000_SD_CHUNG_REPORTS Z1000_SD_REPORTS_NO_PRICE_1000 Z4000_SD_CHUNG_REPORTS Z4000_SD_REPORTS_NO_PRICE_4000
Ở dòng trên thì có nhiều chữ 1000 và nhiều chữ 4000. Nhưng kết quả em cần là 1000 4000 thôi

Z1000_SD_CHUNG_REPORTS Z1000_SD_REPORTS_NO_PRICE_1000 Z1000_SD_REPORTS_NO_PRICE_1001 Z4000_SD_CHUNG_REPORTS Z4000_SD_REPORTS_NO_PRICE_4000
Ở dòng này thì cũng vậy. Kết quả em cần là: 1000 1001 4000

Bài này dạng là lấy dữ liệu số và xóa trùng.
Em nghĩ bài này làm bằng Sub thì dễ hơn, nhưng dùng hàm UDF thì thuận tiện cho công việc của em hơn.
Nhờ anh chị hỗ trợ giúp em trường hợp này.
Em cảm ơn anh chị.
Các mã số chỉ có 4 ký tự
Mã:
Function Four_Num(s As String) As String
  Dim i As Long, tmp As String, t As String
 
  For i = 1 To Len(s) - 3
    t = Mid(s, i, 4)
    If t Like "####" Then
      If InStr(1, tmp, t) = 0 Then tmp = tmp & ", " & t
    End If
  Next
  If Len(tmp) > 0 Then Four_Num = VBA.Mid(tmp, 3)
End Function
 
Upvote 0
Microsoft Bing đã hỗ trợ mình, như sau:
PHP:
Function ExtractNumbers(ByVal str As String) As String
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\d{4}"
    regex.Global = True
    ExtractNumbers = Join(Application.Transpose(regex.Execute(str)), "; ")
End Function

:D :D :D & rất cảm ơn M. Bing!
 
Upvote 0
Em cảm ơn anh HieuCD và bác Sa.
Mà anh Hiếu CD ở nước ngoài múi giờ khác, còn bác Sa ở Việt Nam, mà 4:31 đã dậy sớm thế rồi.
Có phải bác ở phong trào, dậy sớm để thành công không bác SA.
Em thấy giờ phong trào Dậy sớm để thành công, hay làm chủ bình minh sống đời xuất chúng..... đang nổi lên rất nhiều.
 
Upvote 0
Dậy sớm
PHP:
 /)ậy sớm vì nào ngủ được đâu;
Lình bình bọng đái giống loài trâu;
 Hai canh phải đến buồng tu - lét
Thức giấc canh tư thức nổi sầu!


:D :D :D
 
Upvote 0
Tách thử bằng M Code...
=Text.Combine(List.Distinct(Splitter.SplitTextByRepeatedLengths( 4 )(Text.Select([Quyền],{"0".."9"})))," ")
 

File đính kèm

  • Tách dữ liệu công ty chi nhánh2222.xlsx
    25.8 KB · Đọc: 6
Upvote 0
Web KT

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

Back
Top Bottom