Cách viết hàm tính tổng bỏ qua giá trị lỗi (1 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".
 
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".
Đừng quy chụp câu thành ngữ ngàn năm nay, câu đó chỉ có ý là lo lắng thái quá việc không cần thiết thôi, chẳng ai xúc phạm gì cả!
 
Vậy là On Error Resume Next có thể được hiểu là áo giấy đi kèm con ma;
Còn câu lệnh On Error Goto LoiCT là áo cà sa của thầy cúng!

/-(A, HA, Ha, ha,. . . . . . .
 
Tại sao bài 10 và bài của tôi đều cảnh báo "nguy hiểm" và hậu quả", mà khi tôi viết ra thì bảo tôi lo bò trắng răng?
Đa số người dùng Excel không tuân thủ việc tổ chức dữ liệu, trong trường hợp này là lỗi Type Mismatch. Lỗi này xảy ra khi dữ liệu không phải số mà cố tính toán, chẳng hạn như text và giá trị lỗi.
Nếu công thức trả về là chuỗi rỗng (là text), thì nên sửa công thức trả về 0 (trong cột giá trị số). Nếu công thức trả về lỗi bất kỳ lỗi nào, cũng nên trả về 0. Như vậy thì dùng bất kỳ tính năng nào của excel: công thức nhân, công thức sum, pivot table, query, VBA, ... cũng không phải bắt lỗi
Người mới học mà chỉ dẫn cho dùng Resume next, sẽ thành thói quen và hậu quả sẽ lớn hơn khi xài tràn lan. Tầm nhìn ngắn mới không thấy được những chuyện ấy.
 
Trong bài này, có 3 phép nhân, 4 tham số, chỉ cần 1 tham số là 0 thôi thì kết quà là 0, tương tự chỉ 1 tham số bị lỗi thì kết quả cũng vô nghĩa, vậy nên xét từng phần tử làm gì khi các giá trị/lỗi đó được lường trước? Tùy vào mức độ tương đối và tuyệt đối người ta có thể xét nét hoặc lờ đi. Nhưng tôi dám chắc trong trường hợp này tác giả đang muốn bỏ qua lỗi. Mà thôi, để tác giả vô rồi tính tiếp.
 
Trong bài này, có 3 phép nhân, 4 tham số, chỉ cần 1 tham số là 0 thôi thì kết quà là 0, tương tự chỉ 1 tham số bị lỗi thì kết quả cũng vô nghĩa, vậy nên xét từng phần tử làm gì khi các giá trị/lỗi đó được lường trước? Tùy vào mức độ tương đối và tuyệt đối người ta có thể xét nét hoặc lờ đi. Nhưng tôi dám chắc trong trường hợp này tác giả đang muốn bỏ qua lỗi. Mà thôi, để tác giả vô rồi tính tiếp.
Chưa chắc là lỗi "đã lường trước"
Tôi muốn hướng dẫn không "bỏ qua lỗi" mà là xử lý cho không có lỗi để phải bỏ qua. Tất nhiên là tuỳ người muốn tiếp thu hay không, người đọc có đầu óc hay không
 
Trong bài này, có 3 phép nhân, 4 tham số, chỉ cần 1 tham số là 0 thôi thì kết quà là 0, tương tự chỉ 1 tham số bị lỗi thì kết quả cũng vô nghĩa, vậy nên xét từng phần tử làm gì khi các giá trị/lỗi đó được lường trước? Tùy vào mức độ tương đối và tuyệt đối người ta có thể xét nét hoặc lờ đi. Nhưng tôi dám chắc trong trường hợp này tác giả đang muốn bỏ qua lỗi. Mà thôi, để tác giả vô rồi tính tiếp.
Cảm ơn mọi người đã nhiệt tình chỉ dẫn, thành thật mình đã lớn tuổi rồi tự mầy mò học gặp rất nhiều khó khăn may có diễn đàn là nơi tranh luận để làm rõ vấn đề hơn. Hiện tại thì mình chỉ thấy cách đơn giản để giải quyết được bài toán trước mắt, Hi vọng sẽ học hỏi để hiểu nhiều hơn. Trước mắt mình thấy cách này của bạn mình dùng ổn, Hi vọng không bị phát sinh những lỗi ngoài dự kiến của mình! Cảm ơn bạn rất nhiều !
Bài đã được tự động gộp:

Chưa chắc là lỗi "đã lường trước"
Tôi muốn hướng dẫn không "bỏ qua lỗi" mà là xử lý cho không có lỗi để phải bỏ qua. Tất nhiên là tuỳ người muốn tiếp thu hay không, người đọc có đầu óc hay không
Cảm ơn bạn đã giúp mình hiểu thêm vấn đề, Hiện tại mình mới lên sẽ tạm thời sử dụng những cách đơn giản để giải quyết tạm bài toán hi vọng sau này sẽ hiểu sâu hơn !
 

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

Back
Top Bottom