Tạo hàm tính tổng theo nhiều điều kiện tùy biến

Liên hệ QC

vuminh1601

Thành viên thường trực
Tham gia
7/9/07
Bài viết
336
Được thích
354
Nghề nghiệp
Kế toán
Chào anh chị em. Nhờ mọi người giúp mình tạo cái hàm tính tổng theo nhiều điều kiện tùy biến. như file đính kèm
Mình xin cám ơn
 

File đính kèm

  • tinh tong theo nhieu dieu kien tuy bien.xls
    37 KB · Đọc: 135
Chỉ mới được nạc ra nạc, mỡ ra mỡ thôi

PHP:
Option Explicit
Function YouSum(SumRange As Range, LookUpRange As Range, Optional Crit1 As Variant _
   , Optional Crit2, Optional Crit3)
 Dim WF As Object, Rw1 As Double, Rw2 As Double, Rw3 As Double, Col As Byte
  
 Col = SumRange.Column - LookUpRange.Column
 Set WF = Application.WorksheetFunction
 If IsMissing(Crit1) And IsMissing(Crit2) And IsMissing(Crit3) Then
   YouSum = WF.Sum(SumRange)
 Else
   If Not IsMissing(Crit3) Then _
      Rw3 = LookUpRange.Find(Crit3, , xlFormulas, xlWhole).Offset(, 2).Value
   If Not IsMissing(Crit2) Then _
      Rw2 = LookUpRange.Find(Crit2).Offset(, 2).Value
   If Not IsMissing(Crit1) Then _
      Rw1 = LookUpRange.Find(Crit1).Offset(, Col).Value
   YouSum = Rw1 + Rw2 + Rw3
 End If
End Function

Có nghĩa là các tham số tùy chọn hiện chỉ có thể nhập trị; Chưa thể vừa trị vừa địa chỉ ô chứa dữ liệu

(Tất nhiên nếu ta khai báo kiểu tham số truyền toàn là Ranges thì chuyển lại xíu & cũng OK!)

Những mong giúp được bạn chút đĩnh nào đó.
 
Upvote 0
Cám ơn bạn đã giúp mình rất nhanh. Nhưng hàm của bạn đáp ứng được 3 Crit. Bạn có cách nào để Crit được nhiều như hàm SUMIFS sẵn có của của bác Bil được không?
tại cái tổng mình cần tính, nó yêu cầu khá nhiều điều kiện cho cái biến này. với lại không phải cố định cột A và cột C, Range1 và Range2 có thể thay đổi
Mình thử chép công thức sang cột D thì hàm tính sai ( Như hình kèm theo)
Làm thế nào để hàm thực hiện đúng khi thay đổi 2 mảng Range1 và Range2

Cám ơn bạn nhiều!
 

File đính kèm

  • yousum.jpg
    yousum.jpg
    20.3 KB · Đọc: 215
Lần chỉnh sửa cuối:
Upvote 0
|=> "Mình thử chép công thức sang cột D thì hàm tính sai ( Như hình kèm theo)"

Mình đã trù đến chuyện này thông qua biến Col; Nhưng trong 3 biến, thì mới thay có 1 ký số 2 thành Col; Còn 2 con 2 nữa mình lơ đãng quá; Bạn sửa lại giúp nha.

Mình nghĩ, nếu tra tìm tổng ở nhiều cột khác nhau, thì ta fải ghép nhiều hàm tự tạo lại thôi;

Ví du cú fáp =YouSum(C5:C111,A5:A111,A5,A11,5151) + YouSum(D15:E101,A5:A111,A9,A21,551)
 
Upvote 0
|=> "Mình thử chép công thức sang cột D thì hàm tính sai ( Như hình kèm theo)"

Mình đã trù đến chuyện này thông qua biến Col; Nhưng trong 3 biến, thì mới thay có 1 ký số 2 thành Col; Còn 2 con 2 nữa mình lơ đãng quá; Bạn sửa lại giúp nha.

Mình nghĩ, nếu tra tìm tổng ở nhiều cột khác nhau, thì ta fải ghép nhiều hàm tự tạo lại thôi;

Ví du cú fáp =YouSum(C5:C111,A5:A111,A5,A11,5151) + YouSum(D15:E101,A5:A111,A9,A21,551)

Cám ơn bạn rất nhiều. Mình đã thay biến Col vào là được rồi. Nhưng có điều mình chưa hiểu tại sau đoạn này

Rw3 = LookUpRange.Find(Crit3, , xlFormulas, xlWhole).Offset(, col).Value
và đoạn
Rw2 = LookUpRange.Find(Crit2).Offset(, col).Value

sao lại khác nhau. Bạn chỉ dẫn giúp mình với.

*Hơn nữa hàm SUM của Excel khi dùng trong VBA phải dùng cái này [/QUOTE]Set WF = Application.WorksheetFunction[/QUOTE]
yousum = WF.Sum(SumRange) [/QUOTE] nhưng FIND trong đoạn Code trên không cần phải như thế này
Rw1
= LookUpRange.WF.Find(Crit1).Offset(, col).Value

Không biết câu hỏi của mình có "ngớ ngẩn" không? Tại cái món VBA này mình còn dốt lắm, Rất mong được Bạn nhiệt tình chỉ giáo cho.



 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn vì những vấn đề bạn đưa ra là rất thú vị đó nha!

Rw3 = LookUpRange.Find(Crit3, , xlFormulas, xlWhole).Offset(, col).Value
và đoạn
Rw2 = LookUpRange.Find(Crit2).Offset(, col).Value


Cái này là do sự thông manh của ông B.G. ; Có thể bạn đến fương thức FIND() của bọn mình do HoangDanh làm chủ biên đọc mệt nghỉ!

Đại loại là như thế này: Các tham số của fương thức này nếu không được đưa ra ở lần này, thì VBA sẽ lấy theo quy định các tham số đó ở các lần trước đó gần nhất.

Cho nên, ví dụ ta có dòng lệnh Rw3=. . . . .
thì ta có thể viết Rw3 =
LookUpRange.FindNext(Crit3).Offset(, col).Value
mà fương thức này nó vẫn lấy các tham só xlFormulas & xlWhole để xài trong lần này
(Nhưng chuyện này cần nói thêm, rằng fương thức FINDNEXT() chỉ xài trong macro thôi nha, trong Function thì không báo lỗi nhưng chỉ cho kết quả trong cửa số Immediate lúc trúng lúc trật, còn hàm sẽ trả về là trật lất đó nha! Đừng hỏi tôi tại sao lại vậy, chuyện này chỉ có ông BG & tập đoàn của ông ta trả lời mà thôi)

(2)
Hơn nữa hàm SUM của Excel khi dùng trong VBA phải dùng cái này Set WF = Application.WorksheetFunction
Vì trong VBA cũng có rất nhiều hàm & có những cái trùng về chức năng, cú fáp, . . . với hàm trong Excel; Chắc để dễ fân biệt nên ông í làm zậy đó mà!

Xin fép được nhắc lại lần nữa là mình thấy rất thích thú với câu hỏi/vấn đề của bạn đặt ra!
 
Upvote 0
Cám ơn HYEN17 nhiều nhiều. Trong quá trình vuminh1601 chạy thử nếu còn vấn đề phát sinh lại phiền HYEN17 giúp nhé. Nếu OK thì mình sẽ đóng gói (*.xla) up lên chia sẽ cho ACE ai gặp trường hợp tương tự thì sử dụng.
 
Upvote 0
Web KT
Back
Top Bottom