Dò tìm và tính tổng

  • Thread starter Thread starter Cerise
  • Ngày gửi Ngày gửi
Liên hệ QC

Cerise

Thành viên mới
Tham gia
23/11/09
Bài viết
38
Được thích
4
Gửi các thành viên Diễn đàn,
Nhờ anh chị giúp công thức tính tổng tại cột M (sheet ‘Thang’), dữ liệu từ cột H đến cột L, số tiền được quy định trong sheet ‘Muc_Thu’ như trong file đính kèm (công thức hay code đều được).
Chân thành cảm ơn các anh chị.
http://www.mediafire.com/view/o8gbpaslcpm79gh/Book1.xlsx
 
Gửi các thành viên Diễn đàn,
Nhờ anh chị giúp công thức tính tổng tại cột M (sheet ‘Thang’), dữ liệu từ cột H đến cột L, số tiền được quy định trong sheet ‘Muc_Thu’ như trong file đính kèm (công thức hay code đều được).
Chân thành cảm ơn các anh chị.
http://www.mediafire.com/view/o8gbpaslcpm79gh/Book1.xlsx

Bạn dùng Code dưới đây, mục đích chuyển ký tự của tháng về dạng số
PHP:
Sub abc()
    Dim Cll As Range
    Dim vung As Range
    Set vung = Range("H4:L10")
    For Each Cll In vung
        If Cll <> "" And Cll <> "T9" Then Cll = 400
        If Cll <> "" And Cll = "T9" Then Cll = 220
    Next
    Set vung = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Mã:
=SUMPRODUCT(ISNUMBER(MATCH(Muc_Thu!$A$2:$A$11,H4:L4,0))*Muc_Thu!$B$2:$B$11)
 
Mã:
=SUMPRODUCT(ISNUMBER(MATCH(Muc_Thu!$A$2:$A$11,H4:L4,0))*Muc_Thu!$B$2:$B$11)

Thấy cũng đâu cần MATCH gì nhỉ, vầy được rồi:
Mã:
=SUMPRODUCT((H4:L4=Muc_Thu!$A$2:$A$11)*(Muc_Thu!$B$2:$B$11))
hoặc SUMIF + SUMPRODUCT:
Mã:
=SUMPRODUCT(SUMIF(Muc_Thu!$A$2:$A$11,Thang!H4:L4,Muc_Thu!$B$2:$B$11))
 
Lần chỉnh sửa cuối:
Thấy cũng đâu cần MATCH gì nhỉ, vầy được rồi:
Mã:
=SUMPRODUCT((H4:L4=Muc_Thu!$A$2:$A$11)*(Muc_Thu!$B$2:$B$11))
hoặc SUMIF + SUMPRODUCT:
Mã:
=SUMPRODUCT(SUMIF(Muc_Thu!$A$2:$A$11,Thang!H4:L4,Muc_Thu!$B$2:$B$11))

kết quả của
ISNUMBER(MATCH(Muc_Thu!$A$2:$A$11,H4:L4,0)) : 1 mảng 10 phần tử

kết quả của

(H4:L4=Muc_Thu!$A$2:$A$11) : 5 mảng , mỗi mảng 10 phần tử

vậy cách nào phải tính toán nhiều hơn vậy thầy ? mong thầy chỉ giúp
 
kết quả của
ISNUMBER(MATCH(Muc_Thu!$A$2:$A$11,H4:L4,0)) : 1 mảng 10 phần tử

kết quả của

(H4:L4=Muc_Thu!$A$2:$A$11) : 5 mảng , mỗi mảng 10 phần tử

vậy cách nào phải tính toán nhiều hơn vậy thầy ? mong thầy chỉ giúp

Tôi không tính toán nhiều vậy làm chi cho mệt người. Chừng nào gặp bài toán thật sự có nhiều dữ liệu sẽ tính tiếp
Ẹc.. Ẹc..
Ngoài ra, còn SUMIF thì sao? Lựa chọn tùy thích mà
 
Bạn dùng Code dưới đây, mục đích chuyển ký tự của tháng về dạng số
PHP:
Sub abc()
    Dim Cll As Range
    Dim vung As Range
    Set vung = Range("H4:L10")
    For Each Cll In vung
        If Cll <> "" And Cll <> "T9" Then Cll = 400
        If Cll <> "" And Cll = "T9" Then Cll = 220
    Next
    Set vung = Nothing
End Sub

Bác phulien1902 cho tôi hỏi thêm chút, trường hợp học phí các tháng đều khác nhau thì code sửa lại như thế nào, mong bác giúp?
 
Bác phulien1902 cho tôi hỏi thêm chút, trường hợp học phí các tháng đều khác nhau thì code sửa lại như thế nào, mong bác giúp?
Tôi giả sử các tháng có số tiền khác nhau:
Ví dụ: T1=100, T2=200, T3=300......
Vây bạn dùng Code sau nhé:
PHP:
Sub abc2()
 With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
    Dim Cll As Range
    For Each Cll In Sheets("Thang").Range("H4:L24")
        Select Case Cll.Value
        Case Is = "T1"
            Cll = 100
        Case Is = "T2"
            Cll = 200
        Case Is = "T3"
            Cll = 300
        Case Is = "T4"
            Cll = 400
        Case Is = "T5"
            Cll = 500
        Case Is = "T6"
            Cll = 600
        Case Is = "T7"
            Cll = 700
        Case Is = "T8"
            Cll = 800
        Case Is = "T9"
            Cll = 900
        Case Is = "T10"
            Cll = 1000
        Case Is = "T11"
            Cll = 1100
        Case Is = "T12"
            Cll = 1200
        End Select
    Next
     With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub

Tham khảo File đính kèm
 

File đính kèm

Tôi giả sử các tháng có số tiền khác nhau:
Ví dụ: T1=100, T2=200, T3=300......
Vây bạn dùng Code sau nhé:
PHP:
Sub abc2()
 With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.DisplayAlerts = False
End With
    Dim Cll As Range
    For Each Cll In Sheets("Thang").Range("H4:L24")
        Select Case Cll.Value
        Case Is = "T1"
            Cll = 100
        Case Is = "T2"
            Cll = 200
        Case Is = "T3"
            Cll = 300
        Case Is = "T4"
            Cll = 400
        Case Is = "T5"
            Cll = 500
        Case Is = "T6"
            Cll = 600
        Case Is = "T7"
            Cll = 700
        Case Is = "T8"
            Cll = 800
        Case Is = "T9"
            Cll = 900
        Case Is = "T10"
            Cll = 1000
        Case Is = "T11"
            Cll = 1100
        Case Is = "T12"
            Cll = 1200
        End Select
    Next
     With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub

Tham khảo File đính kèm

Chỉ dùng cases khi code còn làm công việc khác. Nếu chỉ thuần tuý gán trị thì người ta dùng 2 array (bnagr dò và trị) cho dễ kiểm soát:

B1 = Array("x1", "x2", "xi3", ...)
B2 = Array(y1, y2, y3, ...)
For i = LBound(B1) To UBound(B1)
If triDo = B1(i) Then triKQ = B2(i)
Next i

Trường hợp đặc thù trên, các trị dò chỉ là Tn thì dễ hơn một chút:
B2 = Array(y1, y2, y3, ...)
triKQ = B2(CInt(Replace(triDo, "T", ""))

Nếu số dò không nhiều thì dùng 2 chuõi và InStr alf cách gọn nhất.

Lưu ý: dùng Array chỉ giúp cho code gọn và uyển chuyển thôi. Nếu nói về độ nhanh thì Select Case tương đối nhanh hơn các cách khác. Trình dịch code thành lệnh labels và goto cho nên rất hữu hiệu.
 
Chỉ dùng cases khi code còn làm công việc khác. Nếu chỉ thuần tuý gán trị thì người ta dùng 2 array (bnagr dò và trị) cho dễ kiểm soát:

B1 = Array("x1", "x2", "xi3", ...)
B2 = Array(y1, y2, y3, ...)
For i = LBound(B1) To UBound(B1)
If triDo = B1(i) Then triKQ = B2(i)
Next i

Trường hợp đặc thù trên, các trị dò chỉ là Tn thì dễ hơn một chút:
B2 = Array(y1, y2, y3, ...)
triKQ = B2(CInt(Replace(triDo, "T", ""))

Nếu số dò không nhiều thì dùng 2 chuõi và InStr alf cách gọn nhất.

Lưu ý: dùng Array chỉ giúp cho code gọn và uyển chuyển thôi. Nếu nói về độ nhanh thì Select Case tương đối nhanh hơn các cách khác. Trình dịch code thành lệnh labels và goto cho nên rất hữu hiệu.

Cảm ơn bác VetMini !
Em rất vui khi được bác góp ý, chỉ bảo và em mong học hỏi được nhiều điều ở bác trong thời gian tới cũng như từ các thành viên khác.
 
Web KT

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

Back
Top Bottom