【问题标题】:Using a pop up calendar in Access to create a Dim Value withn a Macro在 Access 中使用弹出日历在宏中创建暗值
【发布时间】:2015-08-20 00:26:23
【问题描述】:

我真的是 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

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

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

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

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

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

    不过,您的函数需要能够在调用它时采用 txtBankDate 中的日期,然后根据您想要的文件名将其从“dd/mm/yyyy”格式更改为“yyyymmdd” .这意味着您的函数需要以下内容:

    1. 一个允许您引用文本框的参数,因为您需要能够在函数中使用该数据(将其视为一个小漏斗,以便在调用函数时将必要的数据输入函数)李>
    2. 一旦您设置了漏斗(参数)以允许文本框中的数据进入您的函数,您将需要您的函数将日期格式化为“yyyymmdd”而不是“dd/mm/yyyy”;这是使用format() 函数完成的。

    下面我重新编写了你的​​函数,以便它完成这两件事:

    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
    

    以下是我们在上述函数中设置的一些注释:

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

    所以函数需要这样调用:

        Copy_Of_Import_Macro_TEST Me.txtBankDate
    

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

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

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

    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_TESTtxtBankDate 中的数据作为参数调用。

    6. 该函数将重新格式化从txtBankDate 导入的数据,使其读取为“yyyymmdd”而不是“dd/mm/yyyy”

    7. 然后,这个重新格式化的日期将被添加到 DoCmd.TransferText 方法的 filename 参数中,以便您的文件名如下所示:

    C:\myFolder\20150821 - 文件名.csv

    希望这能更好地解释它。

    其他评论

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

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

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

    【讨论】:

    • 非常感谢。我今天将尝试该解决方案。
    • 感谢马特的回复。我不确定如何编写从日历中获取值的代码。我是否正在创建一个事件并将其分配给对象/表单?我有一个名为 dtpicker 的日期选择器表单,我看到可以分配一个事件来更新日历。不确定代码如何将该值放入您为我创建的变量中。对不起
    • Private Sub DTPicker_Updated(Code As Date) Copy_Of_Import_Macro_TEST Me.bankDate End Sub
    • @derekweaver 不用担心.. 我已经编辑了我的答案,希望能更好地解释一切:) 要记住的重要一点是函数/子例程有 2 个部分。第一个是编写函数/子本身,这就像关闭水管。第二个是函数/子调用,它本质上是打开水并希望你的管道能达到你想要的效果。第二部分通常也需要从事件中编写。
    • 嗨,马特,当我尝试使用银行日期参数调用函数时,它不喜欢函数名称。我是否需要创建一个与主函数分开的新函数才能使其工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2016-07-17
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多