Code vba trích lọc và tổng hợp vật tư

Liên hệ QC

BoKuDo

Thành viên chính thức
Tham gia
17/12/13
Bài viết
92
Được thích
5
Nghề nghiệp
Kế toán
Mình có 1 bảng vật tư nhập theo ngày, mình muốn nhờ các thầy và các bạn trên diễn đàn giúp mình bằng macro sao cho khi ở sheet "Vật tư", chạy macro sẽ tự tạo ra 1 sheet "Tổng hợp" với nội dung giống sheet "Tổng hợp (Ket qua)" (mẫu mình đã làm thủ công).
macro có chức năng là
1- trích lọc dữ liệu bên sheet "Vật tư" và tổng hợp lại đưa qua sheet "Tổng hợp". sắp xếp theo thứ tự a, b, c, ...
2- Phần ngày ở cột B của sheet "Vật tư" sẽ được diễn giải giống như bên vùng H1:N của sheet "Tổng hợp".
(Phần ngày này không cố định nên bên sheet "Vật tư" có bao nhiêu ngày thì bên sheet "Tổng hợp" tương ứng với chừng đó số cột)
Mình trình bày vậy hy vọng các thầy và các bạn trên diễn đàn giúp cho.
Mình cảm ơn!
 

File đính kèm

  • THVT.xlsm
    34.1 KB · Đọc: 23
Mình có 1 bảng vật tư nhập theo ngày, mình muốn nhờ các thầy và các bạn trên diễn đàn giúp mình bằng macro sao cho khi ở sheet "Vật tư", chạy macro sẽ tự tạo ra 1 sheet "Tổng hợp" với nội dung giống sheet "Tổng hợp (Ket qua)" (mẫu mình đã làm thủ công).
macro có chức năng là
1- trích lọc dữ liệu bên sheet "Vật tư" và tổng hợp lại đưa qua sheet "Tổng hợp". sắp xếp theo thứ tự a, b, c, ...
2- Phần ngày ở cột B của sheet "Vật tư" sẽ được diễn giải giống như bên vùng H1:N của sheet "Tổng hợp".
(Phần ngày này không cố định nên bên sheet "Vật tư" có bao nhiêu ngày thì bên sheet "Tổng hợp" tương ứng với chừng đó số cột)
Mình trình bày vậy hy vọng các thầy và các bạn trên diễn đàn giúp cho.
Mình cảm ơn!
Cái này làm VBA thì được bạn à. Nhưng không ai lập CSDL như file của bạn cả. Nếu công trình khoảng 2 đến 3 năn Bạn có nghĩ CSDL bạn bị phá sản không ???
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này làm VBA thì được bạn à. Nhưng không ai lập CSDL như file của bạn cả. Nếu công trình khoảng 2 đến 3 năn Bạn có nghĩ CSDL bạn bị phá sản không ???
Ôi mình chưa nghĩ đến vấn đề đó, với lại công trình này cũng nhỏ. Mình chưa có số làm các công trình lớn :(
Hiện mình chưa nghĩ ra phương án nào nhưng có thể chia nhỏ ra từng đợt để tính.
 
Upvote 0
Ôi mình chưa nghĩ đến vấn đề đó, với lại công trình này cũng nhỏ. Mình chưa có số làm các công trình lớn :(
Hiện mình chưa nghĩ ra phương án nào nhưng có thể chia nhỏ ra từng đợt để tính.
Thứ 1: Mình cũng làm xây dựng. Cũng quản lý cái này mặc dù mình mới ra nghề (Nhưng cái đó là thiết thực và sát sườn nên mình cũng có tìm hiểu về cách quản lý)
Thứ 2: Như bọn mình chỉ làm công trình nhỏ và siêu nhỏ nhưng thời gian thi công có thể là cả năm .... nên mới dám góp ý với bạn như bài trên
Thứ 3: Là trong bảng tính Execl của bạn hiện tại dòng tới lận 1048576 dòng trong khi cột có 16384 cột thì hà cớ gì mà mình lại bố trí CSDL như vậy
Một số góp ý. Có gì mong bạn bỏ qua nha :D
 
Upvote 0
Thứ 1: Mình cũng làm xây dựng. Cũng quản lý cái này mặc dù mình mới ra nghề (Nhưng cái đó là thiết thực và sát sườn nên mình cũng có tìm hiểu về cách quản lý)
Thứ 2: Như bọn mình chỉ làm công trình nhỏ và siêu nhỏ nhưng thời gian thi công có thể là cả năm .... nên mới dám góp ý với bạn như bài trên
Thứ 3: Là trong bảng tính Execl của bạn hiện tại dòng tới lận 1048576 dòng trong khi cột có 16384 cột thì hà cớ gì mà mình lại bố trí CSDL như vậy
Một số góp ý. Có gì mong bạn bỏ qua nha :D
Không đâu bạn, bạn góp ý hỗ trợ vậy mình thấy hay chứ có gì mà bỏ với qua :D
Mình mới đụng phần tổng hợp này nên mới nghĩ ra cách này. Nếu bạn đã làm nhiều phần này thì chắc sẽ có cách tối ưu hơn.
Bạn có thể hỗ trợ mình 1 code từ kinh nghiệm của bạn để mình tham khảo được ko?
Mình cảm ơn!
 
Upvote 0
Cách thì mình không có. Nhưng mình quản lý theo hướng của anh @be09 góp ý trên diễn đàn là cứ đưa vào 1 cái chung cần gì thì mình trích xuất ra :D (Quan trọng là mục đích của mình như thế nào nữa mới ra được kết quả chứ .....)
 
Upvote 0
Cách thì mình không có. Nhưng mình quản lý theo hướng của anh @be09 góp ý trên diễn đàn là cứ đưa vào 1 cái chung cần gì thì mình trích xuất ra :D (Quan trọng là mục đích của mình như thế nào nữa mới ra được kết quả chứ .....)
Bạn có thể cho mình xin link bài viết của anh @be09 để mình tìm hiểu thêm được không?
 
Upvote 0
Mình có 1 bảng vật tư nhập theo ngày, mình muốn nhờ các thầy và các bạn trên diễn đàn giúp mình bằng macro sao cho khi ở sheet "Vật tư", chạy macro sẽ tự tạo ra 1 sheet "Tổng hợp" với nội dung giống sheet "Tổng hợp (Ket qua)" (mẫu mình đã làm thủ công).
macro có chức năng là
1- trích lọc dữ liệu bên sheet "Vật tư" và tổng hợp lại đưa qua sheet "Tổng hợp". sắp xếp theo thứ tự a, b, c, ...
2- Phần ngày ở cột B của sheet "Vật tư" sẽ được diễn giải giống như bên vùng H1:N của sheet "Tổng hợp".
(Phần ngày này không cố định nên bên sheet "Vật tư" có bao nhiêu ngày thì bên sheet "Tổng hợp" tương ứng với chừng đó số cột)
Mình trình bày vậy hy vọng các thầy và các bạn trên diễn đàn giúp cho.
Mình cảm ơn!
kiến thức VBA tôi không được nhiều
nếu sai thôi he
phần sắp xếp A B C khác so với mẫu của bạn
Mã:
Sub GPE()
    Dim DicNgay As Object:      Set DicNgay = CreateObject("Scripting.Dictionary")
    Dim DicVLieu As Object:      Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Dim DicNgay As Scripting.Dictionary: Set DicNgay = New Scripting.Dictionary
    'Dim DicVLieu As Scripting.Dictionary: Set DicVLieu = New Scripting.Dictionary
    Dim VLieu As String
    Dim Ngay As Long
    Dim Arr As Variant, ArrNgay As Variant, ArrVLieu As Variant, ArrKQ As Variant
    Arr = Sheets("VATTU").Range("B2:F192").Value2
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        If Not DicNgay.Exists(Arr(i, 1)) And Len(Arr(i, 1)) > 0 Then DicNgay.Add Arr(i, 1), i
        If Not DicVLieu.Exists(Arr(i, 2)) And Len(Arr(i, 2)) > 0 Then DicVLieu.Add Arr(i, 2), i
        If Len(Arr(i, 1)) > 0 Then Ngay = CLng(Arr(i, 1)) Else Arr(i, 1) = Ngay
    Next i
    ReDim ArrNgay(0 To DicNgay.Count - 1)
    ReDim ArrVLieu(0 To DicVLieu.Count - 1)
    For i = 0 To UBound(ArrNgay)
        ArrNgay(i) = DicNgay.Keys()(i)
    Next i
    ArrNgay = Sort1DArray(ArrNgay, False, False)
    For i = 0 To UBound(ArrVLieu)
        ArrVLieu(i) = DicVLieu.Keys()(i)
    Next i
    ArrVLieu = Sort1DArray(ArrVLieu, True, False)
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
    Set DicNgay = CreateObject("Scripting.Dictionary")
    Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Set DicNgay = New Scripting.Dictionary
    'Set DicVLieu = New Scripting.Dictionary
    For i = 0 To UBound(ArrNgay)
        DicNgay.Add CLng(ArrNgay(i)), 8 + i
    Next i
    For i = 0 To UBound(ArrVLieu)
        DicVLieu.Add ArrVLieu(i), 2 + i
    Next i
    ReDim ArrKQ(1 To UBound(ArrVLieu, 1) + 2, 1 To UBound(ArrNgay, 1) + 8)
    ArrKQ(1, 1) = "Stt"
    ArrKQ(1, 2) = "Tên"
    ArrKQ(1, 3) = "m" & ChrW(227) & " VT"
    ArrKQ(1, 4) = ChrW(272) & ChrW(417) & "n v" & ChrW(7883)
    ArrKQ(1, 5) = "S" & ChrW(7889) & " l" & ChrW(432) & ChrW(7907) & "ng"
    ArrKQ(1, 6) = ChrW(272) & ChrW(417) & "n gi" & ChrW(225)
    ArrKQ(1, 7) = "Th" & ChrW(224) & "nh ti" & ChrW(7873) & "n"
    For i = LBound(ArrVLieu, 1) To UBound(ArrVLieu, 1)
        ArrKQ(2 + i, 1) = i + 1 'dien STT
        ArrKQ(2 + i, 2) = ArrVLieu(i) 'dien ten vat lieu
    Next i
    For i = LBound(ArrNgay, 1) To UBound(ArrNgay, 1)
        ArrKQ(1, 8 + i) = ArrNgay(i) 'dien ngay
    Next i
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 5) = "=sum(" & Cells(DicVLieu.Item(Arr(i, 2)), 8).Resize(1, DicNgay.Count).Address(0, 0) & ")"
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 4) = Arr(i, 4) 'dien don vi
        ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) = _
                ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) + Arr(i, 5) 'dien so luong
    Next i
    Sheets("KQ").Cells(1, 1).Resize(UBound(ArrKQ, 1), UBound(ArrKQ, 2)) = ArrKQ
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
End Sub
Function Sort1DArray(ByVal Arr, Optional ByVal isText As Boolean = False, Optional ByVal isDESC As Boolean = False)
    Dim sCommand As String
    sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort("
    If isText Then
        sCommand = sCommand & ")"
    Else
        sCommand = sCommand & "function(a,b){return (a-b)})"
    End If
    If isDESC Then sCommand = sCommand & ".reverse()"
    sCommand = sCommand & ".join('" & vbBack & "')"
    With CreateObject("MSScriptControl.ScriptControl")
        .Language = "JavaScript"
        Sort1DArray = Split(.Eval(sCommand), vbBack)
    End With
End Function
 
Upvote 0
à quên
trong VBA kỵ nhất tên sheet tiếng việt nha bạn
bạn đổi tên vật tư thành VATTU
rồi sheet kết quả thành KQ thì mới chạy code trên được
 
Upvote 0
à quên
trong VBA kỵ nhất tên sheet tiếng việt nha bạn
bạn đổi tên vật tư thành VATTU
rồi sheet kết quả thành KQ thì mới chạy code trên được
Mình cảm ơn!
Mình dùng thử có gặp vấn đề sau nhờ bạn:
- code không tạo được sheet "KQ" mà phải có sheet "KQ" sẵn, mình muốn ban đầu chỉ có sheet "VATTU" thôi, khi chạy code thì sẽ tự tạo thêm sheet "KQ
1 - tại dòng
Arr = Sheets("VATTU").Range("B2:F192").Value2
như phần tô màu đỏ, nếu dữ liệu bên sheet "VATTU" ít hoặc nhiều hơn số dòng 192 thì sẽ bị báo lỗi.
2- Tại ô cột thành tiền vẫn chưa có công thức = số lượng x đơn giá
Mình cảm ơn đã hỗ trợ!
 
Upvote 0
Mình cảm ơn!
Mình dùng thử có gặp vấn đề sau nhờ bạn:
- code không tạo được sheet "KQ" mà phải có sheet "KQ" sẵn, mình muốn ban đầu chỉ có sheet "VATTU" thôi, khi chạy code thì sẽ tự tạo thêm sheet "KQ
1 - tại dòng
Arr = Sheets("VATTU").Range("B2:F192").Value2
như phần tô màu đỏ, nếu dữ liệu bên sheet "VATTU" ít hoặc nhiều hơn số dòng 192 thì sẽ bị báo lỗi.
2- Tại ô cột thành tiền vẫn chưa có công thức = số lượng x đơn giá
Mình cảm ơn đã hỗ trợ!
lỗi thế nào bạn?
bạn muốn tổng quát thì copy code này lại nha
Mã:
Option Explicit
Sub GPE()
    Dim DicNgay As Object: Set DicNgay = CreateObject("Scripting.Dictionary")
    Dim DicVLieu As Object: Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Dim DicNgay As Scripting.Dictionary: Set DicNgay = New Scripting.Dictionary
    'Dim DicVLieu As Scripting.Dictionary: Set DicVLieu = New Scripting.Dictionary
    Dim VLieu As String
    Dim Ngay As Long, i As Long
    Dim Arr As Variant, ArrNgay As Variant, ArrVLieu As Variant, ArrKQ As Variant
    Dim WsT As Worksheet
    On Error Resume Next    'neu chua co sheet tam thi tao
    If CBool(Len(ThisWorkbook.Sheets("KQ").Name) = 0) Then
        Set WsT = ThisWorkbook.Sheets.Add    ' After:=ActiveSheet
        WsT.Name = "KQ"
    Else    'nguoc lai co roi thi set
        Set WsT = ThisWorkbook.Sheets("KQ")
    End If
    With Sheets("VATTU")
        Arr = .Range("B2").Resize( _
              .Cells(.Rows.Count, "A").End(xlUp).Row, _
              .Cells(1, .Columns.Count).End(xlToLeft).Column).Value2
    End With
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        If Not DicNgay.Exists(Arr(i, 1)) And Len(Arr(i, 1)) > 0 Then DicNgay.Add Arr(i, 1), i
        If Not DicVLieu.Exists(Arr(i, 2)) And Len(Arr(i, 2)) > 0 Then DicVLieu.Add Arr(i, 2), i
        If Len(Arr(i, 1)) > 0 Then Ngay = CLng(Arr(i, 1)) Else Arr(i, 1) = Ngay
    Next i
    ReDim ArrNgay(0 To DicNgay.Count - 1)
    ReDim ArrVLieu(0 To DicVLieu.Count - 1)
    For i = 0 To UBound(ArrNgay)
        ArrNgay(i) = DicNgay.Keys()(i)
    Next i
    ArrNgay = Sort1DArray(ArrNgay, False, False)
    For i = 0 To UBound(ArrVLieu)
        ArrVLieu(i) = DicVLieu.Keys()(i)
    Next i
    ArrVLieu = Sort1DArray(ArrVLieu, True, False)
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
    Set DicNgay = CreateObject("Scripting.Dictionary")
    Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Set DicNgay = New Scripting.Dictionary
    'Set DicVLieu = New Scripting.Dictionary
    For i = 0 To UBound(ArrNgay)
        DicNgay.Add CLng(ArrNgay(i)), 8 + i
    Next i
    For i = 0 To UBound(ArrVLieu)
        DicVLieu.Add ArrVLieu(i), 2 + i
    Next i
    ReDim ArrKQ(1 To UBound(ArrVLieu, 1) + 2, 1 To UBound(ArrNgay, 1) + 8)
    ArrKQ(1, 1) = "Stt"
    ArrKQ(1, 2) = "Tên"
    ArrKQ(1, 3) = "m" & ChrW(227) & " VT"
    ArrKQ(1, 4) = ChrW(272) & ChrW(417) & "n v" & ChrW(7883)
    ArrKQ(1, 5) = "S" & ChrW(7889) & " l" & ChrW(432) & ChrW(7907) & "ng"
    ArrKQ(1, 6) = ChrW(272) & ChrW(417) & "n gi" & ChrW(225)
    ArrKQ(1, 7) = "Th" & ChrW(224) & "nh ti" & ChrW(7873) & "n"
    For i = LBound(ArrVLieu, 1) To UBound(ArrVLieu, 1)
        ArrKQ(2 + i, 1) = i + 1    'dien STT
        ArrKQ(2 + i, 2) = ArrVLieu(i)    'dien ten vat lieu
    Next i
    For i = LBound(ArrNgay, 1) To UBound(ArrNgay, 1)
        ArrKQ(1, 8 + i) = ArrNgay(i)    'dien ngay
    Next i
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 5) = "=sum(" & Cells(DicVLieu.Item(Arr(i, 2)), 8).Resize(1, DicNgay.Count).Address(0, 0) & ")"
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 7) = "=" & Cells(DicVLieu.Item(Arr(i, 2)), 5).Address(0, 0) & "*" & Cells(DicVLieu.Item(Arr(i, 2)), 6).Address(0, 0)
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 4) = Arr(i, 4)    'dien don vi
        ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) = _
        ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) + Arr(i, 5)    'dien so luong
    Next i
    WsT.Cells.ClearContents
    WsT.Cells(1, 1).Resize(UBound(ArrKQ, 1), UBound(ArrKQ, 2)) = ArrKQ
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
End Sub
Function Sort1DArray(ByVal Arr, Optional ByVal isText As Boolean = False, Optional ByVal isDESC As Boolean = False)
    Dim sCommand As String
    sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort("
    If isText Then
        sCommand = sCommand & ")"
    Else
        sCommand = sCommand & "function(a,b){return (a-b)})"
    End If
    If isDESC Then sCommand = sCommand & ".reverse()"
    sCommand = sCommand & ".join('" & vbBack & "')"
    With CreateObject("MSScriptControl.ScriptControl")
        .Language = "JavaScript"
        Sort1DArray = Split(.Eval(sCommand), vbBack)
    End With
End Function
đã bảo kiến thức còn hạn hẹp mà cứ ép thằng nhỏ làm quá sức
Ẹc..... Ẹc........
 
Upvote 0
lỗi thế nào bạn?
bạn muốn tổng quát thì copy code này lại nha
Mã:
Option Explicit
Sub GPE()
    Dim DicNgay As Object: Set DicNgay = CreateObject("Scripting.Dictionary")
    Dim DicVLieu As Object: Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Dim DicNgay As Scripting.Dictionary: Set DicNgay = New Scripting.Dictionary
    'Dim DicVLieu As Scripting.Dictionary: Set DicVLieu = New Scripting.Dictionary
    Dim VLieu As String
    Dim Ngay As Long, i As Long
    Dim Arr As Variant, ArrNgay As Variant, ArrVLieu As Variant, ArrKQ As Variant
    Dim WsT As Worksheet
    On Error Resume Next    'neu chua co sheet tam thi tao
    If CBool(Len(ThisWorkbook.Sheets("KQ").Name) = 0) Then
        Set WsT = ThisWorkbook.Sheets.Add    ' After:=ActiveSheet
        WsT.Name = "KQ"
    Else    'nguoc lai co roi thi set
        Set WsT = ThisWorkbook.Sheets("KQ")
    End If
    With Sheets("VATTU")
        Arr = .Range("B2").Resize( _
              .Cells(.Rows.Count, "A").End(xlUp).Row, _
              .Cells(1, .Columns.Count).End(xlToLeft).Column).Value2
    End With
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        If Not DicNgay.Exists(Arr(i, 1)) And Len(Arr(i, 1)) > 0 Then DicNgay.Add Arr(i, 1), i
        If Not DicVLieu.Exists(Arr(i, 2)) And Len(Arr(i, 2)) > 0 Then DicVLieu.Add Arr(i, 2), i
        If Len(Arr(i, 1)) > 0 Then Ngay = CLng(Arr(i, 1)) Else Arr(i, 1) = Ngay
    Next i
    ReDim ArrNgay(0 To DicNgay.Count - 1)
    ReDim ArrVLieu(0 To DicVLieu.Count - 1)
    For i = 0 To UBound(ArrNgay)
        ArrNgay(i) = DicNgay.Keys()(i)
    Next i
    ArrNgay = Sort1DArray(ArrNgay, False, False)
    For i = 0 To UBound(ArrVLieu)
        ArrVLieu(i) = DicVLieu.Keys()(i)
    Next i
    ArrVLieu = Sort1DArray(ArrVLieu, True, False)
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
    Set DicNgay = CreateObject("Scripting.Dictionary")
    Set DicVLieu = CreateObject("Scripting.Dictionary")
    'Set DicNgay = New Scripting.Dictionary
    'Set DicVLieu = New Scripting.Dictionary
    For i = 0 To UBound(ArrNgay)
        DicNgay.Add CLng(ArrNgay(i)), 8 + i
    Next i
    For i = 0 To UBound(ArrVLieu)
        DicVLieu.Add ArrVLieu(i), 2 + i
    Next i
    ReDim ArrKQ(1 To UBound(ArrVLieu, 1) + 2, 1 To UBound(ArrNgay, 1) + 8)
    ArrKQ(1, 1) = "Stt"
    ArrKQ(1, 2) = "Tên"
    ArrKQ(1, 3) = "m" & ChrW(227) & " VT"
    ArrKQ(1, 4) = ChrW(272) & ChrW(417) & "n v" & ChrW(7883)
    ArrKQ(1, 5) = "S" & ChrW(7889) & " l" & ChrW(432) & ChrW(7907) & "ng"
    ArrKQ(1, 6) = ChrW(272) & ChrW(417) & "n gi" & ChrW(225)
    ArrKQ(1, 7) = "Th" & ChrW(224) & "nh ti" & ChrW(7873) & "n"
    For i = LBound(ArrVLieu, 1) To UBound(ArrVLieu, 1)
        ArrKQ(2 + i, 1) = i + 1    'dien STT
        ArrKQ(2 + i, 2) = ArrVLieu(i)    'dien ten vat lieu
    Next i
    For i = LBound(ArrNgay, 1) To UBound(ArrNgay, 1)
        ArrKQ(1, 8 + i) = ArrNgay(i)    'dien ngay
    Next i
    For i = LBound(Arr, 1) To UBound(Arr, 1)
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 5) = "=sum(" & Cells(DicVLieu.Item(Arr(i, 2)), 8).Resize(1, DicNgay.Count).Address(0, 0) & ")"
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 7) = "=" & Cells(DicVLieu.Item(Arr(i, 2)), 5).Address(0, 0) & "*" & Cells(DicVLieu.Item(Arr(i, 2)), 6).Address(0, 0)
        ArrKQ(DicVLieu.Item(Arr(i, 2)), 4) = Arr(i, 4)    'dien don vi
        ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) = _
        ArrKQ(DicVLieu.Item(Arr(i, 2)), DicNgay.Item(Arr(i, 1))) + Arr(i, 5)    'dien so luong
    Next i
    WsT.Cells.ClearContents
    WsT.Cells(1, 1).Resize(UBound(ArrKQ, 1), UBound(ArrKQ, 2)) = ArrKQ
    Set DicNgay = Nothing
    Set DicVLieu = Nothing
End Sub
Function Sort1DArray(ByVal Arr, Optional ByVal isText As Boolean = False, Optional ByVal isDESC As Boolean = False)
    Dim sCommand As String
    sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort("
    If isText Then
        sCommand = sCommand & ")"
    Else
        sCommand = sCommand & "function(a,b){return (a-b)})"
    End If
    If isDESC Then sCommand = sCommand & ".reverse()"
    sCommand = sCommand & ".join('" & vbBack & "')"
    With CreateObject("MSScriptControl.ScriptControl")
        .Language = "JavaScript"
        Sort1DArray = Split(.Eval(sCommand), vbBack)
    End With
End Function
đã bảo kiến thức còn hạn hẹp mà cứ ép thằng nhỏ làm quá sức
Ẹc..... Ẹc........
Nói mình ép thì tội quá, chỉ là nhờ hỗ trợ thôi, nếu phiền bạn thì mình ko dám nữa.
Rất cảm ơn đã giúp!
 
Upvote 0
nói đùa thôi mà bạn. cứ tưởng bạn biết sửa code nên viết đơn giản cho nhanh
Mình thấy kết quả vậy là ổn rồi, còn phần định dạng để mình tìm trên diễn đàn và tự mò mẫm :D
Một lần nữa cảm ơn bạn đã hỗ trợ. Chúc tối chủ nhật vui vẻ!
 
Upvote 0
Mình thấy kết quả vậy là ổn rồi, còn phần định dạng để mình tìm trên diễn đàn và tự mò mẫm :D
Một lần nữa cảm ơn bạn đã hỗ trợ. Chúc tối chủ nhật vui vẻ!
định dạng thì đây
WsT.Cells(1, 8).Resize(1, UBound(ArrKQ, 2)-7).NumberFormat = "m/d/yyyy"
 
Upvote 0
Web KT
Back
Top Bottom