Cách viết hàm tính tổng bỏ qua giá trị lỗi (4 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Tôi có code VBA như sau: (code này vẫn chạy đúng khi các giá trị không có chứa giá trị lỗi)
Tong= Tong+ (Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value)


Nhưng bây giờ Tôi muốn trong trường hợp các giá trị lỗi thì tôi phải viết lại như nào mới đúng?
Tôi đã thử viết như này nhưng báo lỗi. Xin hãy giúp tôi ! Cảm ơn diễn đàn !

Tong= Tong+ Application.WorksheetFunction.IsError((Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value), 0)
 
Tôi có code VBA như sau: (code này vẫn chạy đúng khi các giá trị không có chứa giá trị lỗi)
Tong= Tong+ (Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value)


Nhưng bây giờ Tôi muốn trong trường hợp các giá trị lỗi thì tôi phải viết lại như nào mới đúng?
Tôi đã thử viết như này nhưng báo lỗi. Xin hãy giúp tôi ! Cảm ơn diễn đàn !

Tong= Tong+ Application.WorksheetFunction.IsError((Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value), 0)
bạn thử thay iserror bằng iferror
 
Tôi có code VBA như sau: (code này vẫn chạy đúng khi các giá trị không có chứa giá trị lỗi)
Tong= Tong+ (Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value)


Nhưng bây giờ Tôi muốn trong trường hợp các giá trị lỗi thì tôi phải viết lại như nào mới đúng?
Tôi đã thử viết như này nhưng báo lỗi. Xin hãy giúp tôi ! Cảm ơn diễn đàn !

Tong= Tong+ Application.WorksheetFunction.IsError((Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value), 0)
Đọc code mà hiểu được lỗi cụ thể có lẽ là "dân chuyên".
Có code, có file, chạy thử, xuất hiện lỗi, rồi tìm cách bẫy lỗi mới hy vọng các thành viên "cà lơ phất phơ" xía vào được.
 
Bạn thử cách này xem được không. Không file thì mình cũng không kiểm tra được đúng sai.
dk=(Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value)
if IsNumeric(dk)=false then
dk=0
Tong=tong + dk
end if
 
Đọc code mà hiểu được lỗi cụ thể có lẽ là "dân chuyên".
Có code, có file, chạy thử, xuất hiện lỗi, rồi tìm cách bẫy lỗi mới hy vọng các thành viên "cà lơ phất phơ" xía vào được.
Thay hàm đồng nghĩa với việc bản phải thay đổi cấu trúc câu lệnh theo cấu trúc của hàm, chứ bạn thay mỗi cái tên hàm thì báo lỗi này là đúng rồi!
 
Thay hàm đồng nghĩa với việc bản phải thay đổi cấu trúc câu lệnh theo cấu trúc của hàm, chứ bạn thay mỗi cái tên hàm thì báo lỗi này là đúng rồi!
Tong= Tong+ Application.WorksheetFunction.iferror((Sheets("so sanh").Range("L" & i).Value),0)
Mình không hiểu nhiều về VBA, Mong bạn giúp mình sửa lại câu lệnh trên để khi gặp giá trị lỗi thì làm cho VBA xem nó =0. Sheets("so sanh").Range("L" & i).Value =0.
 
Tong= Tong+ Application.WorksheetFunction.iferror((Sheets("so sanh").Range("L" & i).Value),0)
Mình không hiểu nhiều về VBA, Mong bạn giúp mình sửa lại câu lệnh trên để khi gặp giá trị lỗi thì làm cho VBA xem nó =0. Sheets("so sanh").Range("L" & i).Value =0.
Bạn thử nhé, đoạn code này đã test ok
PHP:
Sub Test()
Dim Sh As Worksheet, Tong, i
Set Sh = Worksheets("so sanh")
i = 1
Tong = Tong + Application.WorksheetFunction.IfError(Sh.Cells(i, 12).Value * Sh.Cells(i, 13).Value * Sh.Cells(i, 16).Value * Sh.Cells(i, 17).Value, 0)
MsgBox Tong
End Sub
 
Đơn giản thôi mà!
Mã:
Function SumVBA(ByVal SumRange As Range) As Double
    On Error Resume Next
    Dim rng As Range
    For Each rng In SumRange
        SumVBA = SumVBA + rng.Value
    Next
End Function
 
Đơn giản nhưng nguy hiểm bác ạ! Bạn ấy không rành mà error là next thì nguy lắm!
Ủa gì đâu mà không rành hay nguy hiểm? VBA lại lồng vào hàm của Excel, không rành VBA mà lồng vào đó mới là nguy hiểm.
Cứ làm sẵn 1 hàm rồi trong thủ tục muốn SUM range nào thì chỉ cần thêm câu lệnh:
KetQua = SumVBA(Range("A1:A50"))
Thế là xong chứ lỗi gì mà nguy hiểm?
 
Làm thử trong trường hợp của bạn đó này nhé. Quá đơn giản, đừng làm cho nó phức tạp vụ ra.

Mã:
Sub Test()
    Dim i As Long
    Dim Tong As Double
    Dim shSoSanh As Worksheet
    Set shSoSanh = Sheets("so sanh")
    On Error Resume Next
    With shSoSanh
        For i = 1 To 10
            Tong = Tong + (.Range("L" & i).Value) * (.Range("M" & i).Value) * (.Range("P" & i).Value) * (.Range("Q" & i).Value)
        Next
        .Range("S12").Value = Tong
    End With
End Sub
 
Mình thiết kế trang tính vầy:

CamChanhDừaChuối
1​
2​
3​
4​
5​
6​
#DIV/0!​
7​
9​
GPE​
10​
11​

& thử chạy macro sau:

PHP:
Sub TongCong()
 Dim Tong As Double, J As Long
 On Error GoTo LoiCT
 For J = 2 To 4
1    Tong = Tong + Cells(J, "L").Value
2    Tong = Tong + Cells(J, "M").Value
3    Tong = Tong + Cells(J, "P").Value
4    Tong = Tong + Cells(J, "Q").Value
    MsgBox Tong
 Next J
Err_:               Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Erl, , Err
        Resume Err_
    End If
End Sub
 
Lần chỉnh sửa cuối:
Mình thiết kế trang tính vầy:

CamChanhDừaChuối
1​
2​
3​
4​
5​
6​
#DIV/0!​
7​
9​
GPE​
10​
11​

& thử chạy macro sau:

PHP:
Sub TongCong()
 Dim Tong As Double, J As Long
 On Error GoTo LoiCT
 For J = 2 To 4
1    Tong = Tong + Cells(J, "L").Value
2    Tong = Tong + Cells(J, "M").Value
3    Tong = Tong + Cells(J, "P").Value
4    Tong = Tong + Cells(J, "Q").Value
    MsgBox Tong
 Next J
Err_:               Exit Sub
LoiCT:
    If Err = 13 Then
        Resume Next
    Else
        MsgBox Erl, , Err
        Resume Err_
    End If
End Sub
Bài toán của chủ thớt là tổng của các phép nhân vì thế không phải tách ra từng đối tượng vậy đâu bác. Vì trong phép nhân (trong trường hợp này có 4 tham số) nếu một trong các tham số bị lỗi thì nó mặc nhiên là lỗi cả phép tính trên một hàng, cho nên phải bỏ qua hàng này để tính hàng khác, còn tính tổng như bác là hình như vẫn cộng các tham số còn lại vậy chưa chuẩn đâu ạ.
 
Có thấy mặt mũi file của chủ bài đăng đâu mà biết; Mình chỉ đưa ra cách để vượt qua ô lỗi mà thôi; Chủ bài đăng vận dụng được thì tốt, bằng không lại thảo luận tiếp. (Covid19 tạo ra nhiều rảnh rỗi & nông nổi mà!)

Chúc mọi người khỏe nhiều nha;
& chúý là trong vùng ví dụ có công thức như =5>6 hay =6>5 thì Excel tài lanh vẫn cộng hay trừ đó nha!
 
Lần chỉnh sửa cuối:
Có thấy mặt mũi file của chủ bài đăng đâu mà biết; Mình chỉ đưa ra cách để vượt qua ô lỗi mà thôi; Chủ bài đăng vận dụng được thì tốt, bằng không lại thảo luận tiếp. (Covid19 tạo ra nhiều rảnh rỗi & nông nổi mà!)

Chúc mọi người khỏe nhiều nha;
& chúý là trong vùng ví dụ có công thức như =5>6 hay =6>5 thì Excel tài lanh vẫn cộng hay trừ đó nha!
Từ câu này của chủ thớt:
Mã:
Tong= Tong+ (Sheets("so sanh").Range("L" & i).Value) * (Sheets("so sanh").Range("M" & i).Value) * (Sheets("so sanh").Range("P" & i).Value) * (Sheets("so sanh").Range("Q" & i).Value)
Thì mình cũng hiểu là tổng của các phép nhân rồi mà bác Sa?
 
Nếu chủ bài đăng không cần biết hàng nào đang có ô hay cụm của 4 ô đang sai thì cách của Nghĩa là OK rồi;
. . . . .
 
Lỗi Type Mismatch là do 1 trong các số hạng nhân với nhau không phải số: là text, là NA#, là #REF, ....
Giả sử lỗi dữ liệu thì cần phải biết dữ liệu lỗi ở dòng nào để sửa, Resume next ra kết quả Sum không hết các dòng, không đúng, là hậu quả đầu tiên
 
Lần chỉnh sửa cuối:
Có những trường hợp lỗi chia cho 0 (#DIV/0!) thường xảy ra với các công thức làm trước và trong trường hợp này tác giả muốn lờ đi như bài #1 đã yêu cầu nếu không đã không sử dụng IFERROR nên tác giả cũng lường trước sẽ bỏ qua hàng này và tác giả muốn xử lý nó để nó tiếp tục cộng các hàng khác cho nên chả có gì phải "lo bò trắng răng" cả!
 
Có những trường hợp lỗi chia cho 0 (#DIV/0!) thường xảy ra với các công thức làm trước và trong trường hợp này tác giả muốn lờ đi như bài #1 đã yêu cầu nếu không đã không sử dụng IFERROR nên tác giả cũng lường trước sẽ bỏ qua hàng này và tác giả muốn xử lý nó để nó tiếp tục cộng các hàng khác cho nên chả có gì phải "lo bò trắng răng" cả!
Trong chủ đề này có đến mấy người nói đến hậu quả của Resume next. Hậu quả là tất yếu, chấp nhận là việc của chủ chủ đề, nêu ra là việc của người nêu ra. Đừng xúc phạm người nêu ra là "lo bò trắng răng".
 
Web KT

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

Back
Top Bottom