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 函数