MS Access VBA创建即时窗口弹出窗口或模拟一个窗口

时间:2014-11-10 19:48:46

标签: vba excel-vba ms-access console immediate-window

我有一个带递归函数的代码,它检查文件夹中的文件夹,并在我的数据库中写入文件夹的名称,ID和深度。重复该过程,直到所有文件夹都在数据库中(每个项目通常为200个文件夹)。

当我打开代码窗口运行代码时,由于debug.print,我可以看到代码正在执行的操作,但由于用户从未打开代码窗口,因此无法看到正在发生的事情。我想到了2个解决方案。

  1. 在我的表单上弹出“即时窗口”。
  2. 使用文本框创建表单。
  3. 我搜索了谷歌,但没有找到一个可行的解决方案来立即弹出窗口。

    至于第二个想法是有一种方法可以将.print发送到文本框,还是像vba中的控制台对象?

    我正在使用

    Form_PrintWindow.PrintWindow.Text = xmlNode3.Attributes.getNamedItem("id").Text & " " & xmlNode3.Attributes.getNamedItem("name").Text & vbNewLine & Form_PrintWindow.PrintWindow.Text
    

    但是在这个过程中,字符串会中途填满。

2 个答案:

答案 0 :(得分:1)

  1. 创建一个带有空列表框的表单控制适当的大小。 (我将我的表单DebugOutput和列表框OutputList)命名为
  2. 在该表单中添加UpdateProgress子。它会将您的其他流程的输出作为新项目添加到列表框中,并选择最近添加的项目。

    Public Sub UpdateProgress(text As String)
        'add item and select it
        With Me.OutputList
            .AddItem text
            .Selected(.ListCount - 1) = True 'zero based index
        End With
    
        DoEvents 'this frees up the OS to repaint the screen
    End Sub
    
  3. 在现有代码中,创建Form_DebugOutput的新实例(或您为表单命名的任何内容。请注意,访问权限会自动使用Form_预先填写表单。)

  4. 而不是Debug.Print调用我们创建的表单实例的UpdateProgress方法。

    Public Sub testit()
        Dim output As New Form_DebugOutput
        output.Visible = True
    
        Dim i As Long
        For i = 1 To 1000
            output.UpdateProgress "I've said hello " & i & " times."
        Next
    
        Stop
    End Sub
    
  5. 它看起来像这样。

    form with process output

    这样实时输出结果将减慢代码速度,因此请仔细考虑是否确实需要显示此信息。此外,如果您希望表单保留在屏幕上,则需要在全局范围内声明Form变量。有关详细信息,您可能需要阅读my progress bar

答案 1 :(得分:0)

我的建议是使用SysCmd()来更新状态栏。

之所以这样,是因为每当我尝试在代码运行时输出到某个表单时,它就会被击中并错过向用户显示的内容。我从来没有遇到过这种状况的问题。

 Function FolderImport()
 Dim statBAR as variant
 Dim fldName as string
 statBAR = SysCmd(acSysCmdInitMeter, "Processing Import of Folders", 200)
 For i = 1 to 200
    statBAR=SysCmd(acSysCmdUpdateMeter, i)
    DoCmd.RunSQL "INSERT INTO tblFOLDERS VALUES ('" & fldName & "');"
 Next i
 Forms.frm_NAV.lstFOLDERS.requery()
 End Function

此代码并非100%完整,但您可以了解发生了什么。在代码运行时,用户无论如何都无法执行任何操作,因此代码运行时在列表框中显示文件夹与在代码运行后运行requery()相同。状态栏让用户知道发生了什么事情,因此他们不会认为程序冻结。