2012-01-03 2 views
8

J'ai un projet dont l'objectif principal est de générer Excel (Rapport) en cliquant sur le bouton d'un bouton dans Access en utilisant VBA.VBA - Générer un fichier Excel à partir d'Access (QueryTable)

Le contenu de ce rapport est le résultat d'une base de données SQL Server stockée.

la ligne d'erreur:

With MeuExcel.Worksheets(4) 
    .QueryTables.Add connection:=rs, Destination:=.Range("A2") 
End With 

je reçois est:

invalid procedure call or argument (erro '5') 

code complet (Edité en utilisant remou Conseils):

Sub GeraPlanilhaDT() 

Dim MeuExcel As New Excel.Application 
Dim wb As New Excel.Workbook 

Set MeuExcel = CreateObject("Excel.Application") 
MeuExcel.Workbooks.Add 

MeuExcel.Visible = True 

Dim strNomeServidor, strBaseDados, strProvider, strConeccao, strStoredProcedure As String 

strNomeServidor = "m98\DES;" 
strBaseDados = "SGLD_POC;" 
strProvider = "SQLOLEDB.1;" 
strStoredProcedure = "SP_ParametrosLeads_DT" 

strConeccao = "Provider=" & strProvider & "Integrated Security=SSPI;Persist Security Info=True;Data Source=" & strNomeServidor & "Initial Catalog=" & strBaseDados 

Dim cnt As New ADODB.connection 
Dim cmd As New ADODB.command 
Dim rs As New ADODB.recordset 
Dim prm As New ADODB.parameter 

cnt.Open strConeccao 

cmd.ActiveConnection = cnt 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = strStoredProcedure 
cmd.CommandTimeout = 0 

Set prm = cmd.CreateParameter("DT", adInteger, adParamInput) 
cmd.Parameters.Append prm 
cmd.Parameters("DT").Value = InputBox("Digite o Código DT", "Código do Distribuidor") 

Set rs = cmd.Execute() 

Dim nomeWorksheetPrincipal As String 
nomeWorksheetPrincipal = "Principal" 

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = nomeWorksheetPrincipal 



With MeuExcel.Worksheets(4) 
    .QueryTables.Add connection:=rs, Destination:=.Range("A2") 
End With 


cnt.Close 
Set rs = Nothing 
Set cmd = Nothing 
Set strNomeServidor = Nothing 
Set strBaseDados = Nothing 
Set strProvider = Nothing 

If (ActiveSheet.UsedRange.Rows.Count > 1) Then 
    FormataDadosTabela 
Else 
    MsgBox ("Não foi encontrado nenhum Distribuidor com esse DT") 
End If 


End Sub 

La chose étrange est que la le code fonctionne lorsqu'il est exécuté dans Excel mais ne fonctionne pas dans Access

+0

Ok , comme vous, j'ai maintenant du code qui fonctionne dans Excel mais ne fonctionne pas dans Access. Il semble y avoir un problème lors de l'ajout de tables de requête. Je ne peux pas voir pourquoi pour le moment. Je me demande si une solution alternative conviendrait? Par exemple, est-ce que le fait d'écrire simplement les enregistrements dans une feuille de calcul convient? – Fionnuala

+0

FYI: J'ai automatisé Excel Querytables d'Access pendant des années sans problème, mais avec des données d'accès en tant que source. Cependant, je ne l'ai pas essayé dans Office 2010. –

+0

@Rachel Peut-être pourriez-vous poster un code d'accès fonctionnel? – Fionnuala

Répondre

5

Dans Access, vous devez préfixer les objets d'application Excel avec l'instance d'application Excel, par exemple:

With MeuExcel.Worksheets(4).QueryTables.Add(_ 
    connection:=recordset, _ 
    Destination:=Range("A2")) 
End With 

De plus, à moins que vous avez une référence à la bibliothèque Excel, ypu devra fournir la valeur construite -en constantes Excel.

C'est une très mauvaise idée d'utiliser le nom des objets pour les variables. Ne dites pas:

Dim recordset As recordset 
Set recordset = New recordset 

Say, par exemple:

Dim rs As recordset 

Ou bien mieux:

Dim rs As New ADODB.Recordset 

Si vous avez une référence appropriée. Vous pouvez ensuite ignorer CreateObject.

EDIT

Le fournisseur doit être le fournisseur d'accès OLEDB 10, tel qu'il est utilisé pour lier recordsets. Cela me travaille pour créer une table de données via Access à l'aide SQL Server:

strConnect = "Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=True;" _ 
& "Data Source=XYZ\SQLEXPRESS;Integrated Security=SSPI;" _ 
& "Initial Catalog=TestDB;Data Provider=SQLOLEDB.1" 
+0

Merci pour les conseils, mais n'a pas résoudre mon problème – Predoff

4

FWIW, deux choses ressortent:

  1. Comme @Remou a fait remarquer, les références Excel doivent être qualifiés. Actuellement, Range("A2") n'est pas qualifié. Lors de l'exécution du code dans Excel, le ActiveSheet est supposé. Toutefois, lors de l'exécution à partir d'une autre application, cette application recherchera une méthode ou une propriété dans sa propre bibliothèque appelée Range, ce qui vous donnera cette erreur dans Microsoft Access.

  2. Il n'y a pas de code dans le bloc With, vous pouvez donc supprimer les mots-clés With et End With; quand vous faites cela aussi enlever l'extérieur(), comme ceci:

wb.Worksheets(4).QueryTables.Add Connection:=rs, Destination:=wb.Worksheets(4).Range("A2")

Vous pouvez également décaler le bloc With au niveau Worksheet:

With wb.Worksheets(4) 
    .QueryTables.Add Connection:=rs, Destination:=.Range("A2") 
End With 

Update- Accès à l'exemple Excel

Cet exemple de code automatise Excel à partir d'Access, en créant un nouveau classeur et en ajoutant un Querytable à la première feuille. Les données source sont une table Access. Cela va dans Office 2007.

Public Sub ExportToExcel() 
    Dim appXL As Excel.Application 
    Dim wbk As Excel.Workbook 
    Dim wst As Excel.Worksheet 
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 

    Set appXL = CreateObject("Excel.Application") 
    appXL.Visible = True 
    Set wbk = appXL.Workbooks.Add 
    Set wst = wbk.Worksheets(1) 

    Set cn = CurrentProject.AccessConnection 
    Set rs = New ADODB.Recordset 
    With rs 
    Set .ActiveConnection = cn 
    .Source = "SELECT * FROM tblTemp" 
    .Open 
    End With 

    With wst 
    .QueryTables.Add Connection:=rs, Destination:=.Range("A1") 
    .QueryTables(1).Refresh 
    End With 

End Sub 
+0

procédure invalide appel ou argument – Predoff

+0

Merci, mais n'a pas résolu mon problème:/ – Predoff

+0

@Predoff J'ai modifié mon exemple pour remplacer l'objet '' Workbook'' pour le '' Excel Application'' objet. Je ne sais pas si cela va résoudre votre problème, mais c'est plus correct. –

0

Vous ne dites pas la version Office, mais dans Excel 2007/10 un QueryTable est une propriété d'un ListObject si votre code serait comme:

With MeuExcel.Worksheets.ListObjects.Add(Connection:=rs, Destination:=Range("A2")).QueryTable 
+2

Après avoir relu la question, je me rends compte que ce n'est pas le problème - car vous avez une erreur d'exécution. Je pense @RachelHettinger (comme d'habitude) a frappé le clou sur la tête. –

+0

Argument nommé introuvable – Predoff

Questions connexes