Nhờ giúp đỡ về gộp chuỗi mã hàng

Liên hệ QC

luanvnn

Thành viên mới
Tham gia
5/12/09
Bài viết
10
Được thích
0
Mình có file excell có 2 cột gồm mã hàng ( AB433100- AB433110) và cột ngày xuất hàng. mình muốn thống kê hàng bán theo ngày như sau:
NGÀYMÃ HÀNG
04/05/2018​
AB433100; AB433103- AB433105
15/05/2018​
AB433101-AB433102; AB433106- AB433110
Nhờ mọi các bạn chỉ giúp.
 

File đính kèm

  • HOI VE NOI CHUOI.xlsx
    10 KB · Đọc: 20
Mình có file excell có 2 cột gồm mã hàng ( AB433100- AB433110) và cột ngày xuất hàng. mình muốn thống kê hàng bán theo ngày như sau:
NGÀYMÃ HÀNG
04/05/2018​
AB433100; AB433103- AB433105
15/05/2018​
AB433101-AB433102; AB433106- AB433110
Nhờ mọi các bạn chỉ giúp.
Nguyên tắc của dấu "-" & ";" là như thế nào vậy bạn.
 
thay vì từ tới dùng dấu "-" thì tôi liệt kê hết nó ra chỉ dùng ";" có được không?
 
Bài này cũng lý thú đây. Chờ các bác chuyên về công thức giải trước, kg được thì mới dùng vba
 
Mình có file excell có 2 cột gồm mã hàng ( AB433100- AB433110) và cột ngày xuất hàng. mình muốn thống kê hàng bán theo ngày như sau:
NGÀYMÃ HÀNG
04/05/2018​
AB433100; AB433103- AB433105
15/05/2018​
AB433101-AB433102; AB433106- AB433110
Nhờ mọi các bạn chỉ giúp.
Bạn cho cái dữ liệu nhiều nhiều chút xem nào.
 
Vậy thì đơn giản hơn rồi đó, mã hàng chỉ có 2 ký tự A B ở trước thôi hả bạn, hay có thể có 2 hay nhiều ký tự khác, lộn xộn.
 
Cái này trong nghề gọi là Pivot.
Access chỉ hổ trợ dạng tương đương là Crosstab và không mạnh lắm cho nên hơi khó dùng ADO/SQL

Giải thuật cơ bản của pivot là sort-group-and-aggregate.
Nếu áp dụng giải thuật này cho bài này thì cần một hàm xét xem một mã có phải là tiếp nối của mã trước nó.
 
Lần chỉnh sửa cuối:
Mình đã gửi lại file, nhờ banh coi giúp.
Bạn thử cái sub này xem đúng không.
Mã:
Sub gopdulieu()
    Dim arr, i As Long, s As String, kq, dic As Object, ngay As String, b As Long, T, k As Integer, s1 As String, s2 As String
    Dim a As Long, ten As String, j As Integer
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Sheet1")
         arr = .Range("B5:C58").Value
         ReDim kq(1 To UBound(arr), 1 To 2)
         For i = 1 To UBound(arr)
             ngay = arr(i, 2)
             If Not dic.exists(ngay) Then
                dic.Add ngay, "#" & arr(i, 1)
                a = a + 1
                kq(a, 1) = ngay
             Else
                s = dic.Item(ngay)
                s = s & "#" & arr(i, 1)
                dic.Item(ngay) = s
             End If
       Next i
       For i = 1 To a
           s = dic.Item(kq(i, 1))
           T = Split(s, "#")
           b = UBound(T)
          
           For k = 1 To b
             s1 = T(k)
             If InStr(1, s, s1) Then
                ten = ten & ";" & s1
                j = 0
                Do
                   j = j + 1
                   s2 = Left(s1, Len(s1) - 4) & (Right(s1, 4) + j)
                   If InStr(1, s, s2) Then
                      s = Replace(s, s2, "")
                   Else
                      s2 = Left(s1, Len(s1) - 4) & (Right(s1, 4) + j - 1)
                      If s1 <> s2 Then ten = ten & "-" & s2
                      Exit Do
                   End If
                Loop
             End If
          Next k
           kq(i, 2) = Right(ten, Len(ten) - 1)
           ten = Empty
       Next i
       .Range("F14:G14").Resize(a).Value = kq
   End With
End Sub
 

File đính kèm

  • Thống kê mã hàng xuất theo ngày.xlsm
    20.2 KB · Đọc: 12
Bạn thử cái sub này xem đúng không.
Mã:
Sub gopdulieu()
    Dim arr, i As Long, s As String, kq, dic As Object, ngay As String, b As Long, T, k As Integer, s1 As String, s2 As String
    Dim a As Long, ten As String, j As Integer
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Sheet1")
         arr = .Range("B5:C58").Value
         ReDim kq(1 To UBound(arr), 1 To 2)
         For i = 1 To UBound(arr)
             ngay = arr(i, 2)
             If Not dic.exists(ngay) Then
                dic.Add ngay, "#" & arr(i, 1)
                a = a + 1
                kq(a, 1) = ngay
             Else
                s = dic.Item(ngay)
                s = s & "#" & arr(i, 1)
                dic.Item(ngay) = s
             End If
       Next i
       For i = 1 To a
           s = dic.Item(kq(i, 1))
           T = Split(s, "#")
           b = UBound(T)
         
           For k = 1 To b
             s1 = T(k)
             If InStr(1, s, s1) Then
                ten = ten & ";" & s1
                j = 0
                Do
                   j = j + 1
                   s2 = Left(s1, Len(s1) - 4) & (Right(s1, 4) + j)
                   If InStr(1, s, s2) Then
                      s = Replace(s, s2, "")
                   Else
                      s2 = Left(s1, Len(s1) - 4) & (Right(s1, 4) + j - 1)
                      If s1 <> s2 Then ten = ten & "-" & s2
                      Exit Do
                   End If
                Loop
             End If
          Next k
           kq(i, 2) = Right(ten, Len(ten) - 1)
           ten = Empty
       Next i
       .Range("F14:G14").Resize(a).Value = kq
   End With
End Sub
Cám ơn bạn rất nhiều. Mình đã giải quyết được vấn đề.
 
@ chủ thớt:
Ví dụ ở bài #12 có vấn đề lạ: Mã hàng không lặp lại lần nào cả.
Mã hàng lặp lại thì sao bạn?
 
Dữ liệu ít thì chạy code trên là được rồi. Khi nào phình ra cỡ 10 ngàn dòng thì mới cần viết lại.
Dictionary, quicksort, detect tăng, group.
 
Web KT
Back
Top Bottom