OK, we zijn terug vertrokken...
Ik geloof je echt wel als je zegt dat je alles letterlijk overneemt, maar dat is slechts een mening: je neemt niet alles letterlijk over.
Mijn eerdere code uit de fameuze post 59
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Vrd.ChargeNummer=16036"
moet werken, maar natuurlijk
NIET in combinatie met de lus "For i = 1 To 3 ... Next i" die we voor een ander doeleinde hadden ingebouwd.
In je nu meegestuurde code gebruik je beide methodes door elkaar waardoor je een CommandText creëert die kant noch wal raakt.
Nog even recapituleren:
Eerst en vooral: als je iets krijgt als "ExterneGegevens_1: Gegevens ophalen ..." is de connectie zeker en vast goed, maar zo ver kom je nu al altijd, meen ik toch?
Als je die melding krijgt gevolgd door een foutmelding, dan is je CommandText verkeerd. Eigenlijk moet je daar dus verder niet van wakker liggen, die foutmelding zal dan altijd komen opdagen bij de Refresh-instructie.
We concentreren ons dus nog enkel en alleen op de CommandText. Ofwel schrijf je die, ofwel bouwen we die binnen vba op gebaseerd op je filters.
Voorbeeldje voor methode 1 (voor de eenvoud houden we hier geen rekening met blad "keuzes" en zetten de uitvoer op blad "resultaat"):
Sub db_selectie()
Sheets("resultaat").Select
Cells.ClearContents
opdracht = "SELECT Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd WHERE Plu2.PluNum = Vrd.Artikel AND Vrd.ChargeNummer=16036"
With ActiveSheet.ListObjects.Add...QueryTable 'deze lijn wel aanpassen voor je ERP-database
.CommandText = opdracht
.Refresh BackgroundQuery:=False
End With
End Sub
En voorbeeldje voor methode 2 (enkel uit één tabel):
Sub db_selectie()
Dim naam(1 To 3)
Dim zoek(1 To 3)
With Sheets("keuzes")
For i = 1 To 3
naam(i) = .Cells(i, 1)
zoek(i) = .Cells(i, 2)
Next i
uitvoer = .Cells(5, 2)
End With
Select Case uitvoer
Case "blad 'resultaat' (bestaande gegevens overschrijven)"
Sheets("resultaat").Select
Cells.ClearContents
Case "nieuw werkblad"
Sheets.Add after:=Sheets(Sheets.Count)
Case "nieuwe werkmap"
Workbooks.Add
End Select
opdracht = "select * from vrd "
volgende = False
For i = 1 To 3
If zoek(i) <> "" Then
If volgende = False Then
opdracht = opdracht & "where " & naam(i) & " = " & zoek(i) & " "
volgende = True
Else
opdracht = opdracht & "and " & naam(i) & " = " & zoek(i) & " "
End If
End If
Next i
With ActiveSheet.ListObjects.Add...QueryTable 'deze lijn wel aanpassen voor je ERP-database
.CommandText = opdracht
.Refresh BackgroundQuery:=False
End With
End Sub
Zoals gezegd, OF de ene code, OF de andere, maar niet gaan mengen!
En om zeker niet te kunnen missen heb ik voor beide methodes de volledige code hier gezet. Ik denk dat het echt noodzakelijk is dat je dit 100% begrijpt vooraleer we verder kunnen.
En toch waag ik het maar. Met deze moet het dus lukken om in methode 2 een koppeling met een 2° tabel te realiseren (die heb ik hier zomaar uit de losse pols geschreven zonder te kunnen testen, dus even afwachten, al denk ik niet dat ik ergens over kijk):
Sub db_selectie()
Dim naam(1 To 3)
Dim zoek(1 To 3)
With Sheets("keuzes")
For i = 1 To 3
naam(i) = .Cells(i, 1)
zoek(i) = .Cells(i, 2)
Next i
uitvoer = .Cells(5, 2)
End With
Select Case uitvoer
Case "blad 'resultaat' (bestaande gegevens overschrijven)"
Sheets("resultaat").Select
Cells.ClearContents
Case "nieuw werkblad"
Sheets.Add after:=Sheets(Sheets.Count)
Case "nieuwe werkmap"
Workbooks.Add
End Select
opdracht = "select Vrd.Artikel, Vrd.Lokatie, Vrd.ChargeNummer, Vrd.Datum, Vrd.MutatieSt, Vrd.Soort, Plu2.NaamRek FROM Plu2, Vrd where Plu2.PluNum = Vrd.Artikel "
For i = 1 To 3
If zoek(i) <> "" Then
opdracht = opdracht & "and vrd." & naam(i) & " = " & zoek(i) & " "
End If
Next i
With ActiveSheet.ListObjects.Add...QueryTable 'ook hier aanpassen voor je ERP-database
.CommandText = opdracht
.Refresh BackgroundQuery:=False
End With
End Sub
Laat ons duidelijk afspreken: doe de eerste methode nog eens. Probeer die helemaal te begrijpen als ze lukt.
Doe vervolgens hetzelfde met de tweede methode.
Als ook die helemaal duidelijk is mag je gerust de laatste code ook proberen!
Ik zal waarschijnlijk tot zondagavond afwezig zijn, maar vroeg of laat kijk ik er dan wel weer naar.
Ach ja, nog even dit:
vermoedelijk te veel gegevens
Daar zal het heus niet aan liggen, als sql meer records vindt dan je beschikbare rijen in je Excel-versie hebt zal hij zelfs alle rijen vullen (de rest ben je dan wel kwijt). Maar vermits je praatte over een paar honderdduizend records en we er hier massa's wegfilteren zullen we daar geen last van hebben.
Nog een laatste afspraak? Als er iets mislukt, stuur je dan de volledige code mee?
Groeten,
pitufo