当 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
来跟踪那些Values
在 Immediate Window
.
我注意到当 Debug
抛出 Error
时 Immediate Window
显示新的 pID Value
after
cmbPropID_Change() Event
是与 BEFORE
、cmbPropID_Change Event
和 cmbPropID.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
问题已解决!
我是 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
来跟踪那些Values
在 Immediate Window
.
我注意到当 Debug
抛出 Error
时 Immediate Window
显示新的 pID Value
after
cmbPropID_Change() Event
是与 BEFORE
、cmbPropID_Change Event
和 cmbPropID.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
问题已解决!