当 ComboBox1 of 2 更改值时应用程序崩溃 - ComboBox1 更改事件

Application crashes when ComboBox1 of 2 changes value - ComboBox1 change event

我是 VBA NewBe(这是我第一次 post 在任何 VBA 帮助站点上提问)在 Property/Expense 管理应用程序中工作 excel。有问题的组合框用于 select 基于 属性 ID 的工作表,propID,在 cmbPropID 中基于“控制”工作表中的范围和工作表年份, wsYr,在由个人 propID 的开始年份 wsStartYr 和当前日历年 wdCurYear 确定的 cmbYear 中。我能够 select/activate 并查看第一个 属性 I select 的所有工作表。但是,当我 select 另一个 属性 处理应用程序时,它因 Debug error: 9 - Script out of range 而崩溃!我已经失明了一个多星期,一直在寻找没有成功的解决方案。

这个问题对应用程序的整体功能很重要。我希望有人能够帮助我解决这个问题。提前致谢。

下面是组合框的代码部分 第一个配置cmbPropID '这是一个 Excert 表单 MultiPage1 案例 2

    'configure cmbPropID  DDL
    wkstControl.Activate
    selectedRow = cmbPropID.ListIndex + 3   'I presume this is 3 instead of 2 because when using 2
                                                        'this throws an error - not sure why
    For Each cPart In wsCntrl.Range(Range("propIDs"), Range("A" & Rows.Count).End(xlUp))
     pAct = wsCntrl.Cells(selectedRow, 11).Value 'Value used to test the "isActive" status of a  RealEstate property location
      With Me.cmbPropID
        If pAct = True And cPart.Value <> "" Then cmbPropID.AddItem cPart.Value 'Never Shows pAct as False ???
            'this presents an issue that if  is inActive of does'nt have worksheets it causes
            ' Debug error "Error: 13,  Type Mismatch"
      End With
    Next cPart        

此子程序配置 cmbYears DDL 的内容,并且当 select 不同 propID 时应该重置 DDL 的内容...请参阅下一个子例程中的注释


    Private Sub cmbPropID_Change()
    Dim i
    Dim strValue As String
    wsCntrl.Activate
    pID = ""
    wsA = ""
    wsYr = "" 
    selectedRow = cmbPropID.ListIndex + 2
    
    wsStartYr = wsCntrl.Cells(selectedRow, 13).Text
    
          With cmbYears
                .Clear
    
            For i = wsStartYr To wbCurYear
                pAct = wsCntrl.Cells(selectedRow, 11).Value
                If wbCurYear <> wsStartYr And pAct = True Then
                    .AddItem i
                ElseIf wbCurYear = wsStartYr Then
                    .AddItem wbCurYear
                End If
            Next i
          End With
    lstDsplyUtil1.RowSource = ""
    pID = cmbPropID.Text
    
    End Sub

 

最后是 cmbYears。当 cmbPropID 更改时,代码在 Set wsUtil = Worksheets(wsA) 处崩溃。


    Private Sub cmbYears_Change()
     wsYr = cmbYears.Text
     wsA = pID & "_" & wsYr
        Debug.Print pID, wsYr, wsA
     Set wsUtil = Worksheets(wsA) 
     lstDsplyUtil1.RowSource = wsA & "!$A:$Y"
     
    Debug.Print pID, wsYr, wsA
    'Remove after testing
    Label120.Caption = wsA
    Label136.Caption = pID
    Label138.Caption = wsYr
    Label134.Caption = lstDsplyUtil1.RowSource
    
     wsUtil.Activate
     
    End Sub

在发布我的 Question 后,我回去对 Crash Issue 进行故障排除。我养成了在各种 UserForms 上创建 Labels 的习惯,将它们的 .Caption 值分配给各种 Variable 值,并使用 Debug.Print 来跟踪那些ValuesImmediate Window.

我注意到当 Debug 抛出 ErrorImmediate Window 显示新的 pID Value after cmbPropID_Change() Event 是与 BEFOREcmbPropID_Change EventcmbPropID.ListIndex = -1 相同,而根据 cmbPropID 中的选择,它应该是 >=0。这让我认为问题出在 cmbPropID_Change() Event configuration 上。但是,无论我对 cmbPropID_Change() Event configuration 做了什么更改,问题仍然存在。

我开始查看 cmbYears_Change() Event configuration 发生 Error 的地方,我想到我可以 pre-Trap 从而通过封装 [=38] 来避免 Error =] 在一组 If Then ElseIf 语句中,如下所示:

    If cmbYears.ListIndex <> -1 Then
      'cmbYears' original code
      ElseIf cmbYears.ListIndex >= 0 Then
      'cmbYears' original code
    End If

这完美地工作,这是最终代码!

    Private Sub cmbYears_Change()

    If cmbYears.ListIndex <> -1 Then
        pID = cmbPropID.Text
        wsYr = cmbYears.Text
        wsA = pID & "_" & wsYr
        lstDsplyUtil1.RowSource = wsA & "!$A:$Y"
    Debug.Print pID, wsYr, wsA
    Set wsUtil = Worksheets(wsA)
    wsUtil.Select
  ElseIf cmbYears.ListIndex >= 0 Then
    pID = cmbPropID.Text
    wsYr = cmbYears.Text
    wsA = pID & "_" & wsYr
    lstDsplyUtil1.RowSource = wsA & "!$A:$Y"
    Debug.Print pID, wsYr, wsA
    Set wsUtil = Worksheets(wsA)
    wsUtil.Select
End If

End Sub

问题已解决!