SQL opdracht voor intelligente tabellen

Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
19.725
Dag allen, niet corona-gevelden,

Als ik in een ADODB-recordset een SQK filteropdracht formuleer om twee gebieden met gegevens in respektievelijk sheet1 en sheet2 samen te voegen, gebruik ik in de SQL-opdracht [Sheet1$] en [Sheet2$] om de afzonderlijke Excel-werkbladen aan te duiden.
Als ik gebruik maak van intelligente tabellen, krijgen die automatisch een gebiedsnaam: Tabel1 en Tabel2 (zie de 'names' manager bij formules).
Hoe kan ik in de SQL-opdracht aangeven dat de samen te voegen gegevens zich bevinden in Tabel1 en Tabel2 ?

De formulering [Tabel1$] of [Tabel2$] werkt hier in ieder geval niet.

Mijn dank bij voorbaat.
 
Ben benieuwd of bovenstaande suggestie van JVeer werkt, liep zelf in het verleden (met dynamische bereiken ipv intelligente tabellen) tegen het 65K rijen probleem aan, dit in tegenstelling tot het benoemen van een heel werkblad.
 
Zullen we eens, net als bij een gewone gebruiker, om een bestandje vragen? Lijkt me wel zo netjes :).
 
Ik mag natuurlijk helemaal geen bestand plaatsen, omdat daarin allerlei zeer vertrouwelijke gegevens zitten.
En dan nog is het te groot om te plaatsen.
Dus heb ik er maar zoveel uitgesloopt dat er een nauwelijks representatief bestand overbleef.
Dat tref je aan als bijlage.
In de makro is de wél werkende code 'uitgecommentarieerd'.
2 code-vormen met verwijzingen naar beide tabellen staan eronder.
Geen van beide biedt een succesvol resultaat.

Ik ben benieuwd naar jullie suggesties !
 

Bijlagen

  • __SQL_join.xlsb
    25,6 KB · Weergaven: 36
Zorg er voor dat de string er zo uit komt zien:

Code:
 .Open "select * from [Sheet1$A1:D14] left join [Sheet2$A1:D14] on ([Sheet1$A1:D14].aa1 =  [Sheet2$A1:D14].zz1)", c00
 
@ E v R

Bedankt !

Blijkbaar evalueert de SQL-string geen benoemde gebieden en beperkt zich tot de evaluatie van werkbladen en A1-gebieden.

Ik heb het zo vormgegeven:

Code:
Sub M_snb_leftjoin()
  Sheet3.UsedRange.ClearContents
  c00 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;;HDR=Yes;IMEX=1"""
    
  st = Array("[" & Replace(Split([Table1[#All]].Address(0, 0, , 1), "]")(1), "!", "$") & "]", "[" & Replace(Split([Table2[#All]].Address(0, 0, , 1), "]")(1), "!", "$") & "]")
    
  With CreateObject("ADODB.recordset")
'   .Open "select * from `sheet1$` left join `sheet2$` on `sheet1$`.aa1 = `sheet2$`.zz1 ", c00

    .Open "select * from " & st(0) & " left join " & st(1) & " on " & st(0) & ".aa1 = " & st(1) & ".zz1", c00
    Sheet3.Cells(1).CopyFromRecordset .DataSource
  End With
End Sub
 
ipv "!" zou ik "'!" gebruiken, die ' moet er ook nog uit


++

Zoals reeds gemeld in een voorgaande post; bereiken met meer dan de 65K regels lukt (mij) niet (itt een hele sheet)

++

Een bereiknaam niet zijnde een Tabel werkt ook (waarschijnlijk lukken die tabellen niet omdat deze (ook) blokhaken hebben
 
Laatst bewerkt:
Geen oplossing voor de vraag maar een aantal wedervragen:
Waarom wil je dit soort constructies via VBA oplossen en niet via de ingebakken mogelijkheden zoals PQ?
Het hele Officepakket is opgebouwd uit een aantal logische onderdelen Word voor tekstverwerken, Excel voor rekenen en presenteren, Access voor databases, en nog wel wat meer. Waarom dan gaan 'rommelen' in Excel?
  1. Snelheid?
  2. Licentiekosten?
  3. Backward compatibility?
 
@ VenA

- SQL-opdrachten zitten al decennia ingebakken in Excel: Querytables.
- PQ heeft beperkingen die Querytables en SQL-opdrachten niet hebben
- PQ maakt gebruik van dezelfde SQL-opdrachten; ze worden alleen aan de gebruiker anders gepresenteerd
- als je onbekend bent met alle SQL-mogelijkheden van Excel ben je niet de enige
- ik ben het met je eens dat MS de documentatie van de SQL-mogelijkheden van Excel heeft verwaarloosd
 
Excel-SQL heeft nooit een update gehad om listobjects te herkennen. Het advies is: zet op een werkblad één gegevenstabel (al dan niet listobject) en hou het gebied er omheen leeg. In de query gebruik je gewoon Sheet1$. (Als je meerdere tabellen op een sheet hebt kan het trouwens wel, dan wordt het iets als Sheet1$Data voor de eerste en Sheet1$Data_1 voor de tweede. Je kunt MS-Query gebruiken om dit te achterhalen.)
Enige informatie over Excel-Sql vind je in de help van MS-Query. Gebruik de tool MS-Query als inspiratiebron, als een macrorecorder/IDE/Studio voor Excel-SQL. Bijvoorbeeld om te achterhalen of je expressies met Iif() kunt toepassen (en of je dan een , of een ; moet gebruiken). En of je Like kunt gebruiken in criteria.

PQ heeft beperkingen die Querytables en SQL-opdrachten niet hebben
Ik zie uit naar De Snb PQ Challenge nummer 1 :)
 
Oei, mooi voorbeeld.
Volgens de verkoopcijfers zijn er 144 producten verkocht. De pivots komen niet verder dan 139. Waar zijn de overige 5 gebleven?

Andere insteek:
Feit: Product 1 is 12 keer verkocht;
Feit: Klant 1 en Klant 2 hebben beide alléén product 1 gekocht, en alleen zij hebben product 1 gekocht;
Hieruit volgt: Klant 1 en Klant 2 hebben SAMEN 12 producten 1 gekocht.
Dit is in tegenspraak met de pivots, waar staat dat Klant 1 en 2 samen 24 producten gekocht hebben.
Oeps.

Gegeven de dataset is alleen van klanten 8 en 9 te zeggen welke (8 en 9) en hoeveel (19 en 20) producten ze gekocht hebben.
De producten 2, 4, 5 en 7 zijn wel verkocht maar niet aan klanten :confused:

Op naar challenge 2.
 
Bij de 'ouderwetse' methoden wordt nog gewoon 'onder de toonbank' verkocht. :d
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan