2016-09-29 4 views
1

Ein Teil meiner VBA-Code kopiert die Access-Abfragen in ein Excel-Blattdie Access-Abfrage in eine Excel-Tabelle kopieren VBA versagt

MyConn = Worksheets("eingaben").Range("B2").Value 
Set cnn = New ADODB.Connection 
With cnn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .Open MyConn 
End With 

For i = 0 To 14 
' 
SSQL = "SELECT * FROM [" & marrSql(i) & "];" 

Set cmdCommand = New ADODB.Command 
Set cmdCommand.ActiveConnection = cnn 
With cmdCommand 
    .CommandText = SSQL 
End With 

Debug.Print marrSql(i) 
Set rst = New ADODB.Recordset 
'rst.CursorLocation = adUseServer 
rst.Open Source:=cmdCommand, CursorType:=AdForwardOnly, LockType:=adLockOptimistic 

Workbooks("Cop.xls").Activate 


Range(marrPlace(i)).CopyFromRecordset rst 
' 
Next 

einige Abfragen erfolgreich kopiert werden, sondern für einige von ihnen erhalte ich die folgende Fehlermeldung:

Run-Time error '-2147217904 (80040e10)': No Value given for one or more required parameters." 

enter image description here

ich habe schon in all diesen Abfragen, die nicht die erste Spalte kopiert ist leer. Es sollte jedoch kein Problem sein!

, dass die Abfrage von einer von ihnen ist:

SELECT [Formulare]![Auswahlmaske]![Monat] AS Datum_SU, IIf([CATEGORIE_AFFAIRE]="CAN" Or [CATEGORIE_AFFAIRE]="CAU" Or [CATEGORIE_AFFAIRE]="3WSN" Or [CATEGORIE_AFFAIRE]="3WSU" Or [CATEGORIE_AFFAIRE]="REPA","VAC",IIf([CATEGORIE_AFFAIRE]="KMLN" Or [CATEGORIE_AFFAIRE]="RWLN" Or [CATEGORIE_AFFAIRE]="KMLU" Or [CATEGORIE_AFFAIRE]="RWLU","LLD",[CATEGORIE_AFFAIRE])) AS Produit, Count(K1ltit31.IE_AFFAIRE) AS AnzahlvonIE_AFFAIRE, Sum(IIf([SOLDE_COMPTA]<0,[CRD],[SOLDE_COMPTA]+[CRD])) AS [ENCOURS TOTAL], K1ltit31.CODE_STATUT_COMPTA 
FROM K1ltit31 
GROUP BY [Formulare]![Auswahlmaske]![Monat], IIf([CATEGORIE_AFFAIRE]="CAN" Or [CATEGORIE_AFFAIRE]="CAU" Or [CATEGORIE_AFFAIRE]="3WSN" Or [CATEGORIE_AFFAIRE]="3WSU" Or [CATEGORIE_AFFAIRE]="REPA","VAC",IIf([CATEGORIE_AFFAIRE]="KMLN" Or [CATEGORIE_AFFAIRE]="RWLN" Or [CATEGORIE_AFFAIRE]="KMLU" Or [CATEGORIE_AFFAIRE]="RWLU","LLD",[CATEGORIE_AFFAIRE])), K1ltit31.CODE_STATUT_COMPTA 
HAVING (((IIf([CATEGORIE_AFFAIRE]="CAN" Or [CATEGORIE_AFFAIRE]="CAU" Or [CATEGORIE_AFFAIRE]="3WSN" Or [CATEGORIE_AFFAIRE]="3WSU" Or [CATEGORIE_AFFAIRE]="REPA","VAC",IIf([CATEGORIE_AFFAIRE]="KMLN" Or [CATEGORIE_AFFAIRE]="RWLN" Or [CATEGORIE_AFFAIRE]="KMLU" Or [CATEGORIE_AFFAIRE]="RWLU","LLD",[CATEGORIE_AFFAIRE])))<>"SERA" And (IIf([CATEGORIE_AFFAIRE]="CAN" Or [CATEGORIE_AFFAIRE]="CAU" Or [CATEGORIE_AFFAIRE]="3WSN" Or [CATEGORIE_AFFAIRE]="3WSU" Or [CATEGORIE_AFFAIRE]="REPA","VAC",IIf([CATEGORIE_AFFAIRE]="KMLN" Or [CATEGORIE_AFFAIRE]="RWLN" Or [CATEGORIE_AFFAIRE]="KMLU" Or [CATEGORIE_AFFAIRE]="RWLU","LLD",[CATEGORIE_AFFAIRE])))<>"SERF") AND ((K1ltit31.CODE_STATUT_COMPTA)="ctx")) 
ORDER BY IIf([CATEGORIE_AFFAIRE]="CAN" Or [CATEGORIE_AFFAIRE]="CAU" Or [CATEGORIE_AFFAIRE]="3WSN" Or [CATEGORIE_AFFAIRE]="3WSU" Or [CATEGORIE_AFFAIRE]="REPA","VAC",IIf([CATEGORIE_AFFAIRE]="KMLN" Or [CATEGORIE_AFFAIRE]="RWLN" Or [CATEGORIE_AFFAIRE]="KMLU" Or [CATEGORIE_AFFAIRE]="RWLU","LLD",[CATEGORIE_AFFAIRE])) DESC; 

[! [Image description hier] eingeben [2]] [2]

+1

hinzufügen Bitte geben Sie die SQL einer Abfrage, die nicht funktioniert. – Andre

Antwort

1

Das Problem ist, dass marrSql(i) kehrt null oder etwas nicht gut genug. Sobald Sie den Fehler erhalten, klicken Sie auf "Debug-Button" und überprüfen Sie den Wert von marrSql (i).

+0

Das stimmt nicht! Das war mein erster Verdacht und es funktioniert gut. Der andere Punkt ist, dass es für einige von ihnen funktioniert und nicht für einige arbeiten – maniA

+0

Aus dem Code sehe ich, Sie haben eine Abfrage in einer Schleife. Was scheitert. Der Grund dafür ist, dass der marrSql (i) etwas falsch geben sollte. Ich meine, nichts anderes kann in "SELECT * FROM marrSql (i)" fehlschlagen. – Vityata

+0

Anfangs gibt es gute Werte, aber wenn die Schleife geht, gibt es eine falsche. – Vityata

2
SELECT [Formulare]![Auswahlmaske]![Monat] AS Datum_SU 

Ein solcher Parameter wird beim Öffnen der Abfrage in Access ausgewertet, aber nicht beim Öffnen eines Re-Cord-Sets darauf.

Für DAO habe ich hier eine Lösung: https://stackoverflow.com/a/32118340/3820271

Für ADODB können Sie wahrscheinlich etwas Ähnliches bauen.
Oder verwenden Sie eine öffentliche Funktion, die den Wert aus dem Formular liest und in der Abfrage aufruft.

So etwas wie

' This goes into a standard module (not class module) 
Public Function GetAuswahlMonat() As Variant 
    GetAuswahlMonat = Forms![Auswahlmaske]![Monat] 
End Function 

und dann

SELECT Min(GetAuswahlMonat()) AS Datum_SU, ... 
... 
GROUP BY IIf(... 

(es ist wahrscheinlich besser, eine Aggregatfunktion und nicht mit Gruppierungs)

+0

Ich habe mich mit Ihrem Vorschlag beschäftigt, aber ich weiß nicht, wie kann ich "eine öffentliche Funktion verwenden, die den Wert aus dem Formular liest"! Könnten Sie mir bitte helfen oder einfach sagen, wie ich anfangen kann? – maniA

+0

@maniA: siehe bearbeiten. – Andre