2017-07-03 120 views
1

我正在使用下面的代码,用于在退出初始文本框时检查另一个文本框的值,并且如果它为null,则使最初的一个为null,并将焦点置于最终文本框上。发送null文本框并将焦点设置为另一个

但我给这个错误:运行时错误'2147467259(80004005)':非特定错误。

当我发表评论此行(txtTimeUnit = vbNullString)时,宏代码正常工作。

这行命令的问题是什么,请帮我纠正代码。

Private Sub txtTimeUnit_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    If txtStartDate.Text = vbNullString Then 
     txtTimeUnit = vbNullString 
     txtStartDate.SetFocus 
     Exit Sub 
    End If 
End Sub 
+0

尝试'txtTimeUnit.Text = vbNullString' - 你可以不设置控制本身'vbNulLString'。 –

+0

你的回答是不正确的。 'txtTimeUnit = vbnullstring'是真实的代码并且可以工作。问题出在'txtStartDate.SetFocus'行,因此在调试错误后突出显示。如果我在该行之前移动Exit Sub,宏就会工作并且没有错误发生,但是我需要将焦点设置在txtStartDate文本框上。 – mgae2m

+0

您对Siddarth的回答在您的其他问题上的评论(https://stackoverflow.com/questions/44871013/how-can-i-pass-cursor-and-set-focus-on-a-userform-textbox-in-vba )表示'txtTimeUnit = vbnullstring'是问题行。你也可以说注释掉那行代码就可以工作 - 所以从你的问题来看,这就是问题所在。 –

回答

1

就像我说你的代码有效。下面是一个例子

Private Sub txtTimeUnit_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    If txtStartDate.Text = vbNullString Then 
     txtTimeUnit.Text = vbNullString 
     txtStartDate.SetFocus 
     Exit Sub 
    End If 
End Sub 

它不会工作,唯一的办法就是当有代码的另一块被设置Cancel = True。例如

Private Sub txtTimeUnit_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    If IsError(Application.Match(txtTimeUnit.Text, Range("intTable[Time Unit]"), 0)) Then 
     Cancel = True 
    End If 

    If txtStartDate.Text = vbNullString Then 
     txtTimeUnit.Text = vbNullString 
     txtStartDate.SetFocus 
     Exit Sub 
    End If 
End Sub 

为了防止此类错误,你可以使用一个Boolean可变

Dim boolOnce As Boolean 

Private Sub txtTimeUnit_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    If boolOnce = False Then 
     boolOnce = True 
     If IsError(Application.Match(txtTimeUnit.Text, Range("intTable[Time Unit]"), 0)) Then 
      Cancel = True 
     End If 
    Else 
     boolOnce = False 
    End If 

    If txtStartDate.Text = vbNullString Then 
     txtTimeUnit.Text = vbNullString 
     txtStartDate.SetFocus 
     Exit Sub 
    End If 
End Sub