将代码放入VBA Userform而不是"普通"模块中是否有缺点?
这可能是一个简单的问题,但我在搜索Web和stackoverflow时没有找到一个确定的答案.
背景:我正在Excel-VBA中开发数据库的前端应用程序.要选择不同的过滤器,我有不同的用户形式.我问一般的程序设计更好:(1)将控制结构放入单独的模块中或(2)将下一个用户形式或操作的代码放入用户窗体中.
让我们举个例子.我有一个Active-X按钮,可以触发我的过滤器和表单.
Variant1:模块
在CommandButton中:
Private Sub CommandButton1_Click()
call UserInterfaceControlModule
End Sub
Run Code Online (Sandbox Code Playgroud)
在模块中:
Sub UserInterfaceControllModule()
Dim decisionInput1 As Boolean
Dim decisionInput2 As Boolean
UserForm1.Show
decisionInput1 = UserForm1.decision
If decisionInput1 Then
UserForm2.Show
Else
UserForm3.Show
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
在变体1中,控制结构在正常模块中.关于下一个要显示哪个userform的决定与userform分开.决定下一个要显示的用户表单所需的任何信息都必须从用户表单中提取.
Variant2:Userform
在CommadButton中:
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
Run Code Online (Sandbox Code Playgroud)
在Userform1中:
Private Sub ToUserform2_Click()
UserForm2.Show
UserForm1.Hide
End Sub
Private Sub UserForm_Click()
UserForm2.Show
UserForm1.Hide
End Sub
Run Code Online (Sandbox Code Playgroud)
在变体2中,控制结构直接在用户表单中,每个用户表单都有关于它后面的内容的说明.
我已经开始使用方法2进行开发.如果这是一个错误,并且这个方法有一些严重的缺点,我想早点知道它.
我在表单上有以下按钮:
Private Sub CommandButton1_Click()
Dim pass As String
pass = UserForm1.TextBox1
Unload UserForm1
End Sub
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为Module1的模块:
Public Sub Login()
...
UserForm1.Show
driver.findElementByName("PASSWORD").SendKeys pass
...
End Sub
Run Code Online (Sandbox Code Playgroud)
这个想法是用户输入到输入框的任何密码都将被分配给变量pass.然而,我遇到的麻烦是pass从UserForm1 传递到Module1的Login子.
我想Module1.Login (pass)在卸载它之前添加类似于我的表单的东西会起作用,但是这似乎没有通过任何东西.任何帮助将非常感激.谢谢.
为什么Excel 中有两种类型的控件? (2个按钮,2个组合框,2个复选框等...)
表单控件和ActiveX控件之间有什么区别 ?我应该使用哪一个?

我发现在线的一些代码示例使用我的控件,但其他代码没有.怎么会?
我如何处理每种类型,我该如何区分?
我需要动态创建标签和按钮,然后将它们添加到用户窗体内的框架中.我该怎么做呢?看起来它应该比实际更容易.
在VBA中的用户窗体的文本框中,我想启用该功能,用户可以通过按键盘上的"Enter"键在文本框中添加新行.但是,我无法在UI编辑器中找到UI选项来实现此目的.甚至在VBA用户表单中是否允许这样做?提前感谢您的建议和答案.
当宏仍在导入工作表时,我创建了一个用户窗体来显示进度条

问题是用户可以按下将关闭的红色[X]按钮并中断完成的处理.
有没有办法隐藏这个厄运的红色按钮,以便潜在用户在运行时没有任何令人困惑的按钮.
编辑:
我试过这个
'Find the userform's Window
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
'Get the current window style
Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
'Set the new window style
Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" ( _
ByVal hWnd …Run Code Online (Sandbox Code Playgroud) 我有一个excel Userform,带有动态添加的复选框.我在早期添加了复选框,代码如下所示:
Set chkBox = Me.Controls.Add("Forms.Checkbox.1", "Checkbox" & i)
Run Code Online (Sandbox Code Playgroud)
稍后,我想删除所有这些复选框.我正在尝试这段代码:
Dim j As Integer
'Remove all dynamically updated checkboxes
For Each cont In Me.Controls
For j = 1 To NumControls
If cont.Name = "Checkbox" & j Then
Me.Controls.Remove ("Checkbox" & j)
End If
Next j
Next cont
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息: 
任何帮助将不胜感激.
由于冗长的评论和建议答案的更新,此问题已经过编辑.
这里要求的是模块13;
Sub SaveInFormat()
Application.DisplayAlerts = False
Workbooks.Application.ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\jammil\Desktop\AutoFinance\ProjectControl\Data\" & Format(Date, "yyyymm") & "DB" & ".xlsx", leFormat:=51
Application.DisplayAlerts = True
End Sub
Run Code Online (Sandbox Code Playgroud)
还有一些与ErrorHandling中的问题,我知道我出了毛病,但我更感兴趣的是,此刻固定关闭功能之前,我进去.这是需要一些工作的错误处理代码
Sub test()
Dim wk As String, yr As String, fname As String, fpath As String
Dim owb As Workbook
wk = ComboBox1.Value
yr = ComboBox2.Value
fname = yr & "W" & wk
fpath = "C:\Documents and Settings\jammil\Desktop\AutoFinance\ProjectControl\Data"
owb = Application.Workbooks.Open(fpath & "\" & fname)
On Error GoTo ErrorHandler:
ErrorHandler:
If MsgBox("This File Does Not Exist!", …Run Code Online (Sandbox Code Playgroud) 我想学习一个新的技巧,但我并不是100%自信在VBA中有可能,但我想我会在这里与大师核实.
我想要做的是避免使用古老的getopenfilename或浏览器窗口(在我们的网络驱动器上设置起始目录非常困难)并且我想创建一个用户可以拖动的VBA用户表单并从桌面或窗体上的浏览器窗口中删除文件,VBA将加载文件名和路径.同样,我不确定这是否可行,但如果是,或者如果有人在我欣赏指针之前已经完成了.我知道如何设置用户表单,但除此之外我没有任何真正的代码.如果有我能提供的东西,请告诉我.
感谢您的时间和考虑!
我已经在VBA中编写了一些代码来子类化用户表单,以便最终我可以截获WM_TIMER发送给它的消息。我这样做不是指定TIMERPROC,因为它允许我使用VBA自己的错误处理和调用方法来运行回调函数。我使用的是用户表单,而不是Application.hWnd因为:
Application.hWnd,无法以慢速解释的语言(如VBA)对其进行子类化End语句)时,用户窗体将自行消失-断开所有仍在发送消息的计时器。
SetTimer继续触发我的消息窗口一切正常,除了我发现偶而在我的代码启动并运行时,按下复位/停止按钮,一切都崩溃了。
我希望我的窗口可以取消分类并安全地销毁。
我创建了以下内容,以允许我将用户窗体作为子类(尚无计时器,问题仅通过子类化即可显现出来):
WinAPI我使用了新的子类风格,因为MSDN告诉我这样做,以防万一我需要添加更多子类-但这不会有所作为。
Option Explicit
Public Enum WindowsMessage 'As Long - for intellisense
WM_TIMER = &H113 'only care about this one
'...
End Enum
Public Declare Function DefSubclassProc Lib "comctl32.dll" Alias "#413" ( _
ByVal hWnd As LongPtr, _
ByVal uMsg As WindowsMessage, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Public …Run Code Online (Sandbox Code Playgroud)