从 VBA 调用表单

Posted

技术标签:

【中文标题】从 VBA 调用表单【英文标题】:Calling Form From VBA 【发布时间】:2014-03-11 14:30:46 【问题描述】:

我在 Access 2010 中创建了一个 VBA 函数,它在“表单!”中打开一个进度条!并逐渐增加“frame1”的大小并更新标题框。在“Step Into”调试模式下运行此函数会产生预期的结果(所有宏运行正常、对话框打开和更新等。

但是,当我通过向导中内置的“传统”宏(抱歉不确定术语)调用此 VBA 时...即带有 Function =Import_Function() 的 RunCode,而所有查询都运行 find 和成功消息框出现在最后,表格或其任何更新不显示。我可能在这里遗漏了一些完全明显的东西,但如果有人能指出我正确的方向,我将不胜感激。

我的功能代码如下...

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Function Import_Function()

DoCmd.SetWarnings False
    DoCmd.Hourglass True
    DoCmd.OpenForm "Form1", acNormal, "", "", acReadOnly, acWindowNormal
    Forms!Form1!Frame1.Visible = True
    Forms!Form1!Prog_Description.Caption = "Caption1..."
    Forms!Form1!Frame1.Width = 2000
    Sleep (2000)
    DoCmd.OpenQuery "Q002a", acViewNormal, acEdit
    Forms!Form1!Prog_Description.Caption = "Caption2..."
    DoCmd.TransferSpreadsheet acImport, 10, "Import Sheet", "File Location\File Name.xls", True, "A4:AA50"
    Forms!Form1!Frame1.Width = 4000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption3..."
    DoCmd.OpenQuery "Q002b", acViewNormal, acEdit
    Forms!Form1!Frame1.Width = 5000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption4..."
    DoCmd.OpenQuery "Q002c", acViewNormal, acEdit
    Forms!Form1!Frame1.Width = 6000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption5..."
    DoCmd.OpenQuery "Q002c", acViewNormal, acEdit
    Forms!Form1!Frame1.Width = 7000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption6..."
    DoCmd.OpenQuery "Q002a", acViewNormal, acEdit
    Forms!Form1!Frame1.Width = 8000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption7..."
    DoCmd.OpenQuery "Q002e", acViewNormal, acEdit
    Forms!Form1!Frame1.Width = 9000
    Sleep (2000)
    Forms!Form1!Prog_Description.Caption = "Caption8..."
    DoCmd.DeleteObject acTable, "Temp_T"
    Forms!Form1!Frame1.Width = 10000
    Sleep (1000)
    Forms!Form1!Prog_Description.Caption = "Update Complete!"
    DoCmd.Hourglass False
    DoCmd.Close acForm, "Form1"
    Beep
    MsgBox "Process Successfully Updated", vbInformation, "Process Update"

End Function

然后从那里,如前所述,我使用“RunCode”命令从宏运行它。

【问题讨论】:

我认为你最好使用状态栏。 更改.Width 属性后调用DoEvents() @Remou 感谢您的回复。这种方法的需要实际上是审美的。我使用这个特定的代码作为学习示例,以便在我的应用程序的未来启动屏幕中使用睡眠 API 和手动进度条等功能。不知道我的动机现在是否更有意义。我可以理解您的建议条款,非常感谢。 @HansUp 搞定了。非常感谢。我知道这是一种冗长的方法,但我喜欢这种视觉上的方式,这将对我未来的计划有很大帮助。干杯。 你可能想看看这个。这是我为进度条创建的通用可重用表单。 christopherjmcclellan.wordpress.com/2014/03/08/… 【参考方案1】:

检查 Access DoEvents Function 帮助主题:“让操作系统能够处理其他事件。”

在您的情况下,每次调整Frame1.Width 后调用DoEvents 以便更新显示。

Forms!Form1!Frame1.Width = 2000
DoEvents 

【讨论】:

请注意,此答案仅用于解决进度条显示问题。 SetWarnings False 对我来说是一个危险信号。我认为您应该使用Database.Execute 方法而不是DoCmd.OpenQuery 来执行您的查询并离开SetWarnings True 完全同意HansUp。事实上,在上面的代码中,您永远不会将警告设置回 True,这意味着警告会永久关闭,直到明确重新打开。如果应用程序的另一部分出现错误,这可能是灾难性的。 @hansup 反思(并运行几次)我的宏,我看到了将警告设置为 False 的担忧。我将研究 Database.Execute 方法,因为这是我不熟悉的东西,看看我是如何处理它的。到目前为止,我的方法是解决测试时显示的每个警告,但是我可以看到这不会保护我的应用程序免受将来出现意外问题的影响。感谢您的建议。 @JohnnyBones 感谢您的贡献和支持。根据我对 hansup 的回复,我将研究我的方法。感谢您的建议。

以上是关于从 VBA 调用表单的主要内容,如果未能解决你的问题,请参考以下文章

VBA 使用变量表名设置记录

MS Access 2013 从 VBA 调用插入查询并出现奇怪的错误

Access 2007 / VBA - 多个表单实例,从模块更新特定实例的控件

为啥我不能从 VBA 中的多实例表单中获取当前记录 ID

使用 VBA 从主菜单打开一个表单,其中一个字段为空/空白

从 Excel VBA 生成包含表单域的 PDF