Subformulier exporteren naar excel

Status
Niet open voor verdere reacties.

geertsjelle

Gebruiker
Lid geworden
30 jan 2009
Berichten
87
Hallo,

Ik heb een formulier met een subformulier.
Nu wil ik met 1 druk op de knop het subformulier exporteren naar excel. Ik ben al een tijd aan het zoeken en proberen maar krijg het niet voor elkaar.:confused:

Kan iemand mij helpen met de VBA code om dit te doen.

Alvast Bedankt.
 
Eerst moet je de achterliggende query of SQL van het formulier opvragen, bijvoorbeeld met:

strSQL=Me.subFormulier.Form.RecordSource

Vervolgens kun je met een DoCmd het bestand exporteren.

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, sExcelBestand

Michel
 
Foutmelding

Octafish bedankt voor je reactie.

Ik heb de codes gebruikt ik krijg alleen de volgende foutmelding:

Fout 2552 tijdens uitvoering:

U moet een argument Bestandsnaam opgeven voor de actie of methode


Volgens foutopsporen zit de fout in:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, sExcelBestand

Weet je misschien wat ik moet aanpassen in het form om het wel werkend te krijgen.

Alvast bedankt
 
Hoi geertsjelle,

Je moet inderdaad nog een Bestandsnaam opgeven.

sExcelBestand moet nog gevuld worden met een waarde, bijvoorbeeld:
"C:\new.xls"

De volgende code creëert een excel bestand en exporteert de tabelgegevens.
Code:
Dim ExcelSheet As Object

strSQL = Me.Form.RecordSource
sExcelBestand = "C:\New.xls"

Set ExcelSheet = CreateObject("Excel.Sheet")
ExcelSheet.SaveAs sExcelBestand

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, sExcelBestand

zie ook voorbeeld db.
 

Bijlagen

Bedankt Greenery voor de aanvulling; soms gooi ik wat te snel met variabelen...

De code zou ook moeten werken zonder Excelobject, dus zo:

Code:
strSQL = Me.Form.RecordSource
sExcelBestand = "C:\New.xls"

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, sExcelBestand

Zo gebruik ik hem tenminste al jaren...
Eventueel kun je het oude bestand eerst nog weggooien met

Kill sExcelbestand.

Weet je zeker dat je een schoon exportbestand hebt.

Michel
 
Andere foutmelding

Bedankt voor jullie reacties en het bestandje.

Ik ben al iets verder maar heb nog steeds de foutmelding:

Fout 3011 tijdens uitvoering:

De microsoft Jet-datebase-engine kan het object SELECT * FORM QUERYMARKTANALYSE; niet vinden. Zorg ervoor dat het object bestaat en dat u de naam en het pad correct heeft gespeld


De betreft een subform (subformMarktanalyse) dat ik wil exporteren naar Excel en het subform is opgebouwd aan de hand van een query (querymarktanalyse)

Zie code:

strSQL = Me.SubformMarktanalyse.Form.RecordSource
sExcelBestand = "C:\New.xls"

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, sExcelBestand

Weet iemand wat ik fout doe?
 
Het TransferSpreadsheet verwacht de naam van een tabel of een query, geen SQL statement.
Zet dus op je subformulier een vaste query.

Michel
 
Het werkt ee

Octafish,

Bedankt voor je reactie. Ik het hem zojuist werkend gekregen met het onderstaande comando::D

DoCmd.OutputTo acForm, "SubformMarktanalyse", "MicrosoftExcelBiff8(*.xls)", "c:\testit.xls", True, "", 0


Bedankt voor jullie hulp:thumb:
 
Ben er toch niet helemaal

Ik dacht dat ik er was met de bovenstaande code. Tot ik er achter kwam dat de filters "genegeerd" werden. Met de bovenstaande code wordt namelijk de hele (ongefilterde) formulier geexporteerd:rolleyes:

In het subformulier zit een vba code met filtermaken().
Weet iemand hoe ik dit ook mee kan nemen?
 
Ik hou het daarom gewoon op mijn eigen methode, die werkt tenminste :)
Voor jou zou het volgende misschien kunnen werken:

Code:
	strSQL = Me.SubformMarktanalyse.Form.RecordSource
                  Set db = CurrentDb()
	'Variant 1: je hebt een query gemaakt met de naam 'qTemp'
                  Set qTemp = db.QueryDefs("qTemp")
	qTemp.SQL = strSql

	'Variant 2: je hebt geen query  met de naam 'qTemp'; je maakt hem aan me de volgende twee regels.
	Dim qdfNew As QueryDef
	On Error Resume Next
	set qdfNew = db.CreateQueryDef("qTemp", strSql) 
    
	DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, "c:\testit.xls", True

Lekker simpel, werkt altijd!
Zoals je ziet zijn er twee varianten. De eerste variant gaat er vanuit dat de query qTemp al bestaat. Die query mag een kopie zijn van een andere query, want de inhoud ervan wordt overschreven. Het maakt dus niet uit wat er instaat.
Variant 2 gaat er vanuit dat de query niet bestaat, en maakt hem dus aan. Om te voorkomen dat je bij de volgende keer dat je de export draait in de problemen komt, omdat de query nu wel bestaat, heb je de regel On Error Resume Next.

In deze varianten wordt dus altijd de inhoud van het subformulier als query opgeslagen, en geëxporteerd.

Michel
 
Laatst bewerkt:
Ben al wat verder

Met dank aan Octafish ben ik al een heel stuk verder. Ik heb de onderstaande code gebruikt. Er wordt inderdaad een query aangemaakt met de naam qTemp de query wordt alleen niet geexporteerd:confused:. Ik heb ook gemerkt dat de query niet ververst wordt als ik voor een 2e keer (met andere filter criteria) iets probeer te exporteren de inhoud wordt wel aangepast als ik de query heb gewist. Misschien nog een hint.

strSQL = Me.SubformMarktanalyse.Form.RecordSource
Set db = CurrentDb()

'Variant 2: je hebt geen query met de naam 'qTemp'; je maakt hem aan me de volgende twee regels.
Dim qdfNew As QueryDef
On Error Resume Next
Set qdfNew = db.CreateQueryDef("qTemp", strSQL)

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, "c:\testit.xls", True
 
Waarom is kopieëren toch zo moelijk??

Code:
Dim qdfNew As QueryDef
On Error Resume Next
[COLOR="Red"][B]db.QueryDefs.Delete ("qTemp")[/B][/COLOR]
Set qdfNew = db.CreateQueryDef("qTemp", strSQL)

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, "c:\testit.xls", True

Die On Error regel zit er niet voor niks: je gooit eerst de qtemp weg, om hem vervolgens opnieuw te maken.
In de vorige variant werd niks weggegooid (want die regel ontbrak...) en kon hij ook de query niet maken, want die bestond dus nog. Dus ging de procedure na de On Error door met... het transporteren van de oude query!

Mijn diepgemeende excuses.... ;)

Michel
 
qTemp

Als je de query wilt exporteren naar een excel bestand, moet je de volgende regel nog aanpassen:

Code:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, strSQL, "c:\testit.xls", True

strSQL wordt "qTemp" dan namelijk wordt de query geëxporteerd.

Code:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qTemp", "c:\testit.xls", True

Het klopte idd dat de query niet werd geëxporteerd.
Toch nog een kleine aanvulling op het harde werk van Octafish. ;)
 
Zoals ik al zei; ik ben echt héél erg :evil: met kopieëen....

Hartelijk dank voor de verbetering!

Michel
 
Ik denk dat geertsjelle toch zeer dankbaar is voor jouw werk. Ik heb het zelf ook al getest en het werkt perfect.

Ik probeer bijvoorbeeld wel alle posts te lezen op dit forum. Maar zelfs met lezen kan ik jouw regelmaat van antwoorden en oplossen nauwelijks bijhouden.... ;)
 
Het werkt!

Ik heb het zojuist getest alles werkt:)

Ik ben jullie allebei zeer dankbaar:thumb:

Ik heb nog niet zoveel kennis van Access, tot voor kort probeerde ik alles in Excel te "bouwen" maar dan loop je naar een tijd toch tegen beperkingen aan. Ca 3 weken geleden kwam ik een cd-rom cursus access tegen die ik heb gevolgd. Van deze cd-rom heb ik de basis gekregen. Dankzij jullie en dit form (en de reeds geposte vragen & antwoorden van anderen) leer ik ook de niet standaard mogelijkheden van Access. (ja ik weet het ik had de cursus al een paar jaar geleden moeten volgen:rolleyes:)

Mbt het exporteren naar Excel vroeg ik me af of het ook mogelijk is om kolomen te verbergen. In het formulier verberg ik namelijk kolommen met een checkbox en in de query zijn deze natuurlijk niet verborgen. Misschien dat het mogelijk is om de checkboxen ook te "koppelen" aan de "weergeven" functie van de qTemp query. Ik heb alleen helemaal geen idee welke code ik hiervoor zou moeten gebruiken.

Mocht het niet mogelijk zijn is dat ook geen punt ik ben al heel blij met de mogelijkheid tot het exporteren die ik nu heb.:)

Jelle
 
Ik heb voor een andere post een soortement functie gemaakt die een aantal checkboxen op een formulier uitleest, en afhankelijk daarvan een selectiefilter maakt.
Die techniek zou jij ook kunnen gebruiken. De enige voorwaarde daarbij is, dat je de checkboxen een gestandaardiseerde naam geeft, bijvoorbeeld chkVeld1, chkVeld2, chcVeld3 ... chkVeld21.
De routine loopt namelijk door alle objecten die chkVeld(n) heten, en kan vervolgens een query opbouwen als de waarde -1 is. Deze looptruc werkt een stuk minder, als de checkboxen chkMaand, chkVerkoop en chkNoemMaarWat heten.

Laat maar weten of je zoiets kunt gebruiken.

Michel
 
Een voorbeeld is altijd welkom

Octafish,

Een voorbeeld is altijd welkom:thumb:. In het formulier heb ca 20 kolommen met verschillende titels. Het verhaal zou bij mij dus niet op gaan. Mocht het me niet op een andere manier lukken dan hernoem ik gewoon de titels.

Ik wil nog even iets proberen. Met behulp van qTemp (nog bedankt voor het maken van de code voor qTemp:thumb:) wil ik filteren op rijen. Maar omdat het niet mogelijk is om de kolommen te verberen in qTemp wil een formulier maken op basis van qTemp en in dit formulier de kolommen verbergen op basis van de checkboxen in het "basis formulier". En vervolgens het formulier op basis van qTemp met de verborgen kolommen exporteren naar Excel. (ik ben er achter dat als ik een formulier exporteer naar excel de kolommen dan niet worden mee genomen).

Het maken van het formulier op basis van qTemp is gelukt. Het lukt met alleen niet om de "status" van de checkboxen op te roepen uit het "basis" formulier. Ik heb de onderstaande code gebruikt. Waarschijnlijk heb ik een foutje zitten in het rode gedeelte waar ik de status van de checkbox uit het basisformulier oproep:confused:. Misschien weet wij hoe ik dit kan oplossen.


Private Sub Form_Open(Cancel As Integer)

If Me.formanalyse.Form.VinkStatus = True Then

KolStatus.ColumnHidden = False

Else

KolStatus.ColumnHidden = True[/COLOR][/COLOR]

End If

End Sub


________________________________

Jelle
 
Ik heb hem werkend

Ik heb hem inmiddels werkend door een formulier op basis van de query qTemp te maken. Vervolgens heb ik met behulp van de onderstaande formule de status van de checkbox op gevraagd welke de kolom in het formulier van qTemp verbergt die ook in het basisformulier verbogen is. Vervolgens wordt het form naar Excel geexporteerd.

Private Sub Form_Open(Cancel As Integer)

If Forms.Formnaam.Checkboxnaam = True Then (dank aan Bakk4318)

Kolomnaam.ColumnHidden = False

Else

Kolomnaam.ColumnHidden = True[/color][/color]

End If

End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan