gpt4 book ai didi

vba - Excel VBA运行时错误438第一次通过代码

转载 作者:行者123 更新时间:2023-12-01 06:36:28 25 4
gpt4 key购买 nike

我是一名自学成才的 VBA 程序员新手,只知道到处增加 Excel/Access 文件。我有一个神秘的 438 错误,只有在同事复制我的工作簿 (Excel 2013 .xlsm) 并将其通过电子邮件发送给某人时才会弹出。

打开文件时,将模块中的变量设置为工作表上的 ActiveX 组合框时出现运行时 438 错误。如果我结束并重新运行 Sub,它可以正常工作。

模块1:

Option Private Module
Option Explicit
Public EventsDisabled As Boolean
Public ListBox1Index As Integer
Public cMyListBox As MSForms.ListBox
Public cMyComboBox As MSForms.Combobox
Public WB As String

Sub InitVariables()
Stop '//for breaking the code on Excel open.
WB = ActiveWorkbook.Name
Set cMyListBox = Workbooks(WB).Worksheets("Equipment").Listbox1
Set cMyComboBox = Workbooks(WB).Worksheets("Equipment").Combobox1 '//438 here
End Sub

Sub PopulateListBox() '//Fills list box with data from data sheet + 1 blank
Dim y As Integer
If WB = "" Then InitVariables
ListBox1Index = cMyListBox.ListBoxIndex
With Workbooks(WB).Worksheets("Equipment-Data")
y = 3
Do While .Cells(y, 1).Value <> ""
y = y + 1
Loop
End With
Call DisableEvents
cMyListBox.ListFillRange = "'Equipment-Data'!A3:A" & y
cMyListBox.ListIndex = ListBox1Index
cMyListBox.Height = 549.75
Call EnableEvents
End Sub
...

PopulateListBox 在“设备”表的 Worksheet_activate 子中被调用。

我所有的代码都在“设备”表中,直到我读到那是错误的形式并将其移至 Module1。这破坏了我所有的列表框和组合框代码,但基于 this post 中的答案我创建了 InitVariables Sub 并让它工作。

我最初从 Workbook_open 调用 InitVariables 一次,但在单击同时打开的不同工作簿后 WB 失去其值(value)后添加了 If WB=""检查。我确信这源于对私有(private)/公共(public)/全局变量的不当使用(我尝试理解 this,但成功有限),但我认为这与 438 错误无关。

在启动时(从 Windows 资源管理器打开 Excel 文件,没有运行 Excel 的实例),如果我在代码在“停止”处中断然后单步执行 (F8) 后向 cMyComboBox 添加一个 watch ,它会正确设置 cMyComboBox 而不会出错。 watch 的上下文似乎不会影响它是否能防止错误。如果我只是开始步进或注释掉 Stop 行,那么在设置 cMyComboBox 时我会得到 438。

如果我将“On Error Resume Next”添加到 InitVariables,那么我不会出错并且项目“工作”,因为在需要 cMyComboBox 变量之前,InitVariables 最终会再次被调用,并且 sub 似乎总是第二次正常工作。如果可以的话,我宁愿避免在我的代码中再次被破解。

马特

最佳答案

而不是 On Error Resume Next ,实现一个实际的处理程序——这里将是一个“重试循环”;我们通过限制尝试次数来防止无限循环:

Sub InitVariables()
Dim attempts As Long
On Error GoTo ErrHandler
DoEvents ' give Excel a shot at finishing whatever it's doing
Set cMyListBox = ActiveWorkbook.Worksheets("Equipment").Listbox1
Set cMyComboBox = ActiveWorkbook.Worksheets("Equipment").Combobox1
On Error GoTo 0
Exit Sub
ErrHandler:
If Err.Number = 438 And attempts < 10 Then
DoEvents
attempts = attempts + 1
Resume 'try the assignment again
Else
Err.Raise Err.Number 'otherwise rethrow the error
End If
End Sub
Resume在导致错误的完全相同的指令上恢复执行。

注意 DoEvents来电;这使 Excel 继续执行它正在执行的任何操作,例如 loading ActiveX controls ;有可能 DoEvents单独解决问题,整个重试循环也变得没有意义......但比抱歉更安全。

也就是说,我会认真考虑另一种不那么严重依赖似乎是全局变量和状态的设计。

关于vba - Excel VBA运行时错误438第一次通过代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com