Vài lời góp ý:Khi làm một vấn đề em có vướng mắc mà chưa làm ra đc. mong mọi người giúp đỡ. có yêu cầu như file đính kèm.
Else
Range("c1").Value = Application.WorksheetFunction.Sum(rng.Offset(, -1))
Sub tinh()
Dim rng As Range
For Each rng In ActiveSheet.Range("b2:b15")
rng.Offset(, -1).Activate
If rng.Value = "dung" Then
Range("c1") = Application.WorksheetFunction.Sum(Range([A2], ActiveCell))
Exit For
Else
Range("c1") = Application.WorksheetFunction.Sum(Range([A2], ActiveCell))
End If
Next
End Sub
Sub tinh()
Dim rng As Range
For Each rng In ActiveSheet.Range("b2:b15")
rng.Offset(, -1).Activate
Range("c1") = Application.WorksheetFunction.Sum(Range([A2], ActiveCell))
If rng.Value = "dung" Then Exit For
Next
End Sub
Anh Dom cho em luôn đoạn code dùng sumif để em học thêm ạ.Theo em thì dùng SumIf thì chắc ăn.
Nếu trường hợp trong vùng điều kiện có nhiều cell dung thì code trên chỉ cộng đến cell đầu tiên rồi thoát, không cộng nữa.
Hix.... Em xin lỗi, Không thể dùng SumIf, do em lẩm cẩm, xem dữ liệu rồi nảy ra ý định đó.Dom nói SumIf, vậy làm thử 1 cái SumIf bằng công thức thường xem? (công thức hoặc VBA, khỏi file)
Còn nhiều hơn 1 "dung" thì không thấy tác giả nói tới.
Sub tinh()
Dim rng As Range, Tmp As Double
For Each rng In ActiveSheet.Range("b1:b15")
Tmp = Tmp + rng.offset(0, -1)
If rng.Value = "dung" Then Exit For
Next
[C1] = Tmp
End Sub
Sub tinh2()
Set Found = Range("b2:b15").Find(What:="dung")
If Not Found Is Nothing Then
Found.Offset(, -1).Activate
[C1] = Application.Sum(Range([A2], ActiveCell))
Else
[C1] = Application.Sum(Range("A2:A15"))
End If
End Sub
Sub tinh()
Dim c As Range
With Range("b2:b16")
Set c = .Find("dung")
If Not c Is Nothing Then
c.Offset(0, -1).Activate
Range("c1") = Application.WorksheetFunction.Sum(Range([A2], ActiveCell))
Else
Range("c1") = Application.WorksheetFunction.Sum(Range("A2:A16"))
End If
End With
End Sub
Function Cong(Rg As Range)
With Application.WorksheetFunction
If .CountIf(Rg.Columns(2), "dung") = 0 Then
Cong = .Sum(Rg.Columns(1))
Else
Cong = .Sum(Rg.Cells(1, 1).Resize(.Match("dung", Rg.Columns(2), 0)))
End If
End With
End Function
Hình như phải vầy chứ sư phụBài trên là 2 code, sau đây 2 code nữa, theo thứ tự cái sau tốt hơn cái trước:
PHP:Sub tinh2() Set Found = Range("b1:b15").Find(What:="dung") If Not Found Is Nothing Then Found.Offset(, -1).Activate [C1] = Application.Sum(Range([A2], ActiveCell.Offset(, -1))) Else [C1] = Application.Sum(Range("A2:A15")) End If End Sub
Public Sub titi()
Dim cl, vung As Range, i As Integer, kq
Set vung = Range("b2:b16")
If Application.WorksheetFunction.CountIf(vung, "dung") > 0 Then
i = Application.WorksheetFunction.Match("dung", vung, 0)
kq = Application.WorksheetFunction.Sum(Range("a2:a" & i + 1))
Else
kq = Application.WorksheetFunction.Sum(Range("a2:a16"))
End If
Range("d1") = kq
End Sub
Hình như phải vầy chứ sư phụ
[C1] = Application.Sum(Range([A2], ActiveCell))
Tuy nhiên, theo em thì dùng MATCH sẽ chắc ăn hơn Find ---> Thử trong trường hợp cột B có 2 giá trị "dung" và chữ "dung" đầu tiên nằm tại B1 thì code sẽ sai ngay
Anh không cần phải COUNTIF đâu!Đang tập tành viết thấy bài này vui, xin góp một cách "bình dân học vụ" bảo đảm bạn Khoavu đọc sẽ hiểu ngay
Kiểm tra kết quả ở D1
Mã:Public Sub titi() Dim cl, vung As Range, i As Integer, kq Set vung = Range("b2:b16") If Application.WorksheetFunction.CountIf(vung, "dung") > 0 Then i = Application.WorksheetFunction.Match("dung", vung, 0) kq = Application.WorksheetFunction.Sum(Range("a2:a" & i + 1)) Else kq = Application.WorksheetFunction.Sum(Range("a2:a16")) End If Range("d1") = kq End Sub
Public Sub titi()
Dim i As Long
On Error Resume Next
With Range("B2:B16")
i = WorksheetFunction.Match("dung", .Cells, 0)
If i = 0 Then i = .Rows.Count
Range("d1") = WorksheetFunction.Sum(Range("a2").Resize(i))
End With
End Sub
Public Sub titi()
Dim cl, vung As Range, i As Integer, kq
Set vung = Range("b2:b16")
On Error Resume Next
i = Application.WorksheetFunction.Match("dung", vung, 0)
If i > 0 Then
kq = Application.WorksheetFunction.Sum(Range("a2:a" & i + 1))
Else
kq = Application.WorksheetFunction.Sum(Range("a2:a16"))
End If
Range("d1") = kq
End Sub
OK đấy! Nhưng khoavu cố gắng giảm bớt các biến nếu có thểthế này sư phụ nhỉ? hôm nay được các sư phụ trao đổi nên thấy vui quá. được học thêm rất nhiều.
Option Explicit
Function TongFor(LookUpRange As Range)
Dim sRng As Range
Set sRng = LookUpRange.Find("dung", , xlFormulas, xlWhole)
With Application.WorksheetFunction
If Not sRng Is Nothing Then
TongFor = .Sum(LookUpRange.Cells(1, 1).Offset(, -1).Resize(sRng.Row - 1))
Else
TongFor = .Sum(LookUpRange.Offset(, -1))
End If
End With
End Function
Mới đi Bình Dương về, tưng tưngOK đấy! Nhưng khoavu cố gắng giảm bớt các biến nếu có thể
Cứ tưởng tượng code có vài chục biến, khi kiểm tra cũng thấy rối mắt
Chơi kiểu kq = Application.WorksheetFunction.Sum(Range("a2:a" & i + 1)) này rất dở ---> Lở như ta tính từ A3 trở đi thì chẳng lẽ bạn phải sửa code thành kq = Application.WorksheetFunction.Sum(Range("a2:a" & i + 2)) sao? ---> Dùng Resize như tôi làm ở trên sẽ tổng quát hơn
Public Sub titi()
Dim vung As Range
Set vung = Range("a2:b16")
With Application.WorksheetFunction
If .CountIf(vung, "dung") = 0 Then
Sheet1.[d1] = .Sum(vung.Columns(1))
Else
Sheet1.[d1] = .Sum(vung.Cells(1, 1).Resize(.Match("dung", vung.Columns(2), 0)))
End If: End With: Set vung = Nothing
End Sub