标签: userform

将代码放入Userforms而不是模块是否有缺点?

将代码放入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进行开发.如果这是一个错误,并且这个方法有一些严重的缺点,我想早点知道它.

excel user-interface vba userform

22
推荐指数
1
解决办法
2358
查看次数

在VBA中将变量从Form传递给Module

我在表单上有以下按钮:

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 vba module userform

21
推荐指数
2
解决办法
10万
查看次数

Excel中的表单控件和ActiveX控件之间的差异概述

为什么Excel 中有两种类型的控件(2个按钮,2个组合框,2个复选框等...)

表单控件ActiveX控件之间有什么区别 ?我应该使用哪一个?

我发现在线的一些代码示例使用我的控件,但其他代码没有.怎么会?

我如何处理每种类型,我该如何区分?

excel controls vba activex userform

15
推荐指数
1
解决办法
7726
查看次数

使用VBA将控件添加到Excel用户窗体中的帧

我需要动态创建标签和按钮,然后将它们添加到用户窗体内的框架中.我该怎么做呢?看起来它应该比实际更容易.

excel vba excel-vba userform

12
推荐指数
1
解决办法
9万
查看次数

vba userforms回车行为

在VBA中的用户窗体的文本框中,我想启用该功能,用户可以通过按键盘上的"Enter"键在文本框中添加新行.但是,我无法在UI编辑器中找到UI选项来实现此目的.甚至在VBA用户表单中是否允许这样做?提前感谢您的建议和答案.

vba newline excel-vba carriage-return userform

10
推荐指数
1
解决办法
2万
查看次数

隐藏excel vba userform上的关闭[X]按钮以进入我的进度条

当宏仍在导入工作表时,我创建了一个用户窗体来显示进度条 在此输入图像描述

问题是用户可以按下将关闭的红色[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 vba excel-vba userform

10
推荐指数
3
解决办法
8万
查看次数

从Userform中删除动态添加的控件

我有一个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)

但我收到以下错误消息: 错误信息

任何帮助将不胜感激.

excel vba excel-vba userform

10
推荐指数
1
解决办法
2万
查看次数

Excel VBA打开工作簿,执行操作,另存为,关闭

由于冗长的评论和建议答案的更新,此问题已经过编辑.

这里要求的是模块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)

excel automation vba excel-vba userform

9
推荐指数
1
解决办法
11万
查看次数

VBA将文件拖放到用户表单以获取文件名和路径

我想学习一个新的技巧,但我并不是100%自信在VBA中有可能,但我想我会在这里与大师核实.

我想要做的是避免使用古老的getopenfilename或浏览器窗口(在我们的网络驱动器上设置起始目录非常困难)并且我想创建一个用户可以拖动的VBA用户表单并从桌面或窗体上的浏览器窗口中删除文件,VBA将加载文件名和路径.同样,我不确定这是否可行,但如果是,或者如果有人在我欣赏指针之前已经完成了.我知道如何设置用户表单,但除此之外我没有任何真正的代码.如果有我能提供的东西,请告诉我.

感谢您的时间和考虑!

excel vba drag-and-drop userform

9
推荐指数
1
解决办法
2万
查看次数

为什么在子类化的过程中我不能`End`代码而不破坏所有内容?

我已经在VBA中编写了一些代码来子类化用户表单,以便最终我可以截获WM_TIMER发送给它的消息。我这样做不是指定TIMERPROC,因为它允许我使用VBA自己的错误处理和调用方法来运行回调函数。我使用的是用户表单,而不是Application.hWnd因为:

  1. 我不必过滤我的vs Excel /主机应用程序的消息
  2. 太多的消息正在传递Application.hWnd,无法以慢速解释的语言(如VBA)对其进行子类化
  3. 当代码执行中断(按“停止”按钮或遇到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)

excel winapi vba subclass userform

9
推荐指数
0
解决办法
444
查看次数