Tổng hợp dữ liệu bán hàng dùng Dictionary ?

Liên hệ QC

thanhphuongvip

Mới học VBA, hỏi ngu anh chị đừng chửi ạ
Tham gia
16/1/10
Bài viết
136
Được thích
22
Chào anh chị!
Đầu tiên em có bảng tổng hợp các hóa đơn bán hàng như thế này (sheet THHD):

1587206197878.png

Em muốn làm bảng tổng hợp để biết trong khoảng thời gian nào đó bán được bao nhiêu mặt hàng, và tổng số lượng, Chiết khấu, Thành Tiền, Giá Vốn, Lợi nhuận tương tứng là bao nhiêu, có lọc theo tên Khách Hàng). Nên em tạo ra một sheet như thế này:

1587206235080.png

e có ghi chú cách tính của từng cột, lấy từ sheet THHD, phần tiền vốn là lấy số lượng * đơn giá vốn ở sheet MAHANG.

1587206568530.png

Nhờ anh chị giúp em làm tổng hợp này sử dụng Dictionary . Có thể có nhiều cách để làm ra yêu cầu này, nhưng em đang học để hiểu thêm về dictionary nên anh chị giúp em sử dụng dic càng tốt. Còn không có thì em vẫn muốn học hỏi thêm những cách khác ạ!

Xin cảm ơn anh chị trên GPE!
 

File đính kèm

  • Bai Tap Dic.xlsm
    101.3 KB · Đọc: 53
Lần chỉnh sửa cuối:
Thật ra cái "BÁO CÁO XUẤT KHO" của thớt từ đầu đã là thiết kế dỏm. Nếu bỏ qua cách bình thường ngừoi ta dùng (query) mà tôi đề cập ở bài #13 thì bảng báo cáo này cũng còn nhiều sơ hở.

Bảng "TONG HOP HOA DON" cũng thiết kế dỏm. Thiếu mất cột "tiền vốn". Người bán hàng chân chính không thể mặc định rằng giá vốn không thay đổi trong suốt thời gian báo cáo. Bởi vì báo cáo có thể năm, quý, tháng , tuần, ngày,...
Trừ phi bảng "Hàng tồn kho" có chứa giá vốn theo từng thời điểm. Khi ấy có thể tra giá vốn.

Bảng "xuất hàng" chính thức còn phải có tối thiểu 1 cột nữa để ghi tổng số lần xuất hàng trong thời gian chỉ định.

Bài này muốn thử nghề đít-sần thì có thể lập 1 cái dùng key mã hàng, và item là chỉ số dòng của mảng đầu ra.
- đọc bảng phát sinh, xét đủ điều kiện ngày và khách hàng thì chép vào mảng đầu ra
Bài toán còn lại là lookup cái giá vốn từ bảng danh mục mã hàng:
- set một range để lookup (mã hàng được sắp xếp, cho nên hàm Match tương đối nhanh)
- ý kiến dùng một đít-sần khác để tra cái này là ý kiến sai. Đít-sần thì phải tra nhiều lần mới có hiệu quả. Bài này, nếu làm đúng thì mỗi mặt hàng chỉ tra một lần.
Đến đây thì lòi ra một tiểu xảo nho nhỏ để ghi giá vốn mặt hàng:
- lúc lập mảng đầu ra, lập dư một vài cột để ghi chi tiết mặt hàng sau khi tra mặt hàng.

Chú về Đít-sần:
Tuy là một công cụ dò rất hiệu quả, đít-sần có một nhược điểm là nó không biết cái gọi là thứ tự. Đối với nó, cái nào vào đầu tiên thì là số 1, kế đó là số 2...
Vì vậy, nếu dùng đít-sần để tổng hợp dữ liệu thì cũng đòng thời chấp nhận kết quả sẽ theo thứ tự của bảng chính ban đầu. Và do vậy, thường thường người ta có thêm một đoạn code sort lại theo thứ tự mã hàng hay tên gì đó.

Muốn dạy Excel thì việc đầu tiên là tìm cách làm quen với những người buôn bán thực sự và học cách họ tính toán như thế nào. Đít-sần trong giai đoạn này chỉ dùng để loè học sinh. Trước mắt, cơ quan dạy công thức càng phức tạp, VBA càng huyền bí thì càng có nghĩa là cơ quan ấy không đủ trình độ kiến thức thực tế để dạy căn bản.
 
Upvote 0
Có thể dùng 1 dic như sau, đầu tiên duyệt mảng và nạp dic ở sheet Tổng hợp với key là mã hàng còn item là số thứ tự như mình đã nêu ở bài 4, nhập thêm mã hàng vào cột tiền vốn, chưa nhập lợi nhuận.
Vòng lặp 2 duyệt mảng mã hàng, sửa item ứng với key thành giá vốn, nếu mã hàng không có trong keys thì bỏ qua. Nên có biến đếm để kiểm tra nếu sửa đủ key rồi thì kết thúc lặp luôn (hữu ích khi có nhiều mã hàng không sử dụng).
Vòng lặp 3 duyệt mảng kết quả, thay cột tiền vốn = số lượng nhân giá vốn, giá vốn ở đây là item ứng với key là mã hàng đã lưu ở cột tiền vốn, tính toán lợi nhuận để ghi vào cột cuối.
 
Upvote 0
Code (đại khái)

' a là mảng đầu vào
' b là mảng đầu ra
' mhRg Range chứa dữ liệu mã hàng
' dlHang là mảng chứa dữ liệu hàng

Redim b(1 To UBound(a), 1 To 9) ' cột thứ 9 chứa dữ liệu tính toán, sẽ không chép ra
For i = 1 To UBound(a)
ma = a(i, 1)
If Dic.Exists(ma) Then
' cọng đòn vào dòng có sẵn
CongDon b, Dic(ma), a, i
Else
' chép dòng mới vào b, và Dic
rowb = rowb + 1
Dic.Add ma, rowb ' ghi vào dic
DongMoi b, rowb, a, i, dlHang(Application.Match(ma, mhRg, 1), 5)
End If
Next i
Range(destination).Resize(rowb, 8) = b

Sub CongDon(b(), rowb As Long, a(), rowa As Long)
b(rowb, 4) = b(rowb, 4) + a(rowa, 7) ' số lượng
b(rowb, 5) = b(rowb, 5) + a(rowa, 9) ' chiét khấu
b(rowb, 6) = b(rowb, 6) + a(rowa, 11) ' thành tiền
b(rowb, 7) = b(rowb, 4) * b(rowb, 9) ' giá vốn
b(rowb, 8) = b(rowb, 6) - b(rowb, 7) ' lãi
End Sub

Sub DongMoi(b(), rowb As Long, a(), rowa As Long, giavon As Double)
' ghi vào dòng đầu ra
b(rowb, 1) = rowb ' số thứ tự
b(rowb, 2) = a(rows, 5) ' tên hàng
b(rowb, 3) = a(rows, 6) ' đơn vị
b(rowb, 9) = giavon
CongDon b, rowb, a, rowa ' cọng dồn cột 4, 5, 6, 7, 8
End Sub
 
Upvote 0
Code (đại khái)

' a là mảng đầu vào
' b là mảng đầu ra
' mhRg Range chứa dữ liệu mã hàng
' dlHang là mảng chứa dữ liệu hàng

Redim b(1 To UBound(a), 1 To 9) ' cột thứ 9 chứa dữ liệu tính toán, sẽ không chép ra
For i = 1 To UBound(a)
ma = a(i, 1)
If Dic.Exists(ma) Then
' cọng đòn vào dòng có sẵn
CongDon b, Dic(ma), a, i
Else
' chép dòng mới vào b, và Dic
rowb = rowb + 1
Dic.Add ma, rowb ' ghi vào dic
DongMoi b, rowb, a, i, dlHang(Application.Match(ma, mhRg, 1), 5)
End If
Next i
Range(destination).Resize(rowb, 8) = b

Sub CongDon(b(), rowb As Long, a(), rowa As Long)
b(rowb, 4) = b(rowb, 4) + a(rowa, 7) ' số lượng
b(rowb, 5) = b(rowb, 5) + a(rowa, 9) ' chiét khấu
b(rowb, 6) = b(rowb, 6) + a(rowa, 11) ' thành tiền
b(rowb, 7) = b(rowb, 4) * b(rowb, 9) ' giá vốn
b(rowb, 8) = b(rowb, 6) - b(rowb, 7) ' lãi
End Sub

Sub DongMoi(b(), rowb As Long, a(), rowa As Long, giavon As Double)
' ghi vào dòng đầu ra
b(rowb, 1) = rowb ' số thứ tự
b(rowb, 2) = a(rows, 5) ' tên hàng
b(rowb, 3) = a(rows, 6) ' đơn vị
b(rowb, 9) = giavon
CongDon b, rowb, a, rowa ' cọng dồn cột 4, 5, 6, 7, 8
End Sub

Xin chào Bác VetMini,
Cảm ơn Bác đã chỉ dẫn cho con, để con thử code theo cách này xem thế nào.. được đến đâu thì con sẽ đưa lên đây để nhờ Bác và mọi người chỉ dẫn tiếp ạ.Hi vọng sẽ không lên cơn sốt ạ, hic giờ mà sốt chắc là chính quyền xã đến đưa đi cách ly Bác ạ, do đó làm gì cũng phải giữ gìn sức khỏe ạ.
 
Upvote 0
Chào anh chị!
Đầu tiên em có bảng tổng hợp các hóa đơn bán hàng như thế này (sheet THHD):

View attachment 235948

Em muốn làm bảng tổng hợp để biết trong khoảng thời gian nào đó bán được bao nhiêu mặt hàng, và tổng số lượng, Chiết khấu, Thành Tiền, Giá Vốn, Lợi nhuận tương tứng là bao nhiêu, có lọc theo tên Khách Hàng). Nên em tạo ra một sheet như thế này:

View attachment 235949

e có ghi chú cách tính của từng cột, lấy từ sheet THHD, phần tiền vốn là lấy số lượng * đơn giá vốn ở sheet MAHANG.

View attachment 235951

Nhờ anh chị giúp em làm tổng hợp này sử dụng Dictionary . Có thể có nhiều cách để làm ra yêu cầu này, nhưng em đang học để hiểu thêm về dictionary nên anh chị giúp em sử dụng dic càng tốt. Còn không có thì em vẫn muốn học hỏi thêm những cách khác ạ!

Xin cảm ơn anh chị trên GPE!
Bạn thử nhé.
Mã:
Sub layso()
   Dim arr, kq, i As Long, lr As Long, dic As Object, ngaybd As Double, ngaykt As Double, dk As String, ten As String, a As Long, b As Long
   Set dic = CreateObject("scripting.dictionary")
   With Sheets("baocaoxuatkho")
        ngaybd = .Range("D2").Value2
        ngaykt = .Range("D3").Value2
        ten = .Range("h3").Value
   End With
   With Sheets("THHD")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        If lr < 10 Then Exit Sub
        arr = .Range("E10:W" & lr).Value2
        ReDim kq(1 To UBound(arr), 1 To 8)
     If ten = "Full" Then
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
                  dk = arr(i, 3)
                  If Not dic.exists(dk) Then
                     a = a + 1
                     kq(a, 1) = a
                     kq(a, 2) = arr(i, 4)
                     kq(a, 3) = arr(i, 5)
                     kq(a, 4) = arr(i, 6)
                     kq(a, 5) = arr(i, 7)
                     kq(a, 6) = arr(i, 9)
                     dic.Add dk, a
                  Else
                     b = dic.Item(dk)
                     kq(b, 4) = arr(i, 6) + kq(b, 4)
                     kq(b, 5) = arr(i, 7) + kq(b, 5)
                     kq(b, 6) = arr(i, 9) + kq(b, 6)
                  End If
            End If
       Next i
     Else
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
               If ten = arr(i, 19) Then
                  dk = arr(i, 3)
                  If Not dic.exists(dk) Then
                     a = a + 1
                     kq(a, 1) = a
                     kq(a, 2) = arr(i, 4)
                     kq(a, 3) = arr(i, 5)
                     kq(a, 4) = arr(i, 6)
                     kq(a, 5) = arr(i, 7)
                     kq(a, 6) = arr(i, 9)
                     dic.Add dk, a
                  Else
                     b = dic.Item(dk)
                     kq(b, 4) = arr(i, 6) + kq(b, 4)
                     kq(b, 5) = arr(i, 7) + kq(b, 5)
                     kq(b, 6) = arr(i, 9) + kq(b, 6)
                  End If
              End If
           End If
      Next i
    End If
 End With
 With Sheets("mahang")
      lr = .Range("D" & Rows.Count).End(xlUp).Row
      arr = .Range("D9:H" & lr).Value
      For i = 1 To UBound(arr)
          dk = arr(i, 1)
          If dic.exists(dk) Then
             b = dic.Item(dk)
             kq(b, 7) = kq(b, 4) * arr(i, 5)
             kq(b, 8) = kq(b, 6) - kq(b, 7)
          End If
      Next i
End With
 With Sheets("Baocaoxuatkho")
      lr = .Range("C" & Rows.Count).End(xlUp).Row
      If lr > 9 Then .Range("C10:J" & lr).ClearContents
      If a Then .Range("C10:J10").Resize(a).Value = kq
 End With
End Sub
 
Upvote 0
Bạn thử nhé.
Mã:
Sub layso()
...
Code trên có hai đoạn in hệt nhau. Trên nguyên tắc lập trình, đấy là luộm thuộm.

Thực sự đâu có cần phân biệt trường hợp "Full [sic]" hay có tên. ("full" là Tây bồi, đúng tiếng Tây thì phải là "All")
If ten = "All" OR (ten = arr(i, 19)) Then
' ... code gì đó ở đây

Cáh khác để xử lý hai đoạn code in hệt nhau là:

1. cách cấu trúc: lôi đoạn code ra thành sub riêng
- lợi: code rõ ràng, dễ chỉnh, dễ xem.
- bất lợi:
-- gọi sub thì hơi tốn năng lượng 1 chút, cỡ vài phần tỷ hay phần triệu giây, tuỳ theo máy.
-- gọi sub thì phải cho tham số (xem bài #23)

2. cách thượng cổ: lôi đoạn code ra làm sub nội của sub này (gọi bằng lệnh gosub)
sở dĩ tôi dùng từ "thượng cổ" là vì cách này ngày xưa là cách duy nhất để chia subs. Ngày xưa cấu trúc ngôn ngữ BASIC không có sub function riêng biệt. Và "thượng cổ" không có nghĩa là "hết xài"
- lợi:
-- không phải lặp lại code
-- không phải truyền tham số. Sub là sub nội cho nên nó dùng chung biến nội với sub mẹ.
- bất lợi:
-- sub mẹ luôn phải exit sub trước khi bắt đầu code sub nội.
-- sub nội dài quá sẽ khó phân biệt là những biến nào đã bị nó thay đổi trị.
-- một số người cho rằng đây là loại code mỳ Ý (tôi nói một số ngừoi thôi, cho nên đòng ý hay không là quan niệm riêng, và tôi sẽ không tranh cãi điểm này ở đây)

Ví dụ sub nội:

Mã:
Sub Mẹ()
...
    If ten = "Full" Then
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
              GoSub MySubNoi
            End If
       Next i
     Else
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
               If ten = arr(i, 19) Then
                 GoSub MySubNoi
              End If
           End If
      Next i
    End If

' ... code gì đó ở đây

Exit Sub ' lệnh này bắt buộc phải có. Nó tránh code bước vào sub nội

MySubNoi:
     dk = arr(i, 3)
     If Not dic.exists(dk) Then
        a = a + 1
        kq(a, 1) = a
        kq(a, 2) = arr(i, 4)
        kq(a, 3) = arr(i, 5)
        kq(a, 4) = arr(i, 6)
        kq(a, 5) = arr(i, 7)
        kq(a, 6) = arr(i, 9)
        dic.Add dk, a
     Else
        b = dic.Item(dk)
        kq(b, 4) = arr(i, 6) + kq(b, 4)
        kq(b, 5) = arr(i, 7) + kq(b, 5)
        kq(b, 6) = arr(i, 9) + kq(b, 6)
     End If
Return ' lệnh này đưa VBA trở về dòng ngay sau dòng gọi GoSub

End Sub ' end sub mẹ
 
Upvote 0
Code trên có hai đoạn in hệt nhau. Trên nguyên tắc lập trình, đấy là luộm thuộm.

Thực sự đâu có cần phân biệt trường hợp "Full [sic]" hay có tên. ("full" là Tây bồi, đúng tiếng Tây thì phải là "All")
If ten = "All" OR (ten = arr(i, 19)) Then
' ... code gì đó ở đây

Cáh khác để xử lý hai đoạn code in hệt nhau là:

1. cách cấu trúc: lôi đoạn code ra thành sub riêng
- lợi: code rõ ràng, dễ chỉnh, dễ xem.
- bất lợi:
-- gọi sub thì hơi tốn năng lượng 1 chút, cỡ vài phần tỷ hay phần triệu giây, tuỳ theo máy.
-- gọi sub thì phải cho tham số (xem bài #23)

2. cách thượng cổ: lôi đoạn code ra làm sub nội của sub này (gọi bằng lệnh gosub)
sở dĩ tôi dùng từ "thượng cổ" là vì cách này ngày xưa là cách duy nhất để chia subs. Ngày xưa cấu trúc ngôn ngữ BASIC không có sub function riêng biệt. Và "thượng cổ" không có nghĩa là "hết xài"
- lợi:
-- không phải lặp lại code
-- không phải truyền tham số. Sub là sub nội cho nên nó dùng chung biến nội với sub mẹ.
- bất lợi:
-- sub mẹ luôn phải exit sub trước khi bắt đầu code sub nội.
-- sub nội dài quá sẽ khó phân biệt là những biến nào đã bị nó thay đổi trị.
-- một số người cho rằng đây là loại code mỳ Ý (tôi nói một số ngừoi thôi, cho nên đòng ý hay không là quan niệm riêng, và tôi sẽ không tranh cãi điểm này ở đây)

Ví dụ sub nội:

Mã:
Sub Mẹ()
...
    If ten = "Full" Then
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
              GoSub MySubNoi
            End If
       Next i
     Else
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
               If ten = arr(i, 19) Then
                 GoSub MySubNoi
              End If
           End If
      Next i
    End If

' ... code gì đó ở đây

Exit Sub ' lệnh này bắt buộc phải có. Nó tránh code bước vào sub nội

MySubNoi:
     dk = arr(i, 3)
     If Not dic.exists(dk) Then
        a = a + 1
        kq(a, 1) = a
        kq(a, 2) = arr(i, 4)
        kq(a, 3) = arr(i, 5)
        kq(a, 4) = arr(i, 6)
        kq(a, 5) = arr(i, 7)
        kq(a, 6) = arr(i, 9)
        dic.Add dk, a
     Else
        b = dic.Item(dk)
        kq(b, 4) = arr(i, 6) + kq(b, 4)
        kq(b, 5) = arr(i, 7) + kq(b, 5)
        kq(b, 6) = arr(i, 9) + kq(b, 6)
     End If
Return ' lệnh này đưa VBA trở về dòng ngay sau dòng gọi GoSub

End Sub ' end sub mẹ
Cảm ơn anh nhé.
 
Upvote 0
Bạn thử nhé.
Mã:
Sub layso()
   Dim arr, kq, i As Long, lr As Long, dic As Object, ngaybd As Double, ngaykt As Double, dk As String, ten As String, a As Long, b As Long
   Set dic = CreateObject("scripting.dictionary")
   With Sheets("baocaoxuatkho")
        ngaybd = .Range("D2").Value2
        ngaykt = .Range("D3").Value2
        ten = .Range("h3").Value
   End With
   With Sheets("THHD")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        If lr < 10 Then Exit Sub
        arr = .Range("E10:W" & lr).Value2
        ReDim kq(1 To UBound(arr), 1 To 8)
     If ten = "Full" Then
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
                  dk = arr(i, 3)
                  If Not dic.exists(dk) Then
                     a = a + 1
                     kq(a, 1) = a
                     kq(a, 2) = arr(i, 4)
                     kq(a, 3) = arr(i, 5)
                     kq(a, 4) = arr(i, 6)
                     kq(a, 5) = arr(i, 7)
                     kq(a, 6) = arr(i, 9)
                     dic.Add dk, a
                  Else
                     b = dic.Item(dk)
                     kq(b, 4) = arr(i, 6) + kq(b, 4)
                     kq(b, 5) = arr(i, 7) + kq(b, 5)
                     kq(b, 6) = arr(i, 9) + kq(b, 6)
                  End If
            End If
       Next i
     Else
        For i = 1 To UBound(arr)
            If ngaybd <= arr(i, 1) And ngaykt >= arr(i, 1) Then
               If ten = arr(i, 19) Then
                  dk = arr(i, 3)
                  If Not dic.exists(dk) Then
                     a = a + 1
                     kq(a, 1) = a
                     kq(a, 2) = arr(i, 4)
                     kq(a, 3) = arr(i, 5)
                     kq(a, 4) = arr(i, 6)
                     kq(a, 5) = arr(i, 7)
                     kq(a, 6) = arr(i, 9)
                     dic.Add dk, a
                  Else
                     b = dic.Item(dk)
                     kq(b, 4) = arr(i, 6) + kq(b, 4)
                     kq(b, 5) = arr(i, 7) + kq(b, 5)
                     kq(b, 6) = arr(i, 9) + kq(b, 6)
                  End If
              End If
           End If
      Next i
    End If
End With
With Sheets("mahang")
      lr = .Range("D" & Rows.Count).End(xlUp).Row
      arr = .Range("D9:H" & lr).Value
      For i = 1 To UBound(arr)
          dk = arr(i, 1)
          If dic.exists(dk) Then
             b = dic.Item(dk)
             kq(b, 7) = kq(b, 4) * arr(i, 5)
             kq(b, 8) = kq(b, 6) - kq(b, 7)
          End If
      Next i
End With
With Sheets("Baocaoxuatkho")
      lr = .Range("C" & Rows.Count).End(xlUp).Row
      If lr > 9 Then .Range("C10:J" & lr).ClearContents
      If a Then .Range("C10:J10").Resize(a).Value = kq
End With
End Sub
Dùng cấu trúc luận lý gộp 2 đoạn code giống nhau thành 1
If (ten <> "Full")=(ten = arr(i, 19)) Then
 
Upvote 0
Mình xin mạnh dạng góp vài ý từ nhỏ nhất đến chủ bài đăng về thiết kế các trang dữ liệu của bạn.

4. (Cũng trang này) Để tránh nhập trùng lắp như bản trích :

KHÁCH HÀNGĐiện thoạiĐịa chỉGhi chú
A Lâm Làng Dừa03485217 Trần Hưng Đạo P4, Quân 5
A Lâm Làng Dừa03485217 Trần Hưng Đạo P4, Quân 5
A Lâm Làng Dừa03485217 Trần Hưng Đạo P4, Quân 5
A Lâm Làng Dừa03485217 Trần Hưng Đạo P4, Quân 5
A Lâm Làng Dừa03485217 Trần Hưng Đạo P4, Quân 5
Anh Hưng Tân098727223118 Trần Hưng Đạo P4, Quân 5
Anh Hưng Tân098727223118 Trần Hưng Đạo P4, Quân 5
Anh Hưng Tân098727223118 Trần Hưng Đạo P4, Quân 5
Anh Hưng Tân098727223118 Trần Hưng Đạo P4, Quân 5


Tạm thời chỉ là vậy & rất vui nếu được trao đổi tiếp cùng bạn. }}}}} :D }}}}}
Trước mình ko để trùng lặp, nhưng nếu ko trùng lập thì khi mình xuất ra từng Khách Hàng đã mua những Mặt hàng gì thì phần cột Khách hàng bị thiếu mình ko xuất đc, vậy làm sao hả a ?
 
Upvote 0
Trước mình ko để trùng lặp, nhưng nếu ko trùng lập thì khi mình xuất ra từng Khách Hàng đã mua những Mặt hàng gì thì phần cột Khách hàng bị thiếu mình ko xuất đc, vậy làm sao hả a ?
Thay vì trùng cả 4 cột, ta chỉ nhập trùng Mã KH thôi;
Lúc nào cần hiện các trường thì xài VLOOKUP()
 
Upvote 0
Ý mình là: Thay vì nhập 4 cột (trường) [Khách Hàng], [Địa chỉ], [ĐT] & [Ghi chú] Ta chỉ cần nhập trường (cột) [Mã KH] mà thôi.
Tất nhiên chuyện này không liên quan lắm đến kiến thức vế công thức Excel hay VBA cả.
Hì, hì, hi,. . . . :D :D :D
 
Upvote 0
Bài này làm power bi là nhanh nhất. Tạo 2slicer lọc + 2Measure tiền vốn, lợi nhuậnl
 
Upvote 0
Web KT

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

Back
Top Bottom