Tách chuỗi dữ liệu lấy tên nhà cung cấp

Liên hệ QC

huonglien1901

GPE là ngôi nhà thứ 2 của tôi!!!
Tham gia
17/4/16
Bài viết
2,701
Được thích
2,434
Giới tính
Nam
Nghề nghiệp
Nhân viên kỹ thuật in ấn
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em muốn tách chuỗi lấy tên Nhà cung cấp.

Em cảm ơn mọi người nhiều!
 

File đính kèm

Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em muốn tách chuỗi lấy tên Nhà cung cấp.

Em cảm ơn mọi người nhiều!
Muốn tách ít ra phải có một quy luật nào chứ kiểu này kêu tôi mò và lựa bằng mắt bình thường cũng không biết đâu mà tách.
 
Muốn tách ít ra phải có một quy luật nào chứ kiểu này kêu tôi mò và lựa bằng mắt bình thường cũng không biết đâu mà tách.
Quy luật tách là:
TH1: ở sau tên sản phẩm đó là tên nhà cung cấp đó Anh.
Th2: Tên nhà cung cấp nằm giữa tên sản phẩm và dung tich của nó.
 

File đính kèm

Nhà cung cấp ở sau dung tích thì sẽ tìm đc. ở giữa sẽ k đc
 
Quy luật tách là:
TH1: ở sau tên sản phẩm đó là tên nhà cung cấp đó Anh.
Th2: Tên nhà cung cấp nằm giữa tên sản phẩm và dung tich của nó.
Làm sao biết được tên sản phẩm đến đâu sẽ hết mà lấy. Còn nếu tên nhà cung cấp ở giữa làm sao biết tên có mấy từ mà tách. Nói chung khó hình dung và biết được tên như thế nào, hoặc ít nhất cũng phải có danh sách như #4.
 
Làm sao biết được tên sản phẩm đến đâu sẽ hết mà lấy. Còn nếu tên nhà cung cấp ở giữa làm sao biết tên có mấy từ mà tách. Nói chung khó hình dung và biết được tên như thế nào, hoặc ít nhất cũng phải có danh sách như #4.
tên sản phẩm bắt đầu sau dòng Tillcode(dòng này gồm có 12, 13 số )
Tên sản phẩm sẽ kéo dài chỗ dung tích của sản phẩm,
Tillcode/tên sản phẩm(có dung tich sản phẩm)/tên nhà cung cấp.
Nhờ Anh hỗ trợ giúp em.
 

File đính kèm

tên sản phẩm bắt đầu sau dòng Tillcode(dòng này gồm có 12, 13 số )
Tên sản phẩm sẽ kéo dài chỗ dung tích của sản phẩm,
Tillcode/tên sản phẩm(có dung tich sản phẩm)/tên nhà cung cấp.
Nhờ Anh hỗ trợ giúp em.
Thật tình tôi chưa tìm ra được quy luật để viết hàm hay code, mà #4 đã đáp ứng được yêu cầu của bạn chưa? Nếu chưa thì đợi thành viên khác hiểu mà giúp cho bạn nhé.
 
Thật tình tôi chưa tìm ra được quy luật để viết hàm hay code, mà #4 đã đáp ứng được yêu cầu của bạn chưa? Nếu chưa thì đợi thành viên khác hiểu mà giúp cho bạn nhé.
Hình như là vầy thì phải
B1=LOOKUP(2,1/(SEARCH($F$2:$F$18,A1)>=1),$F$2:$F$18) :)
Bài đã được tự động gộp:


Trả lời xong xem lại thấy hơi giống giống bài #4, kakaka
Cái này hơi khó, quy luật code/tên sản phẩm(có dung tich sản phẩm)/tên nhà cung cấp thấy có chỗ đúng chỗ không
Thôi thì lấy tên nhà cung cấp ra ngoài rồi chạy hàm. Nhưng có thể nó hơi ngược xíu nếu chủ bài cũng chưa có danh sách nhà cung cấp luôn, phải lập danh sách thủ công trước
 

File đính kèm

Lần chỉnh sửa cuối:
tên sản phẩm bắt đầu sau dòng Tillcode(dòng này gồm có 12, 13 số )
Tên sản phẩm sẽ kéo dài chỗ dung tích của sản phẩm,
Tillcode/tên sản phẩm(có dung tich sản phẩm)/tên nhà cung cấp.
Nhờ Anh hỗ trợ giúp em.
Giải thích sao vòng vo tam quốc quá đi, anh chừa thêm 2 dòng để còn sử dụng cho nội dung và tiêu đề (có khi cần đến).
Nhấn nút và xem kết quả, nếu áp dữ liệu thật thì sẽ có một số chỗ sai do dữ liệu ít quá nên không lường trước được những cái phát sinh như những chỗ này (ML, G, 1L, 2L...v..v....), nếu khác đi thì không nhận được kết quả mong muốn.
 

File đính kèm

Lần chỉnh sửa cuối:
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em muốn tách chuỗi lấy tên Nhà cung cấp.

Em cảm ơn mọi người nhiều!
Có thể còn sót một số dòng
Mã:
Sub Tach_NB()
  Dim sArr(), Res(), S As Variant, dArr As Variant, Dic As Object
  Dim i As Long, j As Long, sR As Long, n As Long
  Dim tmp As String
  sArr = Range("A1", Range("A65500").End(xlUp)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(sArr)
    S = Split(Application.Trim(sArr(i, 1)), " ")
    sR = UBound(S)
    For j = 1 To sR
      If isNum(S(j)) And j < sR Then
        tmp = ""
        For n = j + 1 To sR
          If Not isNum(S(n)) Then tmp = tmp & " " & S(n) Else Exit For
        Next n
        If Len(tmp) Then
          tmp = Mid(tmp, 2, Len(tmp) - 1)
          If Not Dic.exists(tmp) Then Dic.Add (tmp), ""
          Res(i, 1) = tmp
        End If
        Exit For
      End If
    Next j
  Next i
  dArr = Dic.keys
  For i = 1 To UBound(sArr)
    If Res(i, 1) = "" Then
      tmp = Application.Trim(sArr(i, 1))
      For j = 0 To UBound(dArr)
        If InStr(tmp, dArr(j)) Then Res(i, 1) = dArr(j): Exit For
      Next j
    End If
  Next i
  Range("B1").Resize(UBound(sArr)) = Res
End Sub
Private Function isNum(ByVal tmp As String) As Boolean
  Dim i As Byte
  Const So = "(0123456789"
  For i = 1 To Len(tmp)
    If InStr(So, Mid(tmp, i, 1)) Then isNum = True: Exit Function
  Next i
End Function
 

File đính kèm

Có thể còn sót một số dòng
Mã:
Sub Tach_NB()
  Dim sArr(), Res(), S As Variant, dArr As Variant, Dic As Object
  Dim i As Long, j As Long, sR As Long, n As Long
  Dim tmp As String
  sArr = Range("A1", Range("A65500").End(xlUp)).Value
  ReDim Res(1 To UBound(sArr), 1 To 1)
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To UBound(sArr)
    S = Split(Application.Trim(sArr(i, 1)), " ")
    sR = UBound(S)
    For j = 1 To sR
      If isNum(S(j)) And j < sR Then
        tmp = ""
        For n = j + 1 To sR
          If Not isNum(S(n)) Then tmp = tmp & " " & S(n) Else Exit For
        Next n
        If Len(tmp) Then
          tmp = Mid(tmp, 2, Len(tmp) - 1)
          If Not Dic.exists(tmp) Then Dic.Add (tmp), ""
          Res(i, 1) = tmp
        End If
        Exit For
      End If
    Next j
  Next i
  dArr = Dic.keys
  For i = 1 To UBound(sArr)
    If Res(i, 1) = "" Then
      tmp = Application.Trim(sArr(i, 1))
      For j = 0 To UBound(dArr)
        If InStr(tmp, dArr(j)) Then Res(i, 1) = dArr(j): Exit For
      Next j
    End If
  Next i
  Range("B1").Resize(UBound(sArr)) = Res
End Sub
Private Function isNum(ByVal tmp As String) As Boolean
  Dim i As Byte
  Const So = "(0123456789"
  For i = 1 To Len(tmp)
    If InStr(So, Mid(tmp, i, 1)) Then isNum = True: Exit Function
  Next i
End Function
Ái dà, phức tạp ghê, bác HieuCD ơi!
 
Do dữ liệu lung tung, code phải nhảy tưng tưng theo :p
Nếu có danh sách nhà cung cấp thì dùng công thức hay code đều dể :)
Nếu có danh mục nhà cung cấp thì tra cũng không dễ dàng gì đâu. Chủ yêu là do lúc nhập liệu không chuẩn: Lúc có dấu chấm, lúc có dấu phẩy, lúc thì liền, lúc có 1 khoảng trắng, lúc có 2 khoảng trắng.
 
Chào mọi người!

Em có vấn đề nhờ mọi người hỗ trợ.

Em muốn tách chuỗi lấy tên Nhà cung cấp.

Em cảm ơn mọi người nhiều!
Góp thêm cách dùng code:
PHP:
Function tach(rng As Range)
Dim cell As Range
With CreateObject("vbscript.regexp")
    .Pattern = "^.*[\d\.]+(ml|l|g|mg)([^\d\(]+).*$": .ignorecase = True ''[\d\.]+?
    If .test(rng) Then
        tach = .Replace(rng, "$2")
    Else
        For Each cell In Range(Cells(1, ActiveCell.Column), Cells(rng.Row - 1, ActiveCell.Column))
            If InStr(1, rng, cell) Then tach = cell: Exit Function
        Next
    End If
End With
End Function
 
Góp thêm cách dùng code:
PHP:
Function tach(rng As Range)
Dim cell As Range
With CreateObject("vbscript.regexp")
    .Pattern = "^.*[\d\.]+(ml|l|g|mg)([^\d\(]+).*$": .ignorecase = True ''[\d\.]+?
    If .test(rng) Then
        tach = .Replace(rng, "$2")
    Else
        For Each cell In Range(Cells(1, ActiveCell.Column), Cells(rng.Row - 1, ActiveCell.Column))
            If InStr(1, rng, cell) Then tach = cell: Exit Function
        Next
    End If
End With
End Function
Tôi rất ngưỡng mộ bạn với thể loại vbscript.regexp, với cách đặt điều kiện .Pattern
Trước đây tôi thấy có bạn doatmenhhon rất giỏi món này.
 
Tôi rất ngưỡng mộ bạn với thể loại vbscript.regexp, với cách đặt điều kiện .Pattern
Trước đây tôi thấy có bạn doatmenhhon rất giỏi món này.
Regex (VBA) và công thức mảng (WS) dựa vào một vài khái niệm căn bản và từ đó suy ra nhiều thiên biến vạn hoá, rất thích hợp cho những người có sử thích thử thách toán học.
Cũng như năm cuối Trung Học có học môn tính nguyên hàm, chỉ dùng vài định luật căn bản mà phăng ra cách giải nhiều bài toán.
(Lưu ý là tôi không ví với môn Hoá hữu cơ. Môn này cao hơn một bậc, vì nó thiên biến vạn hoá trên cả hình thức lẫn nội dung)
 
Góp thêm cách dùng code:
PHP:
Function tach(rng As Range)
Dim cell As Range
With CreateObject("vbscript.regexp")
    .Pattern = "^.*[\d\.]+(ml|l|g|mg)([^\d\(]+).*$": .ignorecase = True ''[\d\.]+?
    If .test(rng) Then
        tach = .Replace(rng, "$2")
    Else
        For Each cell In Range(Cells(1, ActiveCell.Column), Cells(rng.Row - 1, ActiveCell.Column))
            If InStr(1, rng, cell) Then tach = cell: Exit Function
        Next
    End If
End With
End Function
Dùng vbscript.regexp quá đỉnh, nhìn code không biết gì luôn
Còn 1 khả năng bạn xử luôn cho đẹp :)
 

File đính kèm

Dùng vbscript.regexp quá đỉnh, nhìn code không biết gì luôn
Còn 1 khả năng bạn xử luôn cho đẹp :)
Tôi viết lại:
PHP:
Sub tach()
Dim cell As Range, cell1 As Range, rng As Range, arr, result, darr
arr = Range([a1], Cells(Rows.Count, 1).End(xlUp))
ReDim result(1 To UBound(arr), 1 To 1)
With CreateObject("vbscript.regexp")
    .Pattern = "^.*[\d\.]+(ml|l|g|mg)([^\d\(]+).*$": .ignorecase = True
    For i = 1 To UBound(arr)
        If .test(arr(i, 1)) Then result(i, 1) = .Replace(arr(i, 1), "$2")
    Next
    [B1].Resize(UBound(result), 1) = result
    Set rng = Range([B1], Cells(Rows.Count, 1).End(xlUp).Offset(, 1))
    For Each cell In rng
        If cell = "" Then
            For Each cell1 In rng
                If cell1 <> "" And InStr(1, cell.End(xlToLeft), cell1) Then cell = cell1: Exit For
            Next
        End If
    Next
End With
End Sub
 
Lần chỉnh sửa cuối:
Dùng vbscript.regexp quá đỉnh, nhìn code không biết gì luôn
Còn 1 khả năng bạn xử luôn cho đẹp :)
Cho em muốn hỏi anh là có thể tạo 1 Function Tổng quát dùng với
vbscript.regexp
Để lấy được những dữ liệu theo ý muốn Dạng kiểu Hàm lấy ký tự sau những kí tự đặc biệt như #, ? , * đại diện cho 1 hay nhiều kí tự: Ví dụ như Hàng hóa theo số #45786 của ngày 01/2017 > kết quả muốn lấy là 45786 hay kết quả ra là 01/2017 ....Giống kiểu crtl+h của excel kèm theo excel được không anh !
 
Web KT

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

Back
Top Bottom