2008-12-08 13 views
2

J'ai essayé avec un succès limité d'exporter un ensemble de résultats de requête de tableau croisé vers Excel à l'aide d'Access 2003. Parfois, l'exportation fonctionne correctement et Excel s'affiche sans erreur. D'autres fois, en utilisant exactement les mêmes paramètres de requête, j'obtiens une erreur 3190 - trop de champs. J'utilise l'option TransferSpreadsheet dans une macro appelée à partir du code VB.Exportation de résultats de requête de tableau croisé vers Excel à partir de MS Access

La macro a les paramètres suivants: Type de transfert: Exporter Type de feuille de calcul: Microsoft Excel 8-10 Nom de la table: (ce qui est mon nom de la requête) Nom du fichier: (fichier de sortie Excel, qui existe dans le répertoire A Noms de champs: Oui

La requête ne doit pas générer plus de 14 colonnes d'informations, la limite Excel 255 col ne devrait donc pas poser de problème. De plus, les données de la base de données ne changent pas pendant l'interrogation, donc la même requête produira le même jeu de résultats.

L'une des seules solutions que j'ai lues sur le net jusqu'à présent est de fermer le jeu d'enregistrements avant d'exécuter la macro, mais cela est aléatoire.

Vos pensées/aide sont grandement appréciées!

+0

Exportez-vous chaque fois le même fichier Excel? Est-ce que le tableau croisé renvoie un nombre variable de colonnes? Et, juste vaguement possible, avez-vous installé SP3 et le correctif SP3? – Fionnuala

Répondre

1

J'en ai un qui fonctionne comme une macro MS Access. Il utilise une action CopierVers avec:

  • Type d'objet = Recherche
  • Nom de l'objet = [WhateverQueryName]
  • Format de sortie = Microsoft® Excel (* .xls.)
  • Auto Start = No
  • (tout le reste est vide)

Je déteste utiliser Macros dans MS Access (ça sent malpropre), mais peut-être essayer.

0

Une solution de contournement consiste à ajouter d'abord la requête à une table, puis à l'exporter. TempTable-Make est une requête de création de table basée sur le tableau croisé.

Here est une fonction ExportToExcel appropriée que vous pouvez utiliser.

1

Si vous êtes prêt à utiliser un petit vba plutôt que de coller exclusivement avec des macros, ce qui suit pourrait vous aider. Ce module prend n'importe quel sql que vous lui lancez et l'exporte vers un emplacement défini dans une feuille de calcul Excel. Après le module sont deux exemples de son utilisation, un pour créer un classeur complètement nouveau, un qui ouvre un existant. Si vous n'êtes pas sûr de l'utilisation de SQL, créez simplement la requête que vous voulez, enregistrez-la, puis fournissez "SELECT * FROM [YourQueryName]" au Sub en tant que paramètre QueryString.

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 

Exemple 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 

Exemple 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 

Espoir qui est d'une certaine utilité pour vous.

Questions connexes