在宏中使用用户在表单中输入的信息

Posted

技术标签:

【中文标题】在宏中使用用户在表单中输入的信息【英文标题】:Use information entered by user in Form in Macro 【发布时间】:2012-02-28 06:21:47 【问题描述】:

(这是在 Access 2003 中。) 我正在编写一个宏,它打开一个表单以允许用户输入他们希望导入的文件的路径和名称。然后它关闭表单,并导入指定文件中的数据。我有正确打开表单和用户输入的代码。一旦我获得路径和文件名,我也有执行数据导入/操作的代码。

我的问题是:表单关闭后,如何在宏/其他subs中使用表单中输入的信息?

这是我的表单代码的简单版本(“输入导入信息”):

Option Compare Database
Option Explicit

Sub RunButton_Click()

    FilePathTextBox.SetFocus
    DataPath = FilePathTextBox.Text
    FileNameTextBox.SetFocus
    DataName = FileNameTextBox.Text

    DoCmd.Close

End Sub

这是我的宏尝试的简单版本(失败):

Option Compare Database
Option Explicit
Option Base 1

Public DataPath As String
Public DataName As String
Public CompleteName As String

Function StartImport()

    'Open form to let user enter import file info
    DoCmd.OpenForm "Enter Import Info", acNormal, , , , acDialog

    'Get complete file path/name. I think this is where the problem is.
    CompleteName = DataPath & "\" & DataName

    'Import
    ImportData

    'Data clean up
    DataCleanup
End Function


Function ImportData()

    'Import CompleteName
    'The import code here works fine when CompleteName has the right info

End Function

Sub DataCleanup()

    'cleans up the data as needed (using DoCmd.RunSQL). Works fine.

End Sub

我花了 2 个多小时在 Internet 上寻找解决方案,但没有找到。一位朋友建议创建一个临时表,将表单中输入的值存储为字符串(这意味着该表将只有 1 个字段和 1 条记录)。但我不知道如何将其作为字符串从表中检索出来。

很抱歉,这篇文章很长 - 我想尽可能清楚。 提前感谢您的帮助!

==============编辑(附加信息)

表单中的原始代码要求用户手动输入路径和文件名。整个代码当时都在工作。

但是,我想通过使用 FileDialog 来确定路径和名称来避免错误/错误,因此我创建了在单击文本框时调用的 subs(FileNameTextBox_Click 和 FilePathTextBox_Click)。 FileNameTextBox_Click() 的代码可以在这里找到:FileDialog doesn't work

这有什么影响吗?

【问题讨论】:

我同意托尼的意见。这对我来说可以。您确定没有在其他地方声明 Datapath 和 Dataname 吗?顺便说一句,不要使用控件的文本属性,然后您不必设置焦点,它会在某些阶段导致悲伤。只需说DataPath = Me.FilePathTextBox - 我对于避免名称混淆很重要。如果您必须有一个属性,请使用.value,即使控件没有焦点也可用。 【参考方案1】:

我发表了一条评论说我无法让您的代码失败。然后我想我应该像你一样做所有事情。我不明白为什么更改某些名称会有所不同,但确实如此。

使用您的姓名和代码,我通过以下更改将路径和文件名传递回模块:

RunButton_Click

Debug.Print "Form " & DataPath              ) Check values are stored
Debug.Print "Form " & DataName              )

' Close form and nothing else.
DoCmd.Close objecttype:=acForm, objectname:="Enter Import Info"

模块1

DoCmd.OpenForm "Enter Import Info", acNormal, , , , acDialog之后

Debug.Print "Module " & DataPath            )  Check have values
Debug.Print "Module " & DataName            )

【讨论】:

我运行了提供的代码,唯一的改变是使用 value 而不是 text 属性,它对我有用。 CompleteName 包含完整路径。 我在问题帖子中添加了一些信息,不确定这是否会影响任何事情,但如果您或@Remou 可以看一下,将不胜感激!另外,我添加了那几行并尝试运行宏,但它一直给出“检测到模糊名称:DataPath”的编译错误,并在 RunButton_Click 中突出显示 DataPath。 不明确的名称意味着 DataPath 已被多次声明。在 VB 编辑器中,单击Ctrl+F 以访问查找。在当前项目中搜索 DataPath。您应该会在RunButton_Click() 的范围内找到两个或更多声明。

以上是关于在宏中使用用户在表单中输入的信息的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 3在宏中使用宏?

在宏中拆分字符串

无法在宏中使用 self,因为宏扩展忽略标记“self”

在宏中使用 Objective C API 登录静态库

在宏中过度使用会损害性能吗?

如何在宏中调用自身的方法?