VBA如何正确地全局初始化窗体并从其控件获取/设置值

VBA如何正确地全局初始化窗体并从其控件获取/设置值,vba,excel,Vba,Excel,我在vba应用程序中从表单的文本框中获取值时遇到问题。在模块i中,有所有逻辑子模块,用于初始化表单、在表单中预设值等: Dim usf As New UserForm1 'in this case I assume that form is initialized 'globally, on top of all subs, so all 'files and subs in my

我在vba应用程序中从表单的文本框中获取值时遇到问题。在模块i中,有所有逻辑子模块,用于初始化表单、在表单中预设值等:

Dim usf As New UserForm1   'in this case I assume that form is initialized 
                           'globally, on top of all subs, so all 
                           'files and subs in my vba project can acces to 
                           'controls in it. And it works, but every second 
                           'run raises an "Automation error"

Sub start()
                           'when I declare form here, program always 
                           'start, but none of subs can 
                           'acces to form controls. Of course in this case I 
                           'must initialize form in 
                           'every single sub. I've tried passing form as 
                           'argumend to functions, but 
                           'this not work or I do it in wrong way. Subs 
                           'can't read values from form controls. This sub 
                           'is only to presets values in sub and to show 
                           'form

On Error GoTo errMyErrorHandler

                          'here is part of code reading values from sheet
                          'and inserting this values to textboxes, labels 
                          'and comboboxes. No problem here.

usf.Show                  '//problem here when I declare my form globally. 
                          'Raises Automation error
Exit Sub

errMyErrorHandler:
 Call errorHandler(err)  'on error go to error handling sub which show 
                         'messagebox with err name

End Sub

Public Sub startRun(Optional x = 0) 'optional only for not to show this sub 
                                    'in macro's list. This is sub which 
                                    'starts when form's button start is 
                                    'being clicked
On Error GoTo errMyErrorHandler
Dim napZW, Udn, Str As Single
Dim H1, H2 As Integer

With usf                            'reading text from textboxes. It's not
napZW = CSng(.txtNapZw.Text)        'work when form is declared locally
Udn = CSng(.txtUdn.Text)
Str = CSng(.txtStr.Text)
H1 = CInt(.cbx1H.Text)
H2 = CInt(.cbx2H.Text)
End With

Call ObliczanieIP(napZW, Udn, Str, H1, H2, usf) 'sub for reading values from 
                                                'sheet
Exit Sub

errMyErrorHandler:
  Call errorHandler(err)
End Sub

Sub ObliczanieIP(napZW, Udn, Str, H1, H2, usf)
On Error GoTo errMyErrorHandler
Range("Q31").Value = napZW
Range("R31").Value = Udn
Range("S31").Value = Str
Range("S2").Value = H2
Range("S4").Value = H1

'some code here, checking correctness of inserted values. If not correct, 
'shows message box and exits this sub. No problem here.

usf.lblLtr = Range("s33").Value        'reads from sheet values and show it 
usf.lbXtr = Range("R33").Value         'in labels. Again, to work, form must 
usf.lblImax = Range("S18").Value       'be declared globally
usf.lblImediana = Range("S22").Value
usf.lblIsrednia = Range("S20").Value

Exit Sub

errMyErrorHandler:
  Call errorHandler(err)
End Sub

Public Sub errorHandler(err As ErrObject)
MsgBox err.Description & ", " & err.Number & " " & err.Source, _
   vbExclamation + vbOKCancel, _
    "Błąd: " & (err.Description)
  err.Clear
  End                   'Without end statement program runs only once when 
                        'excel is initialized or when i go to VBA editor and 
                        'i think ressetting all 'things' associated with 
                        'this program
End Sub
在userForm1中,我只有按钮事件的逻辑:

Private Sub btnStart_Click()
startRun
End Sub

问题是,当我在任何子模块之外的模块中初始化表单时(我认为应该在全局范围内这样做),我的程序工作正常,但每运行一秒钟就会引发“自动化错误”。当我在sub中初始化表单时,启动对表单的受限访问,而我的其他sub无法访问表单中的控件。当我在每个需要它的子系统中重新初始化表单时,控件正在重置。我知道这可能是个愚蠢的问题,但我是VBA新手。提前感谢您的回复。

如果您在任何子模块外的模块中初始化时程序工作正常(不确定这是什么意思,您的意思是
Public usf As UserForm
?),那么您需要处理“自动化错误”。正如你现在提出的问题,很难理解你的问题是什么。确切地说,当我在任何子模块之外的模块上声明Public usf为new UserForm1时,我的应用程序工作正常,但通常我必须处理“Automation Error”,当我在上面发布的代码中声明UserForm1时,错误就消失了,但其他文件中的另一个SUB无法访问表单控件,例如文本框。奇怪的是,当我将end语句放入错误处理程序时,程序将正常运行(第一次运行会引发“-2147418105自动错误”,因此错误处理程序执行end语句。每运行一秒都正常)。这种情况是当我在模块顶部的第一个模块上,在所有子模块之前声明UserForm1时(我认为表单是全局声明的)。仍然很难理解实际的问题情况是什么,也就是说,其他人如何重现这个问题。提供一个简单或简明的重新创建步骤(这可能需要生成代码的简化版本)。如果您在每个模块或过程中
new
ing用户表单,可能会出现问题。如果您要全局声明它,那么您需要一些逻辑来确保它被正确实例化并在运行时存在,等等。如果您想要一个全局的、唯一的userform实例,为什么不使用VBA提供给您的实例,它与类同名,即
UserForm1
?我怀疑您遇到的问题与您的实例被“卸载”有关。