标签: userform

将单击的VBA功能分配给Excel Userform上的动态创建按钮

我正在使用以下代码在Excel用户表单上动态创建按钮:

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
    .Caption = "XYZ"
    .name = "AButton"
    .Font.Bold = True
    .ForeColor = &HFF&
    ... blah blah blah
End With
Run Code Online (Sandbox Code Playgroud)

我想在单击这些按钮时分配一个函数来运行,但我找不到一种直接的方法来执行此操作,因为按钮本身没有属性.

有没有办法用上面的习语做到这一点?我应该以不同的方式处理这整件事吗?

excel vba event-handling userform

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

如何将VBA用户表单中的错误传递给调用方法

VBA用户表单中的错误(在initialize事件中发生的错误之外)似乎没有冒泡到调用方法.有没有办法强迫错误冒出来?

VBA用户表单包含名为userform_error的事件,该事件定义为

Private Sub UserForm_Error(
    ByVal Number As Integer, 
    ByVal Description As MSForms.ReturnString, 
    ByVal SCode As Long, 
    ByVal Source As String, 
    ByVal HelpFile As String, 
    ByVal HelpContext As Long, 
    ByVal CancelDisplay As MSForms.ReturnBoolean
)
Run Code Online (Sandbox Code Playgroud)

在用户表单中发生错误时调用事件UserForm_Error似乎是合乎逻辑的,但似乎并非如此.实际上,我找不到Userform_Error的任何文档.

我搜索过MSDN,Bing,Google,StackOverflow,DuckDuckGo,但我还没有找到一个好的方法,或者有关UserForm_error实际做什么的任何文档.

vba userform

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

将VBA中的ProgressBar UserForms显示为模态还是无模式更好?

将VBA中的ProgressBar UserForms显示为模态还是无模式更好?在VBA中制定进度指标的最佳做法是什么?

无模式UserForms需要使用Application.Interactive = False,而Modal UserForms本质上阻止与应用程序的任何交互,直到核心过程完成或被取消.

Application.Interactive = False但是,如果使用了,则Esc键会中断代码执行,因此在UserForm和调用过程中都需要使用Application.EnableCancelKey = xlErrorHandler和错误处理(Err.Number = 18).

资源密集型调用程序也能导致CommandButton_ClickUserForm_Activate在无模式用户窗体哑火事件.

通常,使用模态UserForms的进度指示器似乎更简单,因为正在执行的代码完全包含在UserForm模块中,并且不需要传递变量.

但是,对于进度指示器使用模态UserForms的问题是,每个需要进度指示器的过程都需要单独的UserForm模块,因为调用过程必须在UserForm_Activate过程中.

因此,虽然在无模式UserForm中可以有一个可重用的进度指示器,但它比在多个模态UserForms中执行代码的可靠性低.

哪种方式更好?

谢谢!

vba modal-dialog modeless userform progress-indicator

8
推荐指数
1
解决办法
5622
查看次数

如何在VBA表单上显示部分Excel

我有.csv格式的文件和AS列,它有一些像表格的记录.我的完整程序将插入/删除/删除/添加一些行,列和编辑单元格值等.我设法编写了我需要的所有操作,现在我正在尝试将它与gui集成.

我想要的是将Ax1中的单元格显示到在VBA用户表单上有记录的最后一列.我怎样才能做到这一点?

*ps:再次,我的文件格式为.csv,我正在使用Excel 2007

excel vba excel-2007 excel-vba userform

8
推荐指数
1
解决办法
6万
查看次数

Excel - VBA:将变量从Sub传递给Userform

我已经阅读并应用了类似主题的解决方案,但在我的案例中似乎没有任何效果.

所以,我想将一个变量从我的Module1的一个子传递给一个userform.这是一个名为"provinceSugg"的字符串.

这是我的代码的相关部分:

Public provinceSugg As String

Sub probaCity()
[...]
If province = "" And city <> "" Then
provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value
UserForm2.Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
UserForm2.Label1.TextAlign = fmTextAlignCenter
UserForm2.Show
Else
End If

End Sub
Run Code Online (Sandbox Code Playgroud)

然后在我的userform代码中:

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub
Run Code Online (Sandbox Code Playgroud)

当我运行我的程序时:

1 /我有来自my sub的MsgBox中显示的provinceSugg的内容(因此有一个provinceSugg,它不是一个空变量).
2 /从userform调用的MsgBox为空(因此传递值失败)并且我的程序在运行"sMain.Range("J6")时崩溃.值= provinceSugg",类似于"Error 424 Object Required"(所以变量无法传递给userform).

我尝试了我在论坛和这里找到的所有东西(不同的方式来表明provinceSugg是一个公共变量,但仍然崩溃......).

在此先感谢您的帮助 !

variables excel vba userform

8
推荐指数
1
解决办法
7万
查看次数

显示userform后,将焦点设置回应用程序窗口

当显示用户表单(运行其Show方法)时,它不仅显示在屏幕上而且还获得焦点(例如击键的目的地).

比如说,userform是一个自定义工具栏.它的Show火灾Workbook_Open()但形式本身相对较少使用,因此我们希望焦点在其出现后立即返回主应用程序窗口.

不幸的是,似乎SetFocus方法对应用程序对象无效.

那怎么办?

我想我的例子的解决方案就在之后

Private Sub Workbook_Open()
    [...]
    UserForm1.Show
Run Code Online (Sandbox Code Playgroud)

excel vba focus excel-vba userform

8
推荐指数
2
解决办法
4万
查看次数

Excel 用户窗体以错误的大小显示

我在 Excel 用户窗体上遇到了一个非常奇怪的问题;当我通过单击工作表中的命令按钮显示表单时,表单的大小明显扭曲,使其基本上无法使用。下面的图片说明了这一点。

尺寸翘曲前的形状(预期尺寸) 尺寸翘曲前的形状(预期尺寸)

尺寸翘曲后的形状 尺寸翘曲后的形状

我使用多屏幕设置,这个尺寸问题只发生在我没有额外显示器的笔记本电脑上;但是,即使使用我通常的设置,它现在也开始发生。此外,在某些情况下,翘曲会与每个后续的表单初始化相结合。我在下面包含了此示例图像。

翘曲前的形状(预定尺寸) 翘曲前的形状(预定尺寸)

变形后的形状(第一次迭代) 变形后的形状(第一次迭代)

复合翘曲(第二次迭代) 复合翘曲(第二次迭代)

进一步复合翘曲(第三次迭代) 进一步复合翘曲(第三次迭代)

我尝试通过属性窗口和 Userform_Initialize() 事件手动设置高度和宽度属性,但最终还是得到了奇怪的结果。在属性窗口中,我输入的高度和宽度的值在我输入后会自动更改,通常会导致不希望有的纵横比,当我尝试使用 VBA 调整大小时也会发生类似的情况。我不认为代码是问题,因为我只是设置 .Height 和 .Width 属性,所以没有太多出错的空间。

我已经进行了相对广泛的研究,但未能找到有关此问题的任何信息。我正在使用 Excel 2016;任何帮助,将不胜感激!

excel vba userform

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

Excel VBA Userform - 当某些内容发生变化时执行Sub

我有一个包含大量文本框的用户表单.当这些文本框的值发生变化时,我需要通过调用子程序AutoCalc()来重新计算基于文本框值的最终结果值.

我有大约25个盒子,我不想单独向调用所述子例程的每个文本框添加一个Change()事件.每当某些值发生变化时,调用AutoCalc()的最快捷有效的方法是什么?

excel vba excel-2007 excel-vba userform

7
推荐指数
3
解决办法
5万
查看次数

在Userform上显示Excel工作簿

目标:正如标题所示,我们如何在不使用任何第三方控件的情况下在userform上显示工作簿.

通过Display,我的意思是显示它在一个窗体,其中用户可以选择一个工作表,并查看工作表的内容.

这篇文章试图自我回答这个问题.

excel vba userform

7
推荐指数
1
解决办法
702
查看次数

Excel VBA - LDAP 管理限制的解决方法

在用户窗体中,我有多个列表框。

  1. Active Directory (AD) 中所有组的列表;
  2. 从 ListBox1 中选定的组的列表;
  3. 这些选定组的唯一成员列表(因此使用字典,因为某些用户可以是多个组的成员);

我现在的情况是,第一个和第二个列表工作正常,但是当查询返回超过 1000 条记录时,我就达到了 LDAP 管理限制,这将返回运行时错误“错误 -2147016669”。正是这个问题,供参考。任何低于 1000 的值都会使代码运行顺利。

我正在进入不熟悉的领域,并且无法找到实现“页面大小”属性的正确方法,以便完整的用户列表将填充初始化的字典:

Private Sub Button1_Click()

Set rootDSE = GetObject("LDAP://rootDSE")
domainDN = rootDSE.Get("defaultNamingContext")
Set ado = CreateObject("ADODB.Connection")
ado.Provider = "ADSDSOObject"
ado.Open "ADSearch"

Set Dict_members = CreateObject("Scripting.Dictionary")
For n = 0 To ListBox2.ListCount - 1
    If Me.ListBox2.Selected(n) = True Then
        ldapFilter = "(sAMAccountName=" & Me.ListBox2.List(n) & ")"
        Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & ldapFilter & ";distinguishedName,primaryGroupToken;subtree")
        groupDN = objectList.Fields("distinguishedName")
        groupRID = …
Run Code Online (Sandbox Code Playgroud)

excel vba ldap active-directory userform

7
推荐指数
2
解决办法
499
查看次数