我有一个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

10-02 04:08