使用Access中的弹出日历创建一个没有宏的Dim值

时间:2015-08-20 00:26:24

标签: vba ms-access access-vba

我是 VBA 的新手,并且本周花了一些时间试图找出一个宏,它会每天自动将几个文件导入自己创建的银行数据库。

大部分宏都在运行,但每天文件的日期都会改变,我想找出一种方法让弹出日历在导入文件之前询问日期。

截至目前,我已经让宏工作了一个硬编码值,但我需要每天手动更改它。

我已经创建了一个弹出式日历表单,但无法弄清楚如何让选择的结果创建一个昏暗的值,以便在宏的其他地方使用

没有日历的示例位于

之下
Function Copy_Of_Import_Macro_TEST()

    On Error GoTo Copy_Of_Import_Macro_TEST_Err

    Dim bankDt As String
    bankDt = "20150818" 'August 18, 2015 formatted as YYYYMMDD
    'insert this into string including quote marks  " & bankDt & "

    Dim filePath As String
    filePath = "C:\myFolder\"

        DoCmd.TransferText acImportDelim, "Import_spec", "BankFile", "" & filePath & "" & bankDt & "filename.csv", True, ""

    Copy_Of_Import_Macro_TEST_Exit:
        Exit Function

    Copy_Of_Import_Macro_TEST_Err:
        MsgBox Error.Description
        Resume Copy_Of_Import_Macro_TEST_Exit

End Function

1 个答案:

答案 0 :(得分:1)

我已经创建了下面屏幕截图中显示的模型表单,其中有一个名为txtBankDate的文本字段和一个名为cmdExportCsv的命令按钮。

enter image description here

在表单的设计视图中,我设置了txtBankDate,使其处于“短日期”格式...

enter image description here

...这样做意味着当表单切换到表单视图时,单击txtBankDate可以选择使用内置日期选择器:

enter image description here

使用日期选择器选择日期会将该日期放入文本框中:

enter image description here

但是,您的功能需要能够在txtBankDate调用日期,然后根据您的需要将其从“dd / mm / yyyy”格式更改为“yyyymmdd”你的文件名。这意味着您的功能需要以下内容:

  1. 允许您引用文本框的参数,因为您需要能够在函数中使用该数据(将其视为一个小漏斗,以便在调用函数时获取必要的数据)
  2. 一旦设置了漏斗(参数)以允许文本框中的数据进入您的函数,您将需要使用函数将日期格式化为“yyyymmdd”而不是“dd / mm / yyyy”;这是使用format()函数完成的。
  3. 下面我重写了你的功能,以便它完成这两件事:

    Function Copy_Of_Import_Macro_TEST(bankDate As Variant)
    
        On Error GoTo Copy_Of_Import_Macro_TEST_Err
    
        Dim filePath As String
        Dim fmtBankDate As String
    
        filePath = "C:\myFolder\"
        fmtBankDate = Format(bankDate, "yyyymmdd")
    
        DoCmd.TransferText acImportDelim, "Import_spec", "BankFile", "" & filePath & "" & fmtBankDate & " - filename.csv", True, ""
    
    
    Copy_Of_Import_Macro_TEST_Exit:
            Exit Function
    
    Copy_Of_Import_Macro_TEST_Err:
            MsgBox Err.Description
            Resume Copy_Of_Import_Macro_TEST_Exit
    
    End Function
    

    以下是我们在上述功能中设置的一些注意事项:

    enter image description here

    上面的函数只是构造数据实际传递之前的数据段落;通过调用函数 - ,它仍然必须启动 - 因为我们已经声明了一个参数(bankDate),我们必须说什么数据将传递到该参数所在的空间中的函数。在我们的例子中,数据将转到当前txtBankDate的任何日期。

    因此需要像这样调用函数:

        Copy_Of_Import_Macro_TEST Me.txtBankDate
    

    那么为了说明函数是什么以及作为该函数的bankDate参数传递的内容:

    enter image description here

    然后,您需要决定从哪个事件运行此函数调用(某些事情需要触发此调用)。在我的模型中,我创建了一个命令按钮,并在该命令按钮的点击事件上运行上述函数调用:

    这可以通过进入表单的设计视图,选择命令按钮,转到属性表的“事件”选项卡,单击“单击”事件的[...]按钮,然后选择“代码生成器”来完成。 “打开VBA编辑器。

    enter image description here

    Private Sub cmdExportCsv_Click()
    
        Copy_Of_Import_Macro_TEST Me.txtBankDate
    
    End Sub
    

    将要发生的事情的顺序是:

    1. 您将使用日历选择器选择日期
    2. 日期将进入txtBankDate文本框
    3. 您将点击导出到csv命令按钮
    4. 这将触发按钮的点击事件上的任何代码,即:

      Copy_Of_Import_Macro_TEST Me.txtBankDate

    5. 调用函数Copy_Of_Import_Macro_TEST,将来自txtBankDate的数据作为参数进行调用。

    6. 该函数将重新格式化来自txtBankDate的数据,使其显示为“yyyymmdd”而不是“dd / mm / yyyy”
    7. 然后,这个重新格式化的日期将被添加到filename方法的DoCmd.TransferText参数中,以便您的文件名显示如下:
    8.   

      C:\ myFolder \ 20150821 - filename.csv

      希望这能更好地解释它。

      其他评论

      我已将MsgBox Error$行更改为MsgBox Err.Description,因为我认为Error$已被弃用。

      严格地说Copy_Of_Import_Macro_TEST应该是一个子程序而不是一个函数(函数应该返回一个值,而子程序则不是)。

      您可能还想考虑txtBankDate字段上的一些验证,该字段首先检查在运行函数之前是否已输入日期,否则文件名将不会显示日期。