【问题标题】:How to use QueryDef to set a name如何使用 QueryDef 设置名称
【发布时间】:2019-06-06 18:03:19
【问题描述】:

我需要从我的访问数据库中导出一个查询到 excel。为了确保我得到正确的信息,我必须遵守一些规则和条件。

最大的障碍是必须选择要导出的对象名称。我正在为 8 个城镇管理一个系统,每个城镇的系统都有多个命名约定。我需要导出显示城镇要求的命名约定的信息。

我首先要做的是创建包含我需要的所有信息的查询。然后我确实从查询中创建了表,并将其导出为表。从那里我使用 TableDef 将名称字段的名称(例如 = “name1” 到 “Name”)更改为更专业的外观。最后根据需要存在的名称,我删除不需要的字段名称并导出到 excel。

我发现这个 QueryDef 以相同的方式运行,但在重命名字段时出现问题。

Select Case displayName
    Case Is = "Name 1"
        db.QueryDefs(queryName).Fields("name1").name = "Name"
        db.QueryDefs(queryName).Fields("name2").VisibleValue = False
    Case Else
        MsgBox ("Name does not extist in system")
End Select

我希望“name1”字段为“名称”,但我收到“无效操作错误”

【问题讨论】:

  • 我强烈建议不要为 Excel 报告运行像 ALTER 这样的 DDL 命令。我不了解您的许多问题,因为所有问题都可以通过查询处理:您可以使用 AS 运算符通过查询更改列名(无需更改表名);您可以在SELECT 子句中指定所需的列(无需删除列);并且您可以将 Access 查询导出到 Excel(无需创建表格)。
  • 我不想执行docmd.CreateQuery 命令并对查询进行硬编码。稍后将添加更多信息并可能删除。您似乎也无法在查询的设计视图中执行选择案例并允许它选择要显示的名称。我的解决方案是修改 VBA 中的查询以获取我需要的条件,并允许它在我输入各种名称参数时动态更改。一旦修改后导出到excel。至于ALTER,我执行它来修改并让访问表包含导出到 Excel
  • 再一次,您所说的一切都可以在不使用表或使用ALTER 重命名和删除列的情况下完成。请编辑您的帖子并显示(而不是告诉)更改查询的特定例程。我们可以向您展示解决方案,而无需接触原始表格。
  • 我删除了我目前拥有的,只显示了我想要实现的目标
  • 对不起,我只关注案例 1

标签: vba ms-access


【解决方案1】:

只需使用动态 SQL 并在 QueryDef.SQL 属性中传递一个字符串:

SQL (在下面使用查询设计保存为查询对象,命名为 mySavedQuery)

SELECT * FROM myOriginalQueryOrTable

VBA (查看所有对 mySavedQuery 的引用)

Dim db   As Database
Dim qdef As QueryDef

Set db = CurrentDb
Set qdef = db.QueryDefs("mySavedQuery")              ' SQL QUERY ABOVE

' UPDATE SQL
Select Case displayName
     Case "Name 1"
     qdef.SQL = "SELECT name1 As [Name], ..." _
              & " FROM myOriginalQueryOrTable" _
              & " WHERE ..." _
              & " GROUP BY ..." _
              & " ORDER BY ..."

     Case Else
     MsgBox ("Name does not extist in system")
End Select

Set qdef = Nothing                                   ' SAVES NEW SQL
Set db = Nothing

' EXPORT TO EXCEL
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "mySavedQuery", _
      "C:\Path\To\Output\Spreadsheet.xlsx", True, "OUTPUT!"

【讨论】:

  • 我不知道你可以那样做。我喜欢。有没有办法不在查询中显示项目?说出名称 2-5,它们仍然会显示,因为它们没有隐藏。
  • 我尝试按照您的建议进行操作,但似乎可行,但传输电子表格命令出现问题。 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "qry_Outfall_Report_DryWeather_All", fileName 我收到“qry_Outfall_Report_DryWeather_All”引起的循环引用错误
  • 我仍然遇到循环引用问题。我确实将格式更改为 Excel12。我正在使用 ArcGIS,他们从 2016 年开始不再支持 xlsx,所以我需要使用 xls 允许我使用 ARC 阅读它
  • 您绝对不能在 very 查询中引用 same 查询名称。在 QueryDef 分配中使用不同的查询,可能是 querytemp
  • Dim qdef1 as QueryDef set qdef1 = db.QueryDefs(qdef) DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, qdef1, "C:\Path\To\Output\Spreadsheet.xlsx", True, "OUTPUT!"
猜你喜欢
  • 2016-04-13
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2019-07-12
相关资源
最近更新 更多