Tính tổng theo nhiều điều kiện

Liên hệ QC

hieutk2

Thành viên mới
Tham gia
19/6/15
Bài viết
17
Được thích
1
Chào cả nhà. Mình định tính tổng trong VBA, nhưng đoạn lệnh sau luôn cho kết quả: tong= 0. mong mọi người chỉ dùm cách xử lý với.
Sub tonghop()
Dim tong, ngay
ngay = Range("C1").Value ' ô C1 có số lieu là 03/11/2018
tong = Application.SumIfs(Range("A2:A6"), Range("B2:B6"), ">=" & ngay)
'A2 đến A6 có số lieu lần lượt từ ngày 01/11/2018 đến 05/11/2018); ô B2 đến B6 có số lieu lần lượt là 1; 2; 3; 4; 5
End Sub
 
Chào cả nhà. Mình định tính tổng trong VBA, nhưng đoạn lệnh sau luôn cho kết quả: tong= 0. mong mọi người chỉ dùm cách xử lý với.
Sub tonghop()
Dim tong, ngay
ngay = Range("C1").Value ' ô C1 có số lieu là 03/11/2018
tong = Application.SumIfs(Range("A2:A6"), Range("B2:B6"), ">=" & ngay)
'A2 đến A6 có số lieu lần lượt từ ngày 01/11/2018 đến 05/11/2018); ô B2 đến B6 có số lieu lần lượt là 1; 2; 3; 4; 5
End Sub
Bạn cho cái file lên mình viết code khác luôn cho.
 
Bạn nói rõ nội dung chứ nhìn vào toàn viết tắt mình đọc không hiểu à.Bạn có những gì và cần những gì nhé.
Yêu cầu mình viết trong sheet "xk" đó bạn.
Nội dung thế này:
- file có 4 trang bang tính.
1. trang p.sinh: có số liệu nhập kho, xuất kho hàng hóa của các lần bán trước đây: có các cột Số lượng, mã hàng, mã màu và size; mã tài khoản nợ, tài khoản có….
2. trang DMHH: có danh mục các loại hàng hóa và số lượng ở đầu năm (SLđk) của từng loại hàng
3. trang mau_size: có danh mục các mã màu size: mã mau/size gồm 4 ký tự (2kys tự màu+2 ký tự size; VD: mã "DESL" là màu đen, size L).
4. trang "xk": nhập số liệu xuất kho, khi xuất kho mình muốn kiểm tra xem hàng trong kho có đủ để xuất bán không?.
tức là hôm nay xuất kho thì: số lượng đầu năm + SL đã nhập thêm từ đầu năm đến hôm nay- SL đã xuất từ đầu năm đến hôm nay phải >=0. nếu < 0 là trong kho không đủ hàng xuất---> đưa ra cảnh báo " thiếu hàng".

Mình đã làm code sau:
Sub kiemtraSL_xuat()
Dim i, j, psno(), psco(), masize_kt(), SL(), SLck()
redim psno(1 to …, 1 to …), …..
'ngay_kt= ngày lập phiếu xuất hàng bán

'Gán số liệu cho biến SL(i, j) Số lượng xuất kho của mã hàng i, màu i , size j
' gán mahang_kt(i), masize_kt(i, j)
'.....
'Gán sldk(i, j) tìm và gán số lượng đầu năm của hàng có mã i, màu i, size j - số liệu đang ở trên trang bảng tính "DMHH"
……….

Range("ct_PO_data").Activate 'ct_PO_data: vùng số liệu xuất kho (vùng bảng tính G7:K14)
For i = 1 To n 'n=số dòng số liệu xuất kho , m= số cột số liệu (số size)
For j = 1 To m
psno(i, j) = Application.SumIfs(Range("Số lượng"), Range("TK nợ"), 156, Range("mã hàng"), mahang_kt(i),
Range("mã màu/size"), masize_kt(i, j), Range("ngày ct"), "<=" & ngay_xk
)
'TK nợ=156 là nhập kho; TK có =156 là xuất kho ; ngay_xk= ngày lập phiếu xuất kho hàng hóa
'psno(i,j) được tính dựa vào số liệu trên trang bảng tính "P.sinh"
psco(i, j) = Application.SumIfs(Range("Số lượng"), Range("TK có"), 156, Range("mã hàng"), mahang_kt(i),
Range("mã màu/size"), masize_kt(i, j), Range("ngày ct"), "<=" & ngay_xk)
SLck(i, j) = sldk(i, j) + psno(i, j) - psco(i, j) - SL(i, j) 'tính sô lượng còn trong kho sau khi xuất bán
If SLck(i, j) < 0 Then MsgBox " thiếu hàng xuất kho: " & mahang(i) & "-" & masize_kt(i, j) & "=" & SLck(i, j)
Next j
ActiveCell.Offset(1, 0).Activate
Next i
End Sub

Nhưng code trên tính sai các biến "psno(i,j)" và "psco(i,j)". Nếu không có điều kiện: "Range("ngày ct"), "<=" & ngay_xk" thì nó vẫn tính đúng.
(tính tổng cột số lượng nhưng ngày phải <= ngày xuất bán)
Mình chỉ vướng chỗ này thôi, không hiểu sao khi thêm điều kiện tính tổng này thì nó lại tính sai?
mẫu phiếu xuất kho: các ace giup mình nhé. Thank that nhiều

anh 1.png
 
Lần chỉnh sửa cuối:
Yêu cầu mình viết trong sheet "xk" đó bạn.
Nội dung thế này:
- file có 4 trang bang tính.
1. trang p.sinh: có số liệu nhập kho, xuất kho hàng hóa của các lần bán trước đây: có các cột Số lượng, mã hàng, mã màu và size; mã tài khoản nợ, tài khoản có….
2. trang DMHH: có danh mục các loại hàng hóa và số lượng ở đầu năm (SLđk) của từng loại hàng
3. trang mau_size: có danh mục các mã màu size: mã mau/size gồm 4 ký tự (2kys tự màu+2 ký tự size; VD: mã "DESL" là màu đen, size L).
4. trang "xk": nhập số liệu xuất kho, khi xuất kho mình muốn kiểm tra xem hàng trong kho có đủ để xuất bán không?.
tức là hôm nay xuất kho thì: số lượng đầu năm + SL đã nhập thêm từ đầu năm đến hôm nay- SL đã xuất từ đầu năm đến hôm nay phải >=0. nếu < 0 là trong kho không đủ hàng xuất---> đưa ra cảnh báo " thiếu hàng".

Mình đã làm code sau:
Sub kiemtraSL_xuat()
Dim i, j, psno(), psco(), masize_kt(), SL(), SLck()
redim psno(1 to …, 1 to …), …..
'ngay_kt= ngày lập phiếu xuất hàng bán


'Gán số liệu cho biến SL(i, j) Số lượng xuất kho của mã hàng i, màu i , size j

' gán mahang_kt(i), masize_kt(i, j)

'.....

'Gán sldk(i, j) tìm và gán số lượng đầu năm của hàng có mã i, màu i, size j - số liệu đang ở trên trang bảng tính "DMHH"

……….

Range("ct_PO_data").Activate 'ct_PO_data: vùng số liệu xuất kho (vùng bảng tính G7:K14)
For i = 1 To n 'n=số dòng số liệu xuất kho , m= số cột số liệu (số size)
For j = 1 To m
psno(i, j) = Application.SumIfs(Range("Số lượng"), Range("TK nợ"), 156, Range("mã hàng"), mahang_kt(i),
Range("mã màu/size"), masize_kt(i, j), Range("ngày ct"), "<=" & ngay_xk
)
'TK nợ=156 là nhập kho; TK có =156 là xuất kho ; ngay_xk= ngày lập phiếu xuất kho hàng hóa
'psno(i,j) được tính dựa vào số liệu trên trang bảng tính "P.sinh"
psco(i, j) = Application.SumIfs(Range("Số lượng"), Range("TK có"), 156, Range("mã hàng"), mahang_kt(i),
Range("mã màu/size"), masize_kt(i, j), Range("ngày ct"), "<=" & ngay_xk)
SLck(i, j) = sldk(i, j) + psno(i, j) - psco(i, j) - SL(i, j) 'tính sô lượng còn trong kho sau khi xuất bán
If SLck(i, j) < 0 Then MsgBox " thiếu hàng xuất kho: " & mahang(i) & "-" & masize_kt(i, j) & "=" & SLck(i, j)
Next j
ActiveCell.Offset(1, 0).Activate
Next i
End Sub

Nhưng code trên tính sai các biến "psno(i,j)" và "psco(i,j)". Nếu không có điều kiện: "Range("ngày ct"), "<=" & ngay_xk" thì nó vẫn tính đúng.
(tính tổng cột số lượng nhưng ngày phải <= ngày xuất bán)
Mình chỉ vướng chỗ này thôi, không hiểu sao khi thêm điều kiện tính tổng này thì nó lại tính sai?
mẫu phiếu xuất kho: các ace giup mình nhé. Thank that nhiều

View attachment 209827
Đây bạn xem.Có gì cần chỉnh mình chỉnh sau.Bạn cần đưa số liệu chính sác mình mới test được.Bạn test đi nhé.
 

File đính kèm

Đây bạn xem.Có gì cần chỉnh mình chỉnh sau.Bạn cần đưa số liệu chính sác mình mới test được.Bạn test đi nhé.
chạy chưa chính xác ban ơi. minh không phai dân IT, tự mò mò nên không tự chỉnh được. bạn chỉnh lại dùm mình nhé. Cãm ơn ban nhiều!

file kiểm tra thử
 

File đính kèm

chạy chưa chính xác ban ơi. minh không phai dân IT, tự mò mò nên không tự chỉnh được. bạn chỉnh lại dùm mình nhé. Cãm ơn ban nhiều!

file kiểm tra thử
Bạn thay bằng code này xem thế nào nhé.
Mã:
Sub tinhtong()
Dim arr, arr1
Dim a As Long, b As Long, c As Long, i As Long, j As Long, lr As Long, no As Double
Dim dauky As Double, co As Double, kiemtra As Double
Dim dk As String, ngay As Date
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheets("XK")
    ngay = .Range("C2").Value
End With
With Sheets("DMHH")
     lr = .Range("B" & Rows.Count).End(xlUp).Row
     If lr > 2 Then
        arr = .Range("B3:G" & lr).Value
        For i = 1 To UBound(arr, 1)
            dk = arr(i, 1) & arr(i, 3)
              If dic.exists(dk) = 0 Then
                 dic.Item(dk) = Array(arr(i, 6), 0, 0)
              End If
        Next i
     End If
     Erase arr
End With
With Sheets("P.sinh")
     lr = .Range("b" & Rows.Count).End(xlUp).Row
     If lr > 3 Then
         arr = .Range("A4:i" & lr).Value
         For i = 1 To UBound(arr, 1)
             If arr(i, 4) = 156 And CLng(arr(i, 2)) <= CLng(ngay) Then
                dk = arr(i, 8) & arr(i, 9)
                If dic.exists(dk) = 0 Then
                   dic.Item(dk) = Array(0, arr(i, 6), 0)
                Else
                   dauky = dic.Item(dk)(0)
                   no = dic.Item(dk)(1)
                   co = dic.Item(dk)(2)
                   no = no + arr(i, 6)
                   dic.Item(dk) = Array(dauky, no, co)
                End If
             End If
             If arr(i, 5) = 156 And CLng(arr(i, 2)) <= CLng(ngay) Then
                dk = arr(i, 8) & arr(i, 9)
                If dic.exists(dk) = 0 Then
                   dic.Item(dk) = Array(0, 0, arr(i, 6))
                Else
                   dauky = dic.Item(dk)(0)
                    no = dic.Item(dk)(1)
                    co = dic.Item(dk)(2)
                    co = co + arr(i, 6)
                   dic.Item(dk) = Array(dauky, no, co)
                End If
             End If
         Next i
     End If
     Erase arr
End With
With Sheets("xk")
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    If lr < 7 Then MsgBox "khong co phieu": Exit Sub
    arr = .Range("B6:J" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 4)
    For i = 2 To UBound(arr, 1)
        For j = 6 To 9
            dk = arr(i, 1) & arr(i, 5) & arr(1, j)
            If Len(arr(i, j)) > 0 And IsNumeric(arr(i, j)) = True Then
                If dic.exists(dk) Then
                    dauky = dic.Item(dk)(0)
                    no = dic.Item(dk)(1)
                    co = dic.Item(dk)(2)
                    arr1(i - 1, j - 5) = dauky + no - co - arr(i, j)
                 Else
                    arr1(i - 1, j - 5) = -arr(i, j)
                 End If
           End If
       Next j
   Next i
   .Range("o7").Resize(i - 1, 4).Value = arr1
End With
End Sub
 
Bạn thay bằng code này xem thế nào nhé.
Mã:
Sub tinhtong()
Dim arr, arr1
Dim a As Long, b As Long, c As Long, i As Long, j As Long, lr As Long, no As Double
Dim dauky As Double, co As Double, kiemtra As Double
Dim dk As String, ngay As Date
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheets("XK")
    ngay = .Range("C2").Value
End With
With Sheets("DMHH")
     lr = .Range("B" & Rows.Count).End(xlUp).Row
     If lr > 2 Then
        arr = .Range("B3:G" & lr).Value
        For i = 1 To UBound(arr, 1)
            dk = arr(i, 1) & arr(i, 3)
              If dic.exists(dk) = 0 Then
                 dic.Item(dk) = Array(arr(i, 6), 0, 0)
              End If
        Next i
     End If
     Erase arr
End With
With Sheets("P.sinh")
     lr = .Range("b" & Rows.Count).End(xlUp).Row
     If lr > 3 Then
         arr = .Range("A4:i" & lr).Value
         For i = 1 To UBound(arr, 1)
             If arr(i, 4) = 156 And CLng(arr(i, 2)) <= CLng(ngay) Then
                dk = arr(i, 8) & arr(i, 9)
                If dic.exists(dk) = 0 Then
                   dic.Item(dk) = Array(0, arr(i, 6), 0)
                Else
                   dauky = dic.Item(dk)(0)
                   no = dic.Item(dk)(1)
                   co = dic.Item(dk)(2)
                   no = no + arr(i, 6)
                   dic.Item(dk) = Array(dauky, no, co)
                End If
             End If
             If arr(i, 5) = 156 And CLng(arr(i, 2)) <= CLng(ngay) Then
                dk = arr(i, 8) & arr(i, 9)
                If dic.exists(dk) = 0 Then
                   dic.Item(dk) = Array(0, 0, arr(i, 6))
                Else
                   dauky = dic.Item(dk)(0)
                    no = dic.Item(dk)(1)
                    co = dic.Item(dk)(2)
                    co = co + arr(i, 6)
                   dic.Item(dk) = Array(dauky, no, co)
                End If
             End If
         Next i
     End If
     Erase arr
End With
With Sheets("xk")
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    If lr < 7 Then MsgBox "khong co phieu": Exit Sub
    arr = .Range("B6:J" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 4)
    For i = 2 To UBound(arr, 1)
        For j = 6 To 9
            dk = arr(i, 1) & arr(i, 5) & arr(1, j)
            If Len(arr(i, j)) > 0 And IsNumeric(arr(i, j)) = True Then
                If dic.exists(dk) Then
                    dauky = dic.Item(dk)(0)
                    no = dic.Item(dk)(1)
                    co = dic.Item(dk)(2)
                    arr1(i - 1, j - 5) = dauky + no - co - arr(i, j)
                 Else
                    arr1(i - 1, j - 5) = -arr(i, j)
                 End If
           End If
       Next j
   Next i
   .Range("o7").Resize(i - 1, 4).Value = arr1
End With
End Sub
Chuẩn rồi bạn ơi. Thank ban nhe!!!!!!!
 
Chuẩn rồi bạn ơi. Thank ban nhe!!!!!!!
Nhân tiện nhờ bạn giải thích sao đoạn lệnh này lại tính sai (sử dung hàm sumifs của excel):
…..
Sheets("P.sinh").Select
MsgBox " tong xuât kho = " & WorksheetFunction.SumIfs(Range("F5:F25"), Range("B5:B25"), ">=" & ngay)
...
Kết quả =0 (tổng số lượng nếu ngàyct >= ngay)
 
Web KT

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

Back
Top Bottom