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