【问题标题】:Immediately setting a variable to nothing立即将变量设置为空
【发布时间】:2015-09-16 20:06:31
【问题描述】:

我使用了我在这个网站上找到的这段代码的变体,它运行良好。我的问题是,我无法理解在定义 qdf 后立即将其设置为空的原因。显然它不会破坏这个过程,一切正常,但在我未经训练的眼睛看来,它不应该。为什么在代码中,为什么不清空变量的SQL代码,什么都不导出到excel?

Sub Export()
    Dim cdb As DAO.Database, qdf As DAO.QueryDef
    Set cdb = CurrentDb

    Const xlsxPath = "redacted 1"

    ' create .xlsx file if it doesn't already exist, and add the first worksheet

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Ledger Data by Channel", xlsxPath, True


    'file exists now, so this will add a second worksheet to the file
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Premium Reserves", xlsxPath, True

    Set qdf = cdb.CreateQueryDef("Reserve-from Wakely", _
            "SELECT * FROM [redacted 4] UNION SELECT * FROM [PAI ALR] UNION SELECT * FROM [Prior Month PAI DAC]")
    Set qdf = Nothing
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "redacted 2", xlsxPath, True
    DoCmd.DeleteObject acQuery, "Reserve-from Wakely"

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "redacted 3", xlsxPath, True

    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Claims Data", xlsxPath, True

    Set cdb = Nothing
End Sub

【问题讨论】:

  • 一个 QueryDef 被创建然后被销毁,但它不再被引用;它不是工作代码的一部分。这三个事件(声明、设置、设置为空)可以被删除并且什么都不会改变。这可能是编码人员正在探索并放弃支持DoCmd.TransferSpreadsheet ...的一种途径。
  • ...对于一般的“我必须将内容设置为Nothing”问题,请参阅When should an Excel VBA variable be killed or set to Nothing?

标签: vba


【解决方案1】:

这是因为 QueryDef 不仅包含在 qdf 变量中,而且还存储在 QueryDefs 集合中并保存到磁盘...

这里解释:https://msdn.microsoft.com/en-us/library/office/ff845129(v=office.14).aspx

要创建新的 QueryDef 对象,请使用 CreateQueryDef 方法。在 Microsoft Access 工作区中,如果您为 name 参数提供字符串,或者如果您将新 QueryDef 对象的 Name 属性显式设置为非零长度字符串,您将创建一个永久 QueryDef,它将自动附加到QueryDefs 集合并保存到磁盘

【讨论】:

  • 这仍然是一种令人困惑的编码实践。他们应该把它放在一个声明的形式:cdb.CreateQueryDef "Reserve-from Wakely", "SELECT *".
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多