我有一个ComboBox的代码,其目的是在选择ComboBox的值后写入ComboBox的值,然后重置ComboBox。代码如下:
Private Sub ComboBox1_Click()
Dim valor As String
Dim celda As Range
Set celda = ActiveCell
valor = ComboBox1.Value
ComboBox1.ListIndex = "-1"
celda = valor
celda.Offset(1, 0).Select
End Sub
看起来语句ComboBox1.ListIndex =“ -1”一次又一次地触发Sub ComboBox1_Click()。这仅发生几次。任何想法如何解决?
最佳答案
有许多可能的解决方案来解决此问题。我提出了两种解决方案,一种可以轻松解决这种特定情况,另一种是“一般性”以避免在任何子例程中重复输入。
解决方案1。
此解决方案特定于您的情况。您可以在继续操作之前,在子目录的第一行中简单地检查ListIndex
属性:
If ComboBox1.ListIndex = -1 Then Exit Sub
该例程将被输入两次,但是在第二次出现时,它将立即退出,没有任何效果。
解决方案2。
这是避免再次进入任何常规程序的通用解决方案。您可以为例程定义一个状态变量,这是一个静态布尔变量,它指示例程是否已经在调用堆栈中,在这种情况下,您无需重新输入它。
Private Sub NoReEnter()
Static isActive as Boolean ' <-- indicates that this routine is already in the call stack
If isActive then Exit Sub
isActive = True
On Error Goto Cleanup
''''''''''''''''''''''''''''''''''''''''''''''''''''
' .... ' Body of the routine
''''''''''''''''''''''''''''''''''''''''''''''''''''
Cleanup: ' make sure to reset the state variable before exiting
isActive = False
End Sub
解决方案2可以应用于您要使其非递归的任何例程。将此解决方案转换为您的代码,而无需干预其他潜在的(非主题)问题,可以实现以下目的:
Private Sub ComboBox1_Click()
Static isActive As Boolean
If isActive then Exit Sub
isActive = True
On Error Goto Cleanup
' You routine's code as is
''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim valor As String
Dim celda As Range
Set celda = ActiveCell
valor = ComboBox1.Value
ComboBox1.ListIndex = -1
celda = valor
celda.Offset(1, 0).Select
''''''''''''''''''''''''''''''''''''''''''''''''''''
Cleanup:
isActive = False
End Sub