[Hỏi] cách kiểm tra kết quả Đúng hoặc Sai của 1 Function. (1 người xem)

Liên hệ QC

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

phucbugis

Thành viên tích cực
Tham gia
22/6/13
Bài viết
1,270
Được thích
981
Xin chào các anh chị trong GPE,

em có đoạn code sau dùng để kiểm tra kết quả đúng hoặc sai trước khi thực hiện lệnh xoá hoặc update số liệu, cụ thể là:

trong Module1:
Mã:
Option Explicit
Sub [B]clear_solieu[/B]()
Dim Arr As Range: Set Arr = Range("C5:O15")
    If [COLOR=#ff0000][B]CheckF(Arr) = 1[/B][/COLOR] Then
        MsgBox ("Ko chinh sua vao vung co chua cong thuc."), vbExclamation, "Kiem tra lai (Sub clear_solieu)"
        Exit Sub
    End If
    
    MsgBox "passed + Run clear_solieu", vbInformation
End Sub

trong Module2:
Mã:
Option Explicit
Function ISFORMULA(cel As Range) As Boolean
    ISFORMULA = cel.HasFormula
End Function


Function [B]CheckF[/B](ArrRange As Range) As Boolean
Dim rngCell As Range
    CheckF = 0
    
    For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then
            'MsgBox ("stop1")
[COLOR=#ff0000][B]            CheckF = 1[/B][/COLOR]
            Exit Function
        End If
    Next rngCell
    
End Function

vấn đề e muốn hỏi là, trong Function CheckF thì e đã cài CheckF = 1 nhưng khi run Sub clear_solieu thì nó lại ko nhận được giá trị này? và làm sao để sửa lại cho đúng.

Link: https://www.mediafire.com/?z235deczgclnql4

mong được giải đáp từ mọi người, e cảm ơn !
 
Lần chỉnh sửa cuối:
Xin chào các anh chị trong GPE,

em có đoạn code sau dùng để kiểm tra kết quả đúng hoặc sai trước khi thực hiện lệnh xoá hoặc update số liệu, cụ thể là:

trong Module1:
Mã:
Option Explicit
Sub [B]clear_solieu[/B]()
Dim Arr As Range: Set Arr = Range("C5:O15")
    If [COLOR=#ff0000][B]CheckF(Arr) = 1[/B][/COLOR] Then
        MsgBox ("Ko chinh sua vao vung co chua cong thuc."), vbExclamation, "Kiem tra lai (Sub clear_solieu)"
        Exit Sub
    End If
    
    MsgBox "passed + Run clear_solieu", vbInformation
End Sub

trong Module2:
Mã:
Option Explicit
Function ISFORMULA(cel As Range) As Boolean
    ISFORMULA = cel.HasFormula
End Function


Function [B]CheckF[/B](ArrRange As Range) As Boolean
Dim rngCell As Range
    CheckF = 0
    
    For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then
            'MsgBox ("stop1")
[COLOR=#ff0000][B]            CheckF = 1[/B][/COLOR]
            Exit Function
        End If
    Next rngCell
    
End Function

vấn đề e muốn hỏi là, trong Function CheckF thì e đã cài CheckF = 1 nhưng khi run Sub clear_solieu thì nó lại ko nhận được giá trị này? và làm sao để sửa lại cho đúng.

mong được giải đáp từ mọi người, e cảm ơn !

Trong VBA hơi bị rắc rối.

1. Nếu b là biến Boolean thì sau khi
Mã:
b = 0

ta sẽ có b = FALSE

Sau khi
Mã:
b = xyz, với xyz bất kỳ <> 0

ta sẽ có b = TRUE

2. Nếu b là biến Boolean và b = TRUE thì b = -1 = TRUE. Với mọi a <> -1 thì b = a = FALSE
Vậy b = 1 = FALSE.

Tóm lại bạn phải có
Mã:
If b = -1 Then
-----------------
Nếu bạn không "trộn lẫn" 2 kiểu Boolean và Long (hàm CheckF trả về Boolean chứ có trả về vd. Long đâu mà thiết lập CheckF = 1?) thì bạn sẽ không phải lăn tăn gì cả

Mã:
Function CheckF(ArrRange As Range) As Boolean
Dim rngCell As Range

    CheckF = [COLOR=#ff0000]FALSE[/COLOR]
    
    For Each rngCell In ArrRange
        If ISFORMULA(rngCell) Then
            'MsgBox ("stop1")
            CheckF = [COLOR=#ff0000]TRUE[/COLOR]
            Exit For
        End If
    Next rngCell
    
End Function

Sub clear_solieu()
Dim Arr As Range
    Set Arr = Range("C5:O15")
    If CheckF(Arr) Then    ' hoac If CheckF(Arr) = TRUE Then
        MsgBox "Ko chinh sua vao vung co chua cong thuc."
    Else
        MsgBox "passed + Run clear_solieu", vbInformation
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bác Siwtom giải thích e hơi khó hiểu, sau khi kiểm tra ---> kết quả đã đúng với yêu cầu của e :-=

e vọc nó cả buổi mà ko ra, cảm ơn Siwtom nhiều nhé! --=0
 
Upvote 0
chào bác Siwtom,

luôn tiện cho e hỏi, nếu muốn kiểm tra đúng hoặc sai của 1 Sub thì phải làm thế nào vậy?
em cũng dùng kiểu True, False nhưng kết quả lại ko ra, mong bác giải thích thêm.
:-=

trường hợp 1: nếu tại
Sub clear_solieu e dùng Call CheckF_m1(Arr) thì kết quả ra đúng.
trường hợp 2: khi e thử tách thành 1 module riêng thì dùng Call CheckF_m2(Arr) ---> kết quả lại sai mặc dù 2 Sub CheckF_m1, CheckF_m2 giống y chang.

trong
Module1:
Mã:
Option Explicit
Public bChk As Boolean

Sub [B]CheckF_m1[/B](ArrRange As Range)
Dim rngCell As Range
For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then GoTo Ketthuc
    Next rngCell
    
    Exit Sub
    
Ketthuc:
    [COLOR=#ff0000]bChk = False[/COLOR]
End Sub

Sub [B]clear_solieu[/B]()
Dim Arr As Range: Set Arr = Range("C5:O15")
    [COLOR=#ff0000]bChk = True[/COLOR]
    Call [COLOR=#ff0000][B]CheckF_m2(Arr)[/B][/COLOR]
    
    If [COLOR=#ff0000]bChk = False[/COLOR] Then
        MsgBox ("Ko chinh sua vao vung co chua cong thuc."), vbExclamation, "Kiem tra lai (Sub clear_solieu)"
        Exit Sub
    End If
    
    MsgBox "passed + run Macro", vbInformation
End Sub

trong Module2:
Mã:
Option Explicit
Public bChk As Boolean

Function ISFORMULA(cel As Range) As Boolean
    ISFORMULA = cel.HasFormula
End Function

Sub [B]CheckF_m2[/B](ArrRange As Range)
Dim rngCell As Range

    For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then GoTo Ketthuc
    Next rngCell
    
    Exit Sub
    
Ketthuc:
[COLOR=#ff0000]    bChk = False[/COLOR]
    'MsgBox ("da~ bChk = False")
End Sub

Link: https://www.mediafire.com/?43jk69maipq90t3
 
Lần chỉnh sửa cuối:
Upvote 0
chào bác Siwtom,

luôn tiện cho e hỏi, nếu muốn kiểm tra đúng hoặc sai của 1 Sub thì phải làm thế nào vậy?
em cũng dùng kiểu True, False nhưng kết quả lại ko ra, mong bác giải thích thêm.
:-=

trường hợp 1: nếu tại
Sub clear_solieu e dùng Call CheckF_m1(Arr) thì kết quả ra đúng.
trường hợp 2: khi e thử tách thành 1 module riêng thì dùng Call CheckF_m2(Arr) ---> kết quả lại sai mặc dù 2 Sub CheckF_m1, CheckF_m2 giống y chang.


He he he.

Trong mỗi module bạn có biến bChk as Boolean

Module1
Mã:
Option Explicit
Public [B][COLOR=#ff0000]bChk[/COLOR][/B] As Boolean 

Sub CheckF_m1(ArrRange As Range)
Dim rngCell As Range
For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then GoTo Ketthuc
    Next rngCell
    
    Exit Sub
    
Ketthuc:
    bChk = False
End Sub

Sub clear_solieu()
Dim Arr As Range: Set Arr = Range("C5:O15")
    bChk = True    <-- (A)
    Call CheckF_m2(Arr)    <-- (B)
    
    If bChk = False Then    <-- (D)
        MsgBox ("Ko chinh sua vao vung co chua cong thuc."), vbExclamation, "Kiem tra lai (Sub clear_solieu)"
        Exit Sub
    End If
    
    MsgBox "passed + run Macro", vbInformation
End Sub

code Module2
Mã:
Option Explicit
Public [B][COLOR=#0000ff]bChk[/COLOR][/B] As Boolean

Function ISFORMULA(cel As Range) As Boolean
    ISFORMULA = cel.HasFormula
End Function

Sub CheckF_m2(ArrRange As Range)
Dim rngCell As Range

    For Each rngCell In ArrRange
        If ISFORMULA(rngCell) = True Then GoTo Ketthuc
    Next rngCell
    
    Exit Sub
    
Ketthuc:
    bChk = False    <-- (C)
    'MsgBox ("da~ bChk = False")
End Sub

Tại dòng (A) bạn thiết lập bChk = TRUE, tức bChk = TRUE (do code đang ở module1) còn bChk = FALSE (mặc định ban đầu)
Tại (B) bạn gọi sub CheckF_m2, hậu quả là tại (C) bạn có bChk = FALSE, nhưng là bChk = FALSE (do code đang ở module2), còn bChk = TRUE (không thay đổi)
Tại (D) bạn kiểm tra bChk, nhưng là kiểm tra bChk vì code đang ở module1. Dĩ nhiên là bChk = TRUE (do thiết lập tại (A). bChk ở module2 thì đúng là = FALSE nhưng ở (D) là kiểm tra bChk thôi.
---------------
Sao lại kỳ cục thế bạn? Nếu bạn muốn biến là Public để dùng trong nhiều module thì được thôi. Nhưng chỉ một biến có tên "như thế như thế" thôi. Tức xóa Public bChk As Boolean ở module1 hoặc module2.
 
Upvote 0
He he he.

Trong mỗi module bạn có biến bChk as Boolean
...
Tại dòng (A) bạn thiết lập bChk = TRUE, tức bChk = TRUE (do code đang ở module1) còn bChk = FALSE (mặc định ban đầu)
Tại (B) bạn gọi sub CheckF_m2, hậu quả là tại (C) bạn có bChk = FALSE, nhưng là bChk = FALSE (do code đang ở module2), còn bChk = TRUE (không thay đổi)
Tại (D) bạn kiểm tra bChk, nhưng là kiểm tra bChk vì code đang ở module1. Dĩ nhiên là bChk = TRUE (do thiết lập tại (A). bChk ở module2 thì đúng là = FALSE nhưng ở (D) là kiểm tra bChk thôi.
---------------
Sao lại kỳ cục thế bạn? Nếu bạn muốn biến là Public để dùng trong nhiều module thì được thôi. Nhưng chỉ một biến có tên "như thế như thế" thôi. Tức xóa Public bChk As Boolean ở module1 hoặc module2.

qua bài phân tích này e đã hiểu rõ hơn về As Boolean, đúng là ko có gì có thể qua mắt được bác. --=0
lại cảm ơn bác Siwtom lần nữa! :-=
Chúc bác và gia đình luôn mạnh khỏe, để cho anh chị e trong GPE được nhờ --=0
 
Upvote 0

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

Back
Top Bottom