tính tổng và đếm với nhiều điều kiện

Liên hệ QC

ncicacc

Thành viên mới
Tham gia
27/5/09
Bài viết
17
Được thích
0
Các bạn ơi, mình có bài toán về tính tổng và đếm với nhiều điều kiện sau. Đây là bài toán cũng hơi phức tạp, với các hàm đơn giản mình khôg làm được.
Các bạn giup mình với, nếu có thể viết bằng macro thì tốt vì đây là bài toán động (với rất nhiều bản ghi)

Yêu cầu và đề bài (mô phỏng) có trong file attack
 

File đính kèm

  • TongNgayGanNhat.xls
    15 KB · Đọc: 35
Xong fần đếm, thì đưa fần đếm hẵn!

PHP:
Option Explicit
Function BanThang(MaNV As Range, Optional Thang As Byte)
 Dim Ma As String, sTh As String:               Const CH As String = "."
 Dim Cls As Range, VTr As Byte
 
 Ma = "GPE"
 If IsMissing(Thang) Or Thang = 0 Then Thang = Month(Date)
 For Each Cls In MaNV
   VTr = InStr(Cls.Offset(, 2).Value, CH)
   sTh = Mid(Cls.Offset(, 2).Value, VTr + 1, 2)
   If Right(sTh, 1) = CH Then sTh = Left(sTh, 1)
   If InStr(Ma, Cls.Value) < 1 And CByte(sTh) = Thang And Cls.Offset(, 3) > 0 Then
      BanThang = BanThang + 1
      Ma = Ma & Cls.Value
   End If
 Next Cls
End Function

Cú fáp hàm tại 1 ô trống có thể là: =BanThang(A4:A13)
( hay =BanThang(A4:A13, 10)) để tính cho tháng 10 hiện hành
 
Kết quả bài toán nhu sau.
Mã NV Ngày gần nhất Số tiền
1 001 06.10.2010 8000
2 002 07.10.2010 9000


Tổng 17000


Các bác giúp em với. Đặc biệt là tính được số tiền. Chứ đếm thì em là bằng câu lệnh 1/Countif được rồi.
 
Kết quả bài toán nhu sau.
Mã NV Ngày gần nhất Số tiền
1 001 06.10.2010 8000
2 002 07.10.2010 9000


Tổng 17000


Các bác giúp em với. Đặc biệt là tính được số tiền. Chứ đếm thì em là bằng câu lệnh 1/Countif được rồi.
Trời ạh! Sao lại có vụ ngày gần nhất là ngày 6 và ngày 7 vậy? Bạn phải nói rõ quan niệm "ngày gần nhất" là ngày như thế nào trước đã!
 
Rắc rối ở chỗ dịnh dạng ngày không thông thường

PHP:
Option Explicit
Function TínhTongGànNhát(Ma, Ngày As Range, Optional TTien As Boolean = True) As Variant
 Dim Cls As Range
 Dim Dat As Date, Dat0 As Date
 Dim Jj As Integer
 
 For Jj = 0 To 31
   Dat = Date - Jj:
   If Dat < Dat0 Then
      If TTien = False Then TínhTongGànNhát = Dat0:                  Exit Function
   End If
   For Each Cls In Ngày
      If DateIsText(Cls.Value) < Dat0 Then Exit For
      If Dat = DateIsText(Cls.Value) And Ma = Cls.Offset(, -2).Value And Cls.Offset(, 1) > 0 Then
         Dat0 = Dat
         TínhTongGànNhát = TínhTongGànNhát + Cls.Offset(, 1).Value
      End If
   Next Cls
 Next Jj
 
End Function


PHP:
Function DateIsText(SDat As String) As Date
 Dim VTr As Byte, Ngay As Byte, Thang As Byte, Nam As Integer
 Const Ch As String = "."
 
 VTr = InStr(SDat, Ch):             If VTr < 1 Then Exit Function
 Ngay = CByte(Left(SDat, VTr)):     SDat = Mid(SDat, VTr + 1, 9)
 VTr = InStr(SDat, Ch):             Thang = CByte(Left(SDat, VTr))
 Nam = Mid(SDat, VTr + 1, 4)
 DateIsText = DateSerial(Nam, Thang, Ngay)
End Function
 

File đính kèm

  • GPEvt.rar
    8.9 KB · Đọc: 20
Ngày gần nhất của mỗi nhân viên là ngày lớn nhất của nhân viên đó. Ở đây nhân viên 001 ngày gần nhất là 06.10.2010, còn nhân viên 002 là 07.10.2010. Còn nhân viên 003 thì có số tiền là âm nên không tính.

Cảm ơn bạn SA_DQ. vấn đề ở đây là bài toán mô phỏng, bài toán thực tế dữ liệu rất lớn. Dữ liệu là do kết xuất từ một chương trình nên rất lớn. Và trường Ma NV mình không được biết trước. Do vậy bạn có thể giúp mình viết code đưa ra danh sách Ma NV ở sheet khác, sau đó mình sẽ để hai cột , một cột là Ngày( ngày gần nhất của mỗi NV), một cột là số tiền và dùng function bạn tạo ra để điền dữ liệu vào hai cột này.

Tks bạn rất nhiều1
 
Chỉnh sửa lần cuối bởi điều hành viên:
Hình như bạn đang cần lập danh sách duy nhứt của mã NV từ 1 CSDL

Nếu không fải vậy, bạn cần nói rõ hơn

(Bạn có thể giả lập 1 CSDL gần giống & gồm 1 vài tháng bán hàng được không? - Cỡ gần 5.000 records)

Chờ fàn hồi từ bạn.

Thân ái
 
Gửi Bạn. Đây là data gốc . Mình nói lại yêu cầu cụ thể như sau:
Từ dữ liệu gốc này. Bạn giúp mình xuất ra sheet khác với yêu cầu như sau:
- Chứa đầy đủ các trường như data gốc, có thêm trường số thứ tự
- Liệt kê tất cả ID mà có ngày gần nhất, có trường Prim/Suppl là P, trường Số tiền <0
(Chý ý, cùng một ID có thể có nhiều ngày khác nhau, có thể trường Prim/Suppl là P hay S. Tuy nhiên bài toán yêu cầu mỗi ID chỉ fill ra một trường hợp phải đảm bảo đồng thời 3 điều kiện: Prim/Suppl là P, Số tiền <0 và lấy ngày gần nhất tức là ngày cuối cùng)
 
Sorry bạn, Mình chưa attach file data. Đây là data gốc của mình.
 

File đính kèm

  • Data.rar
    367.4 KB · Đọc: 24
cho mình hỏi xem trong file đính kèm có sử dụng công thức nhưng không thể lọc hết các điều kiện: {nếu D9>=49.5 thì "P", nếu D9<49.5 thì "T", nếu D9=I thì "I"} . trong sheet2 mình đã có sử dụng công thức các bạn chỉ dẫn nhưng nếu lọc được "P' và "T" thì không được "I'" nhưng nếu được "T" và "I" thì không được "P".... . Cho mình hỏi luôn COLUMN()-8,0 nghĩa là gì nhỉ? tại sao lại -8? và công thức trong sheet 2 lại không thể lọc hết được đúng yêu cầu trên?
 

File đính kèm

  • luong.xlsx
    24.2 KB · Đọc: 12
Web KT
Back
Top Bottom