Data uit SQL reeks in ExcelObject

Status
Niet open voor verdere reacties.

Jeffie85

Gebruiker
Lid geworden
12 jun 2012
Berichten
106
Ik heb een SQL statement gemaakt waarin ik data ophaal
Dus een Select Statement waar bijvoorbeeld 100 regels uit voort komen met diverse kolommen.

Deze gegevens wil ik naar een Excel blad zetten met een druk op de knop.
Dit lukt wel, alleen dan krijg ik alleen maar de data van de eerste regel in mijn excel en niet die andere 99 regels.
Hoe kan ik dit voor elkaar krijgen?

Mijn code om het naar Excel te krijgen is;

[SQL] ' Excel starten
Set ExcelObject = CreateObject("Excel.Application")

' Excel zichtbaar maken
ExcelObject.Visible = True

' Het voorblad openen.
ExcelObject.Workbooks.Open("C:\Overzicht.xlsx")

' Vul de gegevens in
ExcelObject.Worksheets("Blad1").Range("A1:A10").Select
ExcelObject.ActiveCell.FormulaR1C1 = Query("Kolom1").Value

' Keer terug naar home
ExcelObject.Range("A1").Select

Query.Close[/SQL]
 
de activecell is toch ook maar 1 cell? Ik neem aan dat je een array hebt en moet je je selectie "resizen" met de grootte van het aantal elementen in de array
 
En hoe doe ik dat? :)
Dus alle eerder opgevraagde SQL data, wil ik dan in dit geval in de cellen A1:A10 naar voren krijgen ( in Excel )
 
De basis is zoiets:

Code:
ExcelObject.Worksheets("Blad1").Range("A1").Resize(Query.Count).value = Query(kolom1)

Echter kan ik niet zo zien wat "Query" is. de gebruikte properties zijn wat anders tussen arrays, datasets, recordset, results, etc.
 
Dan krijg ik deze foutmelding;

Script Error "Deze eigenschap of methode wordt niet ondersteund door dit object: 'Query.Count'" at line 55
 
Ja. zoals ik al aangaf:

Echter kan ik niet zo zien wat "Query" is. de gebruikte properties zijn wat anders tussen arrays, datasets, recordset, results, etc.

het kan .recordcount zijn, of .itemcount . Dat is afhankelijk van het query object (kan ik niet zien in bovenstaande code). Je kunt het even vervangen door een vast getal:
Code:
ExcelObject.Worksheets("Blad1").Range("A1").Resize(10).value = Query(kolom1)

ook dit kan een fout opleveren, omdat ik nog steeds niet weet wat "Query" is ;)
 
Nu krijg ik geen foutmelding meer, maar geeft die ( bijv. als ik resize (10) invul ), dan geeft die 10 keer de waarden van record 1, en niet de verschillende records van wat ik ophaal

zo ziet de code er volledig uit ( puntjes..... zijn even in plaats van kolomnamen gezet );

[SQL]Option Explicit 'verplichte declaratie variabelen

Sub Main
Dim Query, Sql, ..............
DossierCode = Record.FieldValues("........")
ProdHeaderDossierCode = Record.FieldValues("........")

' Haal de gegevens op
Sql = "Select Convert(int,kolom1) as Kolom 1" &_
",.............. " &_
",................ " &_
",............ " &_
"From .............. " &_
"Where ..........=N'"&..........&"' " &_
"and ..................=N'"&P.............&"'"


Set Query = Application.DataBase.CreateQuery(Sql)
Query.Open

' Beëindig indien geen gegevens
If Query.Eof then
Query.Close
Application.IsahForms.BoxWarning("Er zijn geen gegevens!")
Exit Sub
End If

' Excel starten
Set ExcelObject = CreateObject("Excel.Application")

' Excel zichtbaar maken
ExcelObject.Visible = True

' Het voorblad openen.
ExcelObject.Workbooks.Open("C:\iOverzicht.xlsx")

' Vul de gegevens in
ExcelObject.Worksheets("Blad1").Range("A1").Resize(10).value = Query("ColliNr")

' Keer terug naar home
ExcelObject.Range("A1").Select

Query.Close
End Sub[/SQL]
 
Ok je gebruikt Isah, die heeft standaard niet de mogelijkheid om direct te exporteren naar een array.

Je zult dan de cellen 1 voor 1 moeten vullen of eerst een array vullen met de resultaten.

Code:
startcell =  ExcelObject.Worksheets("Blad1").Range("A1")
Do Until Query.EOF
  startcell = Query("ColliNr")
  Query.Next
  startcell = startcell.offset(1)
Loop
 
Hehe dat zie je snel dat het ISAH is :)

Heb nu dit ingevoerd en krijg ik deze melding;
( terwijl die wel in de 'DIM' is aangegeven )

Script Error "Variabele is niet gedefinieerd: 'startcell'" at line 55

[SQL]
' Het voorblad openen.
ExcelObject.Workbooks.Open("C:\ColliOverzicht.xlsx")

' Vul de gegevens in
startcell = ExcelObject.Worksheets("Blad1").Range("A1")
Do Until Query.EOF
startcell = Query("ColliNr")
Query.Next
startcell = startcell.offset(1)
Loop
[/SQL]
 
als option explicit gebruikt (had ik even gemist) moet het volgende erbij:
Code:
dim startcell as range

dat kan net boven de routine en hoeft niet bovenaan.

mogelijk (afhankelijk van de context) moet je de dim aanpassen naar specifiek een excel range.
 
Laatst bewerkt:
Ja want nu krijg ik deze melding

Script Error "Id wordt verwacht" at line 8

Probeer elke mogelijkheid om die melding niet te krijgen, maar gaat niet werken :( sorry
 
Laatst bewerkt:
Ik heb helaas momenteel geen toegang tot excel. Er zijn ook andere manieren om gewoon de tekst eronder te plakken zonder gebruik te maken van een extra range.
Code:
dim startcell as excelobject.range
als dat niet gaat kun je zoiets proberen (ongetest dus):
Code:
Do Until Query.EOF
  ExcelObject.Worksheets("Blad1").Range("A50000").end(-4162).offset(1) = Query("ColliNr")
  Query.Next
Loop
 
Apart,
hij komt continue met de melding
Script Error "Id wordt verwacht" at line 8

Dat is de regel waar de Dim begint in het script, zie eerder gepost....

Ook daar heb ik alle mogelijkheden geprobeerd, maar blijft nu deze melding komen...
 
Ik heb hem eindelijk na veel proberen :) ;

Do Until Query.EOF
ExcelObject.Worksheets("Blad1").Range("A50000").end(-4162).offset(1) = Query("Kolom1")
ExcelObject.Worksheets("Blad1").Range("B50000").end(-4162).offset(1) = Query("Kolom2")
Query.Next
Loop

Heb alleen dit gegeneerd....en toen werkte die...


Alleen snap ik niet wat .end(-4162) doet?
omdat je een eind bereik aan moet geven? en met deze range je altijd veilig zit, dat alles erop komt of zie ik dat verkeerd?
 
Laatst bewerkt:
Zolang je minder dan 50000 items verwacht zou dit altijd goed moeten gaan. In principe kun je "a50000" verhogen indien 50000 regels niet voldoende is.

de -4162 is een constante. Echter is deze constante alleen geldig in excel context en als je de range al niet goed aan de praat krijgt, is uitleggen hoe je deze constante correct importeert waarschijnlijk ook lastig, dus heb ik je maar de concrete waarde van de constante gegeven. ;)

Je hebt dus nu geen enkele dim meer nodig, als het goed is.
 
M.b.t. bovenstaand item;

Als ik de data wil oproepen vanaf Cel A26 bijvoorbeeld.
Hoe geef ik dit dan aan

want in de .offset geef je de rij en kolom aan

bvd
 
De code plaatst de data onder de eerst beschikbare cel.

Als je apart de eerste data in a26 plaatst en daarna weer deze code gebruikt komt de rest er vanzelf onder. je kunt ook tijdelijk iets in a25 plaatsen, de oude code aanroepen en a25 weer wissen, geeft hetzelfde effect.
 
Ja klopt.
Ik had nu in cel A25 wat neer gezet, en in A26 kwamen de resultaten.

Thnx !
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan