2017-02-26 359 views
3

MS-Accessクロス集計クエリをエクスポートしようとしていますが、「クロス集計列ヘッダーが多すぎます」というエラーメッセージが表示されます。MS Accessクロス集計クエリを使用したクロスタブ列ヘッダーエラーが多すぎます

the error

結局のところ、MS-Accessは、列の数クエリに制限があり(255列)を有することができます。

いくつかのオンライン検索の後、私は実行可能なソリューションに遭遇しませんでした... 1つの解決策は、255未満の列で複数のものに分割していますが、列は未知である可能性があります。実装するのは本当に簡単な作業ではありません。

255を超える列を含むクロス集計クエリをExcelファイルにエクスポートする方法はありますか。さらに具体的には、VBAコードを使用するソリューションはありますか?

+0

クロス集計SQLとExcelエクスポートコードを送信してください。 'WHERE'またはクロス集計の' IN() '節を使用してクロス集計を複数の問合せに分割する必要があります。 – Parfait

答えて

4

私の提案する解決策は、通常の(非クロス集計)クエリとしてクエリを使用し、それをExcelファイルにエクスポートしてから、そのファイルに「ピボットテーブル」(クロスタブと同じ)を作成することです。これは手動で行うこともできますが、コードを使用して自動処理にしたかったのです。

Sub export_query_to_pivot(query_name As String, folder_name As String, file_name As String) 

    ' Outputs the query to an excel file in the chosen path, and creates a pivot table 
    If folder_name <> "" Then 

     MsgBox "Exporting begins! Do not open the file until a message appears" 

     ' Output the query to excel file 
     DoCmd.OutputTo acOutputQuery, query_name, acFormatXLSX, folder_name & file_name 

     ' --------- Manipulate the excel file to create a pivot table using code 
     ' Using a mechanism called "Late-Binding" to handle the excel file (notice we define it as an "Object", and then set the object type) 
     Dim excel_object As Object 
     Dim work_book As Object 
     Dim src_sheet As Object 
     Dim pivot_sheet As Object 
     Dim last_row As Long 
     Dim last_column As Long 

     Set excel_object = CreateObject("Excel.Application") ' Instantiate the Excel instance 
     Set work_book = excel_object.Workbooks.Open(folder_name & file_name) ' Open the workbook 
     Set src_sheet = work_book.Sheets(1) ' Set the source sheet (the outputted query data) 
     Set pivot_sheet = work_book.Sheets.Add ' Create a new sheet for the pivot table 

     last_row = src_sheet.Range("A" & src_sheet.Rows.Count).End(-4162).row ' Get the index of the last row 
     last_column = src_sheet.Range("A1").End(-4161).Column ' Get the index of the last column 

     src_sheet.Name = "Source_Sheet" ' Change the name of the source sheet to..... "Source_Sheet"! 
     pivot_sheet.Name = "Pivot_Sheet" ' ...You get the idea 

     ' -------- Create the pivot table -------- ' 
     work_book.PivotCaches.Create(SourceType:=1, SourceData:="Source_Sheet!R1C1:R" & CStr(last_row) & "C" & CStr(last_column), Version:=1) _ 
      .CreatePivotTable TableDestination:="Pivot_Sheet!R1C1", _ 
      TableName:="PivotTable1", DefaultVersion:=1 

     src_sheet.Select 
     src_sheet.Cells(3, 1).Select 

     ' -------- Set the pivot table rows, column, and value: -------- ' 
     ' The last column of the query is the field for the Pivot Value & Column 

     Dim i As Integer 
     Dim field_name As String 
     For i = 1 To last_column 

      field_name = src_sheet.Cells(1, i).Value ' Get the field name 

      If i <> last_column Then 
       ' Set the row fields 
       With pivot_sheet.PivotTables("PivotTable1").PivotFields(field_name) 
        .Orientation = 1 ' 1 = xlRowField constant in early binding 
        .Position = i 
       End With 
      Else ' Last column 
       ' Create the value field 
       pivot_sheet.PivotTables("PivotTable1").AddDataField pivot_sheet.PivotTables(_ 
        "PivotTable1").PivotFields("Full_Name"), "Count of " & field_name, -4112 ' -4112 = xlCount constant 
       ' Create the column field 
       With pivot_sheet.PivotTables("PivotTable1").PivotFields(field_name) 
        .Orientation = 2 ' 2 = xlColumnField constant in early binding 
        .Position = 1 
       End With 
      End If 

      ' Turn off all subtotals: 
      pivot_sheet.PivotTables("PivotTable1").PivotFields(field_name).Subtotals _ 
      = Array(False, False, False, False, False, False, False, False, False, False, False, False) 

     Next i 

     ' -------- Change the pivot table properties --------' 

     ' Turn sheet from left to right 
     pivot_sheet.DisplayRightToLeft = False 
     ' Turn off row grand totals 
     pivot_sheet.PivotTables("PivotTable1").RowGrand = False 
     ' Turn on label repeat 
     pivot_sheet.PivotTables("PivotTable1").RepeatAllLabels 2 ' 2 = xlRepeatLabels in early binding 
     ' Show in Tabular Form 
     pivot_sheet.PivotTables("PivotTable1").RowAxisLayout 1 ' 1= xlTabularRow in early binding 
     ' Put 0 in empty cells 
     pivot_sheet.PivotTables("PivotTable1").NullString = "0" 

     pivot_sheet.Select 

     ' -------- Save & Close the workbook -------- ' 
     work_book.Save 
     work_book.Close 
     Set work_book = Nothing 
     Set excel_object = Nothing 
     Set src_sheet = Nothing 
     Set pivot_sheet = Nothing 

     MsgBox "Done Exporting!" 
    End If 
End Sub 

このコードは使用しています:私は(!255のを超える列を持つ)Excelファイルに与えられたMS-Accessクエリを出力し、ピボットテーブルにそれを操作し、このVBAサブを、書かれている

入力クエリの最後の列を値&ピボットテーブルの列見出しと残りの列を行見出しとして入力します。

コードからわかるように、ピボットテーブルのプロパティを設定する行があります。あなたはそれらの行を変更することができます&新しいものを追加します。 PivotTable object hereについて詳しく読むことができます。

使用例:

Dim query_name As String 
Dim folder_name As String 
Dim file_name As String 

query_name = "rare_cats_query" 
file_name = "Rare_Cats_Pivot.xlsx" 
folder_name = "C:\Users\Drump\Desktop\" 

' Create the pivot table using the function "export_query_to_pivot" 
export_query_to_pivot query_name, folder_name, file_name 

当社は、ユーザーのデスクトップに "Rare_Cats_Pivot.xlsx" という名前のExcelファイルにクエリ "rare_cats_query" をエクスポートします。ピボットテーブルが新しいスプレッドシートに作成されます。

関連する問題