如何在运行时创建控件Access VB?

时间:2015-07-08 18:41:23

标签: vba ms-access access-vba

如何在Microsoft Access中使用VB代码在运行时创建控件?经过一番挖掘后,我发现使用CreateControl函数可以实现这一点。问题是我在网上找到的每个随机论坛都有类似的代码:

Private Sub Button_Click()
    Call AddLabel
End Sub

Function AddLabel()
    Set ctl = CreateControl("MyForm", acLabel, acDetail, "", "", 0, 0, 100, 100)
    With ctl
       .name = "myTextBox"
       .Caption = "Hello World!"
       .Height = 50
       .Width = 100
       .FontSize = 11
       .Visible = True
    End With
End Function

但此代码似乎没有创建可见标签。

就我而言,我只是想学习如何让它发挥作用。所以我创建了一个带有按钮的空白表单,单击该按钮将创建一个标签,表示" Hello world!"。我期待发生的是当单击按钮时,文本框将显示在表单的左上角。我很好奇是否有人可以帮我展示一些实际可行的代码的简单示例。

在我知道之前,有人说我可以创建一个标签并隐藏它,然后更改其可见性属性。但是我想知道如何动态创建控件,让这个简单的例子实际工作将极大地帮助我理解。

4 个答案:

答案 0 :(得分:4)

您需要的文档在这里(这些是专门用于Access VBA):

根据文件记载,这个功能有一些很大的局限性:

  • 在表单的生命周期内限制为754个控件(不会通过删除它们来重置,因此您很可能会很快遇到此限制)
  • 必须在设计视图中完成(因此无法在mde / accde中完成)
  • 如何在多用户环境中执行它是值得怀疑的。

由于存在这些限制,除非您最初使用设计表单,否则它是不可取的。

重复问题:How do you dynamically create controls on a MS Access form?

根据OP的建议,这是我的测试代码,它能够添加40个控件并重复该过程50次而不超过754限制(我在测试中重复使用了40个名字)。

警告1 这是不可取的,因为它只能在设计视图中完成,而这在mde / accde中不起作用。

警告2 :它在多用户环境中的表现值得怀疑。

此代码来自带有两个按钮的表单。它打开了第二个名为" Form2"

Option Compare Database
Option Explicit

Private Const FORM_NAME As String = "Form2"
Private m_nCounter As Long

Private Sub cmdCreate_Click()
    runDynamicForm
End Sub

Private Sub cmdRepeat_Click()

    Dim n As Long

    m_nCounter = 0

    For n = 0 To 50
        runDynamicForm
        DoEvents
        DoCmd.Close acForm, FORM_NAME, acSaveNo
        DoEvents
    Next 'n

    MsgBox m_nCounter

End Sub

Private Sub runDynamicForm()

    Const DYNAMIC_TAG As String = "dynamic"

    Dim n As Long
    Dim frm As Form
    Dim ctl As Access.Control

    On Error GoTo EH

    Application.Echo False

    DoCmd.OpenForm FORM_NAME, acDesign
    Set frm = Application.Forms(FORM_NAME)

    For n = frm.Controls.Count - 1 To 0 Step -1
        Set ctl = frm.Controls(n)
        If ctl.Tag = DYNAMIC_TAG Then
            Application.DeleteControl FORM_NAME, ctl.Name
        End If
    Next 'n

    For n = 1 To 20

        With Application.CreateControl(FORM_NAME, acLabel, acDetail, , , 400, n * 300, 1500, 300)

            .Name = "lbl" & n
            .Caption = "Question " & n
            .Visible = True
            .Tag = DYNAMIC_TAG

        End With

        With Application.CreateControl(FORM_NAME, acTextBox, acDetail, , , 2000, n * 300, 3000, 300)

            .Name = "txt" & n
            .Visible = True
            .TabIndex = n - 1
            .Tag = DYNAMIC_TAG

        End With

        m_nCounter = m_nCounter + 2

    Next 'n

    DoCmd.Close acForm, FORM_NAME, acSaveYes

    DoCmd.OpenForm FORM_NAME, acNormal

    GoTo FINISH

EH:
    With Err
        MsgBox "Error:" & vbTab & .Number & vbCrLf _
            & "Source" & vbTab & .Source & vbCrLf _
            & .Description
    End With

FINISH:

    Application.Echo True

End Sub

答案 1 :(得分:1)

我接受了上传代码并将其简化为长篇大论,并将其转换为一个示例代码供我将来使用。希望它能帮助将来的某个人。

fail()

答案 2 :(得分:-1)

每当我尝试运行您的代码时,我都会遇到运行时错误:

  

运行时错误' 6062':
  您必须处于“设计”或“布局视图”中才能创建或删除控件。

基于该信息,似乎在运行时动态创建控件似乎不可能。

答案 3 :(得分:-1)

您可能只缺少apt-file update && sudo apt-get install `apt-file search mono.pc --package-only` ,这是一个关于如何在运行时动态创建表单,数据绑定和创建控件的示例。

DoCmd.Restore