3

Access 2003 を使用して、クロス集計クエリの結果セットを Excel にエクスポートしようとしましたが、うまくいきませんでした。時折、エクスポートが正しく機能し、Excel がエラーなしで表示されます。また、まったく同じクエリ パラメータを使用すると、3190 エラー (フィールドが多すぎます) が発生することもあります。VB コードから呼び出されるマクロで TransferSpreadsheet オプションを使用しています。

マクロには次のパラメータがあります。 転送タイプ: エクスポート スプレッドシート タイプ: Microsoft Excel 8-10 テーブル名: (これは私のクエリ名です) ファイル名: (ディレクトリに存在する Excel 出力ファイル) フィールド名があります: はい

クエリは 14 列を超える情報を生成してはならないため、Excel の 255 列の制限は問題になりません。また、クエリを実行している間、データベース内のデータは変更されないため、同じクエリで同じ結果セットが生成されます。

私がこれまでにネットで読んだ唯一の解決策の 1 つは、マクロを実行する前にレコードセットを閉じることですが、これはうまくいかなかったかのどちらかです。

あなたの考え/助けは大歓迎です!

4

4 に答える 4

2

MS Access マクロとして機能するものがあります。以下の OutputTo アクションを使用します。

  • オブジェクト タイプ = クエリ
  • オブジェクト名=[WhateverQueryName]
  • 出力形式=MicrosoftExcel(*.xls)
  • 自動開始=いいえ
  • (残りはすべて空白)

私は MS Access でマクロを使うのは嫌いですが (不潔に感じます)、試してみてください。

于 2008-12-08T15:25:48.807 に答える
1

マクロだけに固執するのではなく、少しの vba を利用したい場合は、次の方法が役立ちます。このモジュールは、スローされた SQL を受け取り、Excel ワークシートの定義された場所にエクスポートします。モジュールの後に 2 つの使用例があります。1 つは完全に新しいワークブックを作成するためのもので、もう 1 つは既存のワークブックを開くためのものです。SQL の使用に自信がない場合は、必要なクエリを作成して保存し、「SELECT * FROM [YourQueryName]」を QueryString パラメータとして Sub に指定します。

Sub OutputQuery(ws As excel.Worksheet, CellRef As String, QueryString As String, Optional Transpose As Boolean = False)

    Dim q As New ADODB.Recordset
    Dim i, j As Integer

    i = 1

    q.Open QueryString, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly


    If Transpose Then
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(j, 0).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(j, 0).EntireRow.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(j, i).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    Else
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(0, j).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(0, j).EntireColumn.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(i, j).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    End If

    q.Close

End Sub

例 1:

Sub Example1()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Add
    Set ws = wb.Sheets(1)

    OutputQuery ws, "A1", "Select * From [TestQuery]"
End Sub

例 2:

Sub Example2()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Open("H:\Book1.xls")
    Set ws = wb.Sheets("DataSheet")

    OutputQuery ws, "E11", "Select * From [TestQuery]"
End Sub

それがあなたに役立つことを願っています。

于 2009-03-06T13:32:03.390 に答える
0

回避策は、最初にクエリをテーブルに追加してからエクスポートすることです。

DoCmd.SetWarnings False
 DoCmd.OpenQuery "TempTable-Make" 
 DoCmd.RunSQL "DROP TABLE TempTable" 
 ExportToExcel()
DoCmd.SetWarnings True

TempTable-Make は、クロス集計に基づくテーブル作成クエリです。

以下は、使用できる適切な ExportToExcel 関数です。

于 2008-12-10T15:35:50.797 に答える