VBA(?):将 Microsoft Access 数据库记录到数据集(列出表/字段/带字段的查询)

Posted

技术标签:

【中文标题】VBA(?):将 Microsoft Access 数据库记录到数据集(列出表/字段/带字段的查询)【英文标题】:VBA(?): Document Microsoft Access Database to dataset (list tables/fields/queries w/ fields) 【发布时间】:2019-03-15 10:18:30 【问题描述】:

寻找一种可以获取 Access 数据库并导出类似内容的方法:

| Type           |   Name       |   Field     |     Field Type      |     Example values         |  SQL                                     |
| Table          |   Table1     |   Field1    |     String          |     Field example 1/2/3    |                                          | 
| Table          |   Table1     |   Field2    |     String          |     Field example 1/2/3    |                                          |
| Table          |   Table1     |   Field3    |     String          |     Field example 1/2/3    |                                          |
| ViewOutput     | SelectedCols |   Field 1   |     ...             |     Field example 1/2/3    |                                          |
| ViewOutput     | SelectedCols |   Field 2   |     ...             |     Field example 1/2/3    |                                          |
| ViewDefinition | SelectedCols |   Field 1   |     Field Type      |                            |  SELECT [field1], [field2] from [Table1] |

换句话说:

显示的电子表格/数据集 按名称列出的所有表,以及基础字段名/类型/显示的一些示例列值 (*) 按名称列出的所有视图,以及定义的字段名和示例值 (*)

* 理想情况下/可选地,我得到三个用逗号分隔的示例字段值

这将是从 Access 迁移到更重要的数据库的一个惊人的起点,非常感谢您的帮助。

【问题讨论】:

这个问题本身就太宽泛了,因为它需要大量代码来将 Access 连接到 Excel、遍历表和查询、从表中获取示例值等。但是,Access 确实内置数据库记录器,只需单击一个按钮即可完成大约一半的工作。 Excel 输出是可选的,只要输出的是表格数据(例如 CSV)。一个体面的答案可能是如何在 VBA Access 中公开/读取内部以导出/进一步处理,恕我直言,不太宽泛。我可以想象不同的价值观,使其过于宽泛,使其成为可选。 最后:Access 数据库记录器导出非结构化数据 (PDF),恕我直言,这不是一个可行的解决方案。 你可以看ADO然后用这个连接数据库,并打开schema,connection.openschema()看这个参数,告诉你大部分你想要什么,我建议您对表格进行select top x 查询,以便为您提供示例结果。 Here 有一个获取表和字段的例子。您也可以调整它以获取仅更改几个单词的查询(而不是For Each tdf In db.TableDefs,您应该使用For Each qdf In db.QueryDefs 等等。 【参考方案1】:

在我看来,这个问题确实太笼统了,没有任何努力,但至少你可以有一个起点。我做了一个列出表和查询的代码(不包括 SYS 表,但您可以根据需要对其进行调整)。它还列出了字段名称和类型。

关于获取示例值,您需要为每个对象打开一个记录集,执行此代码非常耗时。此外,当查询/表可能有 0、1 或 2 时,您要求 1-3 个值,因此还必须每次检查记录数等等。 所以我忽略了那部分。

但至少代码会得到带有名称、字段和字段名的表和查询。

奖励:是的,它也会得到查询的 SQL 代码。

Private Sub SHOW_DB_INFO()

Dim db As Database
Dim tdf As TableDef
Dim x As Integer
Dim i As Double

Dim AppExcel As Object
Dim WK As Object

Set AppExcel = CreateObject("Excel.Application")
AppExcel.Visible = False
AppExcel.ScreenUpdating = False
AppExcel.Workbooks.Add

Set WK = AppExcel.ActiveWorkbook.ActiveSheet




Set db = CurrentDb


For Each tdf In db.TableDefs
   If Left(tdf.Name, 4) <> "MSys" Then ' Don't enumerate the system tables
      For x = 0 To tdf.Fields.Count - 1
        i = i + 1
        WK.Range("A" & i).Value = "Table"
        WK.Range("B" & i).Value = tdf.Name
        WK.Range("C" & i).Value = tdf.Fields(x).Name
        WK.Range("D" & i).Value = FLD_TYPENAME(tdf.Fields(x).Type) 'enumeration can be found here: https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/datatypeenum-enumeration-dao
      Next x
   End If
Next tdf

Dim qdf As QueryDef
For Each qdf In db.QueryDefs
    For x = 0 To qdf.Fields.Count - 1
        i = i + 1
        WK.Range("A" & i).Value = "Query"
        WK.Range("B" & i).Value = qdf.Name
        WK.Range("C" & i).Value = qdf.Fields(x).Name
        WK.Range("D" & i).Value = FLD_TYPENAME(qdf.Fields(x).Type)
        WK.Range("E" & i).Value = qdf.SQL
    Next x
Next qdf

AppExcel.Visible = True
AppExcel.ScreenUpdating = True

Set WK = Nothing
Set AppExcel = Nothing

End Sub

你还需要这个 UDF

Private Function FLD_TYPENAME(ByVal vType As Integer) As String
Select Case vType
    Case Is = 101: FLD_TYPENAME = "Attachment data"
    Case Is = 16: FLD_TYPENAME = "Big Integer data"
    Case Is = 9: FLD_TYPENAME = "Binary data"
    Case Is = 1: FLD_TYPENAME = "Boolean (True/False) data"
    Case Is = 2: FLD_TYPENAME = "Byte (8-bit) data"
    Case Is = 18: FLD_TYPENAME = "Text data (fixed width)"
    Case Is = 102: FLD_TYPENAME = "Multi-valued byte data"
    Case Is = 108: FLD_TYPENAME = "Multi-value decimal data"
    Case Is = 106: FLD_TYPENAME = "Multi-value double-precision floating-point data"
    Case Is = 107: FLD_TYPENAME = "Multi-value GUID data"
    Case Is = 103: FLD_TYPENAME = "Multi-value integer data"
    Case Is = 104: FLD_TYPENAME = "Multi-value long integer data"
    Case Is = 105: FLD_TYPENAME = "Multi-value single-precision floating-point data"
    Case Is = 109: FLD_TYPENAME = "Multi-value Text data (variable width)"
    Case Is = 5: FLD_TYPENAME = "Currency data"
    Case Is = 8: FLD_TYPENAME = "Date value data"
    Case Is = 20: FLD_TYPENAME = "Decimal data (ODBCDirect only)"
    Case Is = 7: FLD_TYPENAME = "Double-precision floating-point data"
    Case Is = 21: FLD_TYPENAME = "Floating-point data (ODBCDirect only)"
    Case Is = 15: FLD_TYPENAME = "GUID data"
    Case Is = 3: FLD_TYPENAME = "Integer data"
    Case Is = 4: FLD_TYPENAME = "Long Integer data"
    Case Is = 11: FLD_TYPENAME = "Binary data (bitmap)"
    Case Is = 12: FLD_TYPENAME = "Memo data (extended text)"
    Case Is = 19: FLD_TYPENAME = "Numeric data (ODBCDirect only)"
    Case Is = 6: FLD_TYPENAME = "Single-precision floating-point data"
    Case Is = 10: FLD_TYPENAME = "Text data (variable width)"
    Case Is = 22: FLD_TYPENAME = "Data in time format (ODBCDirect only)"
    Case Is = 23: FLD_TYPENAME = "Data in time and date format (ODBCDirect only)"
    Case Is = 17: FLD_TYPENAME = "Variable Binary data (ODBCDirect only)"
    Case Else: FLD_TYPENAME = "Not found/Unknown"
End Select

End Function

代码必须从 Access 本身执行。将两个代码粘贴到一个模块中,然后执行它。

希望您可以根据自己的需要进行调整。

【讨论】:

这真是太棒了,我会很困惑地得到最后一列的示例值。非常感谢。 谢谢你的话。我必须承认,当 OP 没有表现出任何努力时,我通常不会发布答案,但在你的情况下,你有近 1000 个代表,所以我想你过去帮助过其他领域的其他用户,我做到了:)。希望您可以根据自己的需要进行调整。【参考方案2】:

打印或导出结构的功能是内置访问。

从功能区的数据库工具下,选择数据库 Documenter。

选择表格选项卡,选择您要报告的表格。

在你点击确定之前,请确保你点击了这样的选项:

结果是这样的:

在查看上述内容时,您可以打印,甚至可以导出到 excel。

【讨论】:

我敢你在学生 MS 模板 db 上使用数据库记录器并导出到 excel 并报告经验。

以上是关于VBA(?):将 Microsoft Access 数据库记录到数据集(列出表/字段/带字段的查询)的主要内容,如果未能解决你的问题,请参考以下文章

VBA(?):将 Microsoft Access 数据库记录到数据集(列出表/字段/带字段的查询)

Microsoft Access,计算 - 文本框控件源与 VBA 函数

将 Microsoft Access 作为计划任务运行后退出

Microsoft Access 不会处理 vba

Microsoft Access VBA 插入错误

使用 VBA 在 Microsoft Access 中创建表单