Mình nghĩ không còn cách nào khác là phải dùng hàm tự tạo (User-defined Function, hay UDF). Hơn nữa phải dựa vào công thức mảng (array formula). Nếu bạn không quen với những khái niệm này thì sẽ hơi khó để hiểu cách sử dụng. Nhưng mình sẽ cố giải thích.
Trước tiên, bạn hãy đặt tên cho các cột trên bảng Sơ Đồ của file. Ví dụ, A3-A13 gọi là ma_sp, B3-13 gọi là ten_sp, v.v.
Sau đó mở VBA (Alt-F11), bạn tìm tên file của mình ở trong project window bên tay trái, nếu nó không có module thì bạn phải nhấn chuột phải vào tiêu đề của project và chọn Insert - Module.
Sau đó bạn copy và paste đoạn code dưới đây vào module window hiện lên bên phải:
Mã:
Option Explicit
Public Function ConcSep_Array(InArray() As Variant, Optional Sep As String) As String
On Error Resume Next
Dim OutStr As String
Dim i, j As Integer
For i = LBound(InArray, 1) To UBound(InArray, 1)
For j = LBound(InArray, 2) To UBound(InArray, 2)
If InArray(i, j) <> "" Then OutStr = OutStr & InArray(i, j) & Sep
Next j
Next i
ConcSep_Array = Left(OutStr, Len(OutStr) - Len(Sep))
End Function
Đây là hàm tự tạo do mình viêt, viết tắt của cụm từ concatenate with separator (dùng cho array), có thể nối các cụm từ tùy chọn thể array với nhau được ngăn chia bởi một nhóm ký tự do chính người sử dụng chọn. Ví dụ:
Concsep_Array({A1, A2, A3}, ", ") sẽ cho ra kết quả "A1, A2, A3"
Bạn có thể sử dụng công thức này trong ô E2 và E3 của bảng Tổng:
E2: =ConcSep_Array(IF(((ma_sp=A3)*(ten_sp=B3)*(don_vi=C3)=1);so_do;"");",")
E3: =ConcSep_Array(IF(((ma_sp=A4)*(ten_sp=B4)*(don_vi=C4)=1);so_do;"");",")
Lưu ý khi gõ xong công thức phải nhấn Ctrl - Shift- Enter thay vì Enter không.
Trước tiên tôi xin được cám ơn bạn jubinell va viehoai đã tích cực trả lời giúp tôi. Tuy nhiên có một vấn đề như thế này, nếu dò đến mã 11001 thì vùng chọn là E3:E7, mã 11002 thì vùng chọn là E10:E13...tương tự cho trên 1000 sản phẩm nửa. Thì công việc này vẫn còn thủ công lắm, sao không làm 1 vùng chọn chung E3:En. Chẳng hạn tôi lấy từ E3: E100 thì kq không đúng !
Trước tiên tôi xin được cám ơn bạn jubinell va viehoai đã tích cực trả lời giúp tôi. Tuy nhiên có một vấn đề như thế này, nếu dò đến mã 11001 thì vùng chọn là E3:E7, mã 11002 thì vùng chọn là E10:E13...tương tự cho trên 1000 sản phẩm nửa. Thì công việc này vẫn còn thủ công lắm, sao không làm 1 vùng chọn chung E3:En. Chẳng hạn tôi lấy từ E3: E100 thì kq không đúng !
Function JoinIf(LValue, LRange As Range, ColIndex As Long, Optional Sep = "") As String
Dim Clls As Range, Temp
On Error Resume Next
If Not IsEmpty(LValue) Then
With CreateObject("Scripting.Dictionary")
For Each Clls In LRange.Resize(, 1)
If Clls.Value = LValue Then .Add Clls.Address, Clls(, ColIndex)
Next
JoinIf = Join(.Items, Sep)
End With
End If
End Function
Không cần đâu, cứ dán code của bạn ấy vào rồi gõ công thức thôi
Xem file đây
(Cách làm này e rằng sẽ chậm về mặc tốc độ, tôi đoán vậy ---> Vì nó giống với SUMPRODUCT)