2016-05-17 90 views
0

我想将所有查询从MS Access导出到Excel。我目前能够导出所有非生成表查询,但是,我没有看到生成表查询弹出。有没有办法以以类似的方式导出生成表查询?谢谢。MS Access 2010:如何将所有生成表查询字段导出到Excel

Sub ListQueriesAndFields() 
'Macro Purpose: Write all Query and field names to and Excel file 
'Source: vbaexpress.com/kb/getarticle.php?kb_id=707 
'Updates by Derek - Added column headers, modified base setting for loop to include all fields, 
'     added type, size, and description properties to export 
'Updates by Alex - Converted to be used for Queries instead of Tables. 

Dim lTbl As Long 
Dim lFld As Long 
Dim dBase As Database 
Dim xlApp As Object 
Dim wbExcel As Object 
Dim lRow As Long 

'Set current database to a variable and create a new Excel instance 
Set dBase = CurrentDb 
Set xlApp = CreateObject("Excel.Application") 
Set wbExcel = xlApp.workbooks.Add 

'Set on error in case there are no tables 
On Error Resume Next 

'DJK 2011/01/27 - Added in column headers below 
lRow = 1 
With wbExcel.sheets(1) 
    .Range("A" & lRow) = "Table Name" 
    .Range("B" & lRow) = "Field Name" 
    .Range("C" & lRow) = "Type" 
    .Range("D" & lRow) = "Size" 
    .Range("E" & lRow) = "Description" 
End With 


'AMK - Converted 5/2/2016 for use with Queries instead of Tables 
For lQry = 0 To dBase.QueryDefs.Count 
    'If the table name is a temporary or system table then ignore it 
    If Left(dBase.QueryDefs(lQry).Name, 1) = "~" Or _ 
    Left(dBase.QueryDefs(lQry).Name, 4) = "MSYS" Then 
     '~ indicates a temporary table 
     'MSYS indicates a system level table 
    Else 
     'Otherwise, loop through each query, writing the query and field names 
     'to the Excel file 
     For lFld = 0 To dBase.QueryDefs(lQry).Fields.Count - 1 'DJK 2011/01/27 - Changed initial base from 1 to 0, and added type, size, and description 
      lRow = lRow + 1 
      With wbExcel.sheets(1) 
       .Range("A" & lRow) = dBase.QueryDefs(lQry).Name 
       .Range("B" & lRow) = dBase.QueryDefs(lQry).Fields(lFld).Name 
       .Range("C" & lRow) = dBase.QueryDefs(lQry).Fields(lFld).Type 
       .Range("D" & lRow) = dBase.QueryDefs(lQry).Fields(lFld).Size 
       .Range("E" & lRow) = dBase.QueryDefs(lQry).Fields(lFld).Properties("Description") 
      End With 
     Next lFld 
    End If 
Next lQry 
'Resume error breaks 
On Error GoTo 0 

'Set Excel to visible and release it from memory 
xlApp.Visible = True 
Set xlApp = Nothing 
Set wbExcel = Nothing 

'Release database object from memory 
Set dBase = Nothing 

末次

+0

你应该有什么工作。我有一个完全按照你的方式工作的导出例程(在QueryDef部分),它也通过'Type = dbQMakeTable'提取查询。注意:你的第一个For应该去'Count -1'。 –

+0

@HansUp,Make Table Query使用SQL CREATE,不一定需要SELECT INTO。 –

+0

我的解决方法是获取创建的实际表(因此存在于我在表上运行的VBA输出中(与上面的代码非常类似,仅用于表)。但是,我必须仍然匹配make我的最终结果必须是所有查询名称+它们的字段名称 –

回答

0

你有什么应该工作。我有一个和你的完全一样的导出例程(在QueryDef部分),它也提取了Type = dbQMakeTable的查询。

但是,生成表查询可能没有字段名称,所以您的第二个For循环不会产生任何结果,使您认为它不起作用。

使用您的调试器检查您是否获得Make Table Queries,然后检查字段。也许这些查询只设置SQL来制作表格。然后您可以分析SQL。它看起来像CREATE TABLE <name> (<fields...>);

+0

对于已保存的CREATE TABLE查询,QueryDef.Type属性是dbQDDL(96),而不是'dbQMakeTable'(80)。 – HansUp

+0

嗯,所以Make Table Query可能没有任何字段,只是被定义为保存的SQL语句?就像MySQL中的视图一样? –