【问题标题】:Can I use a variable as the name of a control in Microsoft Access VBA我可以在 Microsoft Access VBA 中使用变量作为控件的名称吗
【发布时间】:2011-11-25 10:09:51
【问题描述】:

我有一个用于查找地址的 Microsoft Access 弹出式表单。一旦用户找到邮政编码,地址就会被放入启动它的表单上的各种文本框中。问题是,这个弹出表单是从整个数据库中的各种表单启动的,因此它放入结果的文本框位于不同的位置。

我尝试通过以下方式解决此问题。我有一个随时打开的总机,所以我有一个隐藏的文本框,我以编程方式输入要从中启动弹出表单的表单的名称。然后我声明一个字符串变量,它设置为这个隐藏文本框的当前值,如下所示:

Dim currentForm As String
currentForm = [Forms]![foo]![bar]

然后我尝试将我的地址详细信息放入相关的文本框中,如下所示:

Forms!currentForm![txtCurrentAdd1] = rst![Line1]

但是这并没有按计划进行,我做错了什么?

谢谢

【问题讨论】:

  • 要获取当前表单,只需使用Me
  • @iDevelop 只能在当前表单中使用,而我认为 Heisenburg 表示要写入的表单,是吗?

标签: ms-access vba


【解决方案1】:

要么:

Dim currentForm As String
''Not sure where the two parts are coming from
''but you cannot have them like that
currentForm = "foobar"

Forms(currentForm).[txtCurrentAdd1] = rst![Line1]

或者

Dim currentForm As Form
Set currentForm = Forms![foobar]

currentForm![txtCurrentAdd1] = rst![Line1]

您可能想阅读关于 bang 与 dot 的文章。

请注意,整个事情看起来有点像你在逆流而上。

【讨论】:

  • 感谢您的帮助,我会重点阅读 bang vs dot。
  • 第二个例子必须是Set currentForm = Forms![foobar]。另外,如果我理解正确,“两部分”是表单和文本框。所以正确答案是Forms(Forms!foo!bar)!txtCurrentAdd1 = rst!Line1(当然也可以是一些变体语法)
  • @phhog,我会接受设置校正,但我指的第二部分不能是文本框 - 操作说 form!foo!bar 然后指的是文本框,bar 不能文本框,它不能是子表单。
  • 为什么你认为 bar 不能是文本框? OP 说它是一个隐藏的文本框,其中包含一个表单的名称,而表单的名称又包含一个文本框 (txtCurrentAdd1),他正在其中添加数据。
  • 我也对你的评论投了赞成票,Phoog,感谢您的解释 =)
【解决方案2】:

您可以像这样访问其他表单上的控件:

Dim FormName As String
Dim ControlName As String

FormName = "YourForm"
ControlName = "YourTextbox"

Forms(FormName).Controls(ControlName) = "New Value"

【讨论】:

    【解决方案3】:

    您也可以使用 OpenArgs 属性。要打开可重复使用的弹出窗口,请使用:

    DoCmd.OpenForm FormName:="frmPopup", OpenArgs:=Me.Name
    

    为了传递调用者的名字。

    在 frmPopup 中,您可以参考Me.OpenArgs 以获取该信息。

    【讨论】:

      【解决方案4】:

      我知道这是一篇旧文章,但这可能对新读者有用。解决在模块和表单之间传递变量的问题的简单方法是使用 VBA 注册表区域。这是一种非常简单易用的技术,可以让项目保持整洁。

      保存一个值:

      SaveSetting AppName, Section, Key, Setting
      

      获取值:

      GetSetting AppName, Section, Key, [Default]
      

      这避免了丢失变量的跟踪和在表单上创建隐藏控件。它还可以跨平台运行,无需在 PC 和 Mac 上进行更改。

      然后我通常会在我的项目中设置一些常量来定义前三个参数:

      Public Const REG_PROD = "My product name"
      Public Const REG_CONFIG = "Configuration"
      Public Const REG_SETTING1 = "My Setting 1"
      

      所以上面的调用会变成:

      保存一个值:

      SaveSetting REG_PROD, REG_CONFIG, REG_SETTING1, "My Value"
      

      获取值:

      GetSetting REG_PROD, REG_CONFIG, REG_SETTING1, "Value not set"
      

      我曾经使用隐藏控制方法,但它增加了很多管理,你不能总是变量值,而你可以保持 RegEdit 的实例打开以进行调试。

      【讨论】:

        【解决方案5】:

        我觉得

        Me.Controls(variablelabelName).Caption
        

        您可以编写代码来更改变量并将其用作label 的名称来为每个标签创建唯一的标题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-27
          • 2019-02-14
          • 1970-01-01
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          相关资源
          最近更新 更多