将值从 MS Access 表单子传递到其他表单子

passing a value from an MS Access form sub to other form sub

这是我第一次试用 vba。

在一个表单中,我有 2 个按钮。一个用于浏览,选择文件,另一个用于将 excel 导入 table.

我试过下面的代码。它不工作。我需要的是将filepath变量的值从cmdBrowse_Clicksub传递给cmdImportFunctions_Clicksub。

这是我几个小时后最好的,在一个子中使用 call 和在另一个子中使用 byVal 没有用。

提前致谢,此致

我的问题:

  1. 为什么下面的当前代码失败了?
  2. 如何传递 filepath 变量 from cmdBrowse_Click sub to cmdImportFunctions_Click sub (如果可以,我想学习无全局变量的方式)

cmdBrowse_Click: 浏览并获取选择文件的路径

Private Sub cmdBrowse_Click()

Dim dialog As Object

Dim filePath As String

Set dialog = Application.FileDialog(msoFileDialogFilePicker)

With dialog

    .AllowMultiSelect = False

    .Title = "Please select the functions excel to import"

    .Filters.Clear

    .Filters.Add "Excel Newer", "*.XLSX"

    .Filters.Add "Excel Older", "*.XLS"

    If .Show = True Then

        filePath = .SelectedItems.Item(1)

        txtExcelFile.Value = filePath

        Call cmdImportFunctions_Click(filePath)

    Else

        MsgBox "No file was selected", vbOKOnly

        txtExcelFile.Value = ""

    End If

End With

End Sub

cmdImportFunctions_Click: 导入数据库

Private Sub cmdImportFunctions_Click(ByVal filePath As String)

MsgBox filePath, vbOKOnly

End Sub

如错误消息所述,On Click 事件过程必须这样声明:

Private Sub cmdButton_Click()

没有任何参数。您不能更改此声明(否则会出现编译错误)。

如果您想直接从 cmdBrowse 启动导入,则不需要 "Import" 按钮。在表单模块中创建一个 "standard" 私有过程,而不是事件过程。

Private Sub DoImport(ByVal filePath As String)
    MsgBox filePath, vbOKOnly
End Sub

并在 cmdBrowse_Click() 中调用它。

否则,您可以将文件路径存储在模块变量或表单的文本框中 - 如果浏览按钮仅选择文件,这将是通常的设计。

编辑: 我看到你已经有了:txtExcelFile.Value = filePath

我建议用Me!txtExcelFile.Value = filePath表示这是一个表单控件

然后简单地:

Private Sub cmdImportFunctions_Click()
    Dim filePath As String
    filePath = Nz(Me!txtExcelFile.Value, "")

    If filePath = "" Then 
        MsgBox "Please select a file first"
    Else
        MsgBox filePath, vbOKOnly
    End If
End Sub