Excel VBA-错误处理和字符串搜索

Excel VBA-错误处理和字符串搜索,vba,excel,error-handling,Vba,Excel,Error Handling,背景: 我有一个电子表格,它是作为一个条目的形式。有许多输入字段,其中一个单元格中有一个字符串,表示数量的标题及其下方单元格的数量值 只有其中一些字段是必填字段。我正在尝试编写一个宏来循环遍历所有必填字段,并确保存在一个值 重要变量: MandatoryValues=包含必填字段标题的字符串数组 MandatoryCount=必填字段的数量 FindString=作为字符串的字段标题 r=字段标题的行 c=字段标题的列 Check_Value=包含所需值的字段标题下的单元格值 下面是我的代码:

背景:

我有一个电子表格,它是作为一个条目的形式。有许多输入字段,其中一个单元格中有一个字符串,表示数量的标题及其下方单元格的数量值

只有其中一些字段是必填字段。我正在尝试编写一个宏来循环遍历所有必填字段,并确保存在一个值

重要变量:

MandatoryValues=包含必填字段标题的字符串数组

MandatoryCount=必填字段的数量

FindString=作为字符串的字段标题

r=字段标题的行

c=字段标题的列

Check_Value=包含所需值的字段标题下的单元格值

下面是我的代码:

For i = 1 To MandatoryCount
    FindString = MandatoryValues(i - 1)
        With ActiveSheet.UsedRange
            Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            If Not Rng Is Nothing Then
                r = Rng.Row
                c = Rng.Column
                Check_Value = ActiveSheet.Cells(r + 1, c).Value
                data_type = TypeName(Check_Value)

                If data_type = "String" Then
                    If Check_Value = "" Then
                        If MsgBox(FindString & " Not Specified", vbOKOnly, "ERROR") = vbOK Then
                            Exit Sub
                        End If
                    End If
                End If

                If data_type = "Double" Then
                    If Check_Value = "" Then
                        If MsgBox(FindString & " Not Specified", vbOKOnly, "ERROR") = vbOK Then
                            Exit Sub
                        End If
                    End If
                End If

                If data_type = "Date" Then
                    If Check_Value = 0 Then
                        If MsgBox(FindString & " Not Specified", vbOKOnly, "ERROR") = vbOK Then
                            Exit Sub
                        End If
                    End If
                End If

                Else
            End If
        End With
Next i
对于每个循环,我在工作表中的UsedRange中搜索标题,并使用.Find找到其位置。这个很好用。我的问题是,当我逐步遍历代码时,我可以看到FindString、r和c随着每次迭代而变化,但是Check_值总是空的。我觉得这很愚蠢,但我看不见。有什么建议吗

编辑:我已经添加了代码片段

If Not Rng Is Nothing Then
            Address = Rng.Address
            Address_Below = Rng.Offset(1, 0)

地址值在每次迭代中都会更新,并且在工作表中正确地查找字符串并检索范围。但是,下面的地址_变量始终为空。我不知道为什么会这样。有什么想法吗?< /P> < P>假定在<强> MordDealyValue(字符串数组)下面的单元格是<代码> CHECKIOVALUTION/COMPUT>,您应该考虑简化下面的代码(有一些调整):

使用ActiveSheet.UsedRange的

'对于i=1到MandatoryCount
对于MandatoryValues中的每个FindString
'FindString=MandatoryValues(i-1)
Set Rng=.Find(What:=FindString_
之后:=.Cells(.Cells.Count)_
LookIn:=xlValues_
看:=xlother_
搜索顺序:=xlByRows_
SearchDirection:=xlNext_
匹配案例:=假)
'如果发生错误,您可以使用:What:=CStr(FindString)
如果不是,那么Rng什么都不是
'r=Rng.Row
'c=Rng.列
'Check_Value=ActiveSheet.Cells(r+1,c).Value

检查_Value=Rng.Offset(1,0)。Value'忘记了我的声明:Dim FindString作为字符串Dim Rng作为范围Dim r作为Long,c只要Dim MandatoryValues As Variant Dim MandatoryCount As Integer Dim Check\u Value As Variant您应该发布您的帖子,而不是在评论中添加有价值的信息。
Check\u Value
似乎依赖于
ActiveSheet
-您确定运行此代码时预期的工作表处于活动状态吗?为什么使用当您已经有一个与搜索(Rng)匹配的单元格引用时,使用ActiveSheet.Cells。您可以使用Rng.offset(1,0).value只要没有合并的单元格,您获取位于找到的单元格下方的单元格值的方法是正确的。FWIW:您可以跳过r和c变量,并使用它来获取下面单元格的值:
检查\u value=Rng.Offset(1)
。注:使用TypeName函数和将单元格值读入变量值得称赞。FIY,您可以考虑在IF块中使用一些<代码>和和语句来减少冗余代码。谢谢这个改进的代码,它更干净。它似乎在运行,但我的问题仍然存在。它可以在工作表中找到字符串并返回范围,但Check_Value变量始终为空。我一辈子都搞不懂为什么。您可能想使用范围对象,而不是使用它的
.Value
.Text
。你能在
Check_Value=…
行上设置断点[F9]并在即时窗口中手动检查吗?@JustinReiter尝试在一个新的、完全未格式化的工作表上运行你的代码,只需一个强制值。
With ActiveSheet.UsedRange
    'For i = 1 To MandatoryCount
    For Each FindString In MandatoryValues
        'FindString = MandatoryValues(i - 1)
        Set Rng = .Find(What:=FindString, _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False)
        ' If error occurs you may use: What:=CStr(FindString)
        If Not Rng Is Nothing Then
            'r = Rng.Row
            'c = Rng.Column
            'Check_Value = ActiveSheet.Cells(r + 1, c).Value
            Check_Value = Rng.Offset(1, 0).Value ' <-- Remove .Offset() if not checking the cell below it
            'data_type = TypeName(Check_Value)
            Select Case TypeName(Check_Value)
                Case "String", "Double", "Date"
                    If Check_Value = "" Or Check_Value = 0 Then
                        If MsgBox(FindString & " Not Specified", vbOKOnly + vbExclamation, "ERROR") = vbOK Then Exit Sub
                    End If
                Case Else
                    Debug.Print """" & FindString & """ at " & Rng.Address & " is of type " & TypeName(Check_Value)
            End Select
        End If
    'Next i
    Next
End With