Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 运行时错误91-使用文本框中的Range.Find和String时_Vba_Excel - Fatal编程技术网

Vba 运行时错误91-使用文本框中的Range.Find和String时

Vba 运行时错误91-使用文本框中的Range.Find和String时,vba,excel,Vba,Excel,我正面临一个我试图创建的函数的问题 该函数应执行以下操作: -询问价值观 -如果值在B:B列中存在或不存在,则返回True或False 这就是我目前所拥有的 Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim Ret As Boolean Dim FindText As String If KeyCode = 13 Then With Sheets

我正面临一个我试图创建的函数的问题

该函数应执行以下操作: -询问价值观 -如果值在B:B列中存在或不存在,则返回True或False

这就是我目前所拥有的

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Ret As Boolean
Dim FindText As String
If KeyCode = 13 Then
    With Sheets("Dados")
        Columns("B:B").Select
        FindText = TextBox1.Text
        Ret = Selection.Find(What:=FindText, After:=.Cells(1, 1), LookIn:=xlValues, LookAt _
        :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _
        :=False, SearchFormat:=False).Activate
        MsgBox "Hy " & FindText & " > " & Ret
        If FindText Is Nothing Then Exit Sub
    End With
End If End Sub

当该值为true时,这非常有效,但如果该值为false,则会给出
运行时错误91-对象变量或未设置With block variable
:(

FindText是一个字符串变量,而不是对象变量。只有对象可以设置为空或值为空。因此,当执行False时,它正在查找对象,因为它没有设置,所以会抛出错误

您甚至不需要代码行,因为它会在进入选择后进行计算。您需要在进行检查之前验证数据,所以可以试试这个

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim Ret As Boolean
    Dim FindText As String

    If Len(TextBox1.Text & vbNullString) = 0 Then Exit Sub

    If KeyCode = 13 Then
        With Sheets("Dados")
            Columns("B:B").Select
            FindText = TextBox1.Text
            Ret = Selection.Find(What:=FindText, _
                                 After:=.Cells(1, 1), _
                                 LookIn:=xlValues, _
                                 LookAt:=xlWhole, _
                                 SearchOrder:=xlByColumns, _
                                 SearchDirection:=xlNext, _
                                 MatchCase:=False, _
                                 SearchFormat:=False).Activate
            MsgBox "Hy " & FindText & " > " & Ret
        End With
    End If 

End Sub
首先。其次,您在
之前缺少一个句点,以便用引用您的

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim Ret As Boolean
Dim FindText As String
If KeyCode = 13 Then
    If TextBox1.Text = "" Then Exit Sub
    FindText = TextBox1.Text
    With Sheets("Dados")
        If .Columns("B:B").Find(What:=FindText, After:=.Cells(1, 1), LookIn:=xlValues, LookAt_
            :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase_
            :=False, SearchFormat:=False) is Nothing Then
            Ret = False
        Else
            Ret = True
        End If
    End With
    MsgBox "Hy " & FindText & " > " & Ret
End If
End Sub

您在
列前面缺少了一个句点
…此外,可以使用
中拉出
查找
,我理解您在@Chrismas007中的否决票,但代码的行为与使用.Columns和just Columns完全相同。明确表示它们是好的,但这不是导致错误的原因!我的否决票我更倾向于
Select
,因为我非常强烈地反对它(尽管我有一些旧代码,我刚刚在PPT上用
Select
…ugh发布了另一个答案),为了清楚起见,定义时间总是更好,但我明白了你的意思。@PaulFrancis
专栏(“B:B”)
仅指活动图纸的B列,其中as
。Columns(“B:B”)
明确指图纸“护墙板”的B列。仅当“护墙板”时,代码的行为才会相同恰好是执行时的活动表。出于礼貌,您应该让人们知道您在另一个网站上提出了这个问题,并且已经有了答案…(这是有效的,但我不知道是否可以完全推荐,所以我只是将其作为一个评论)您可以首先将
Ret
设置为false,然后在错误恢复下一步中使用
,然后调用您的
。Find(…)
,然后在错误转到0时将错误处理重新设置回
@chancea我强烈建议不要这样做,它只是忽略错误,而不是正确处理错误。通过.Find()设置范围例如,测试它是否是
Nothing
将是一个更干净的选择。太多的人在错误上使用
语句,而不了解错误处理不善的含义,这将不可避免地导致将来出现更多的问题。@因此,是的,我基本上同意你的观点,这就是为什么我永远不会把这种建议作为一个例子回答。这是一个难看的解决方法,但不好的做法。但是,如果你只是制作一个宏来修复一次电子表格,或者如果它不打算在某种行业中使用,那么我认为这样做(深呼吸)有点好。