Export naar word per record

Status
Niet open voor verdere reacties.

Warranty

Gebruiker
Lid geworden
3 nov 2006
Berichten
100
Ik heb de volgende code onder een export knop in een form, voor een export naar word. Deze heeft iemand anders echter voor me gemaakt, dus verwacht van mijn kant niet al te veel kennis (nog niet in ieder geval) van visual basic. Ik heb wel ervaring met java.

Code:
Private Sub cmdAfdrukkenNaarBestand_Click()

Const Bron = "qry_Toetsrooster_Voorblad"
Const Sjabloon = "V:\pa\Bedrijfsbureau\ICT\Toetsroosters Database\Sjabloon_Voorblad.doc"
Const ExportMap = "V:\pa\Bedrijfsbureau\ICT\Toetsroosters Database\Print\"

Const Titel = "Toetsen afdrukken"

    Export2Word Bron, Sjabloon, ExportMap
    MsgBox "Weggeschreven", vbOKOnly, Titel

End Sub

Mijn vraag is: Met deze code exporteer ik meteen alle records van het desbetreffende query. Ik zou graag één record willen exporteren, namelijk het record in het desbetreffende record die je aan het bekijken bent in het formulier.
 
je kan de bron aanpakken de query bedoel ik dus, uitbreiden met de tekst
Code:
Select Top 1 .......
Maar je kan ook kijken wat er in de procedure Export2Word gebeurd.

succes!
 
Laatst bewerkt:
Hoe bedoel je? Ik vind het een beetje onduidelijk wat je zegt.

"Select Top 1 ......." moet ik ergens neerzetten? Vanwaar al die puntjes? Ik neem aan dat die er niet in moeten? En waar moet ik het precies neerzetten, in de code van een query?

En waar vind ik de procedure Export2Word?

Sorry voor de vele vragen maar zo geavanceerd ben ik niet. Ik heb iets meer uitleg nodig :D

Top dat je zo snel reageert bedankt in ieder geval :thumb:
 
Code:
Private Sub cmdAfdrukkenNaarBestand_Click()

Const Bron = "qry_Toetsrooster_Voorblad" [COLOR="Red"]'Hier wordt een query aangeroepen. 
Die moet je openen en aanpassen door in SQL-View: 
[B]Select [/B]te vervangen door [B]Select Top 1[/B][/COLOR]
Const Sjabloon = "V:\pa\Bedrijfsbureau\ICT\Toetsroosters Database\Sjabloon_Voorblad.doc"
Const ExportMap = "V:\pa\Bedrijfsbureau\ICT\Toetsroosters Database\Print\"

Const Titel = "Toetsen afdrukken"

[COLOR="red"]'Hier wordt een procedure aangeroepen met drie parameters[/COLOR]
    Export2Word Bron, Sjabloon, ExportMap 

    MsgBox "Weggeschreven", vbOKOnly, Titel

End Sub
Rechtsklik op Export2Word en kies definitie. De nederlandse tekst weet ik even niet. Je gaat dan naar de procedure Export2Word. Hoe die eruit ziet weet ik natuurlijk niet maar als je door een recordset heen loopt dan kan je na de eerste keer eruit springen. Dit zou mijn voorkeur hebben. Je kan de routine bijvoorbeeld uitbreiden met een parameter: blnEenmalig as boolean.

Als je dat wilt en je hebt hulp nodig dan moet je die routine hier neerzetten.

Enjoy!
 
Laatst bewerkt:
Dankje, ik heb even gekeken maar kan het niet écht vinden. Hier de code:

Code:
'------------------------------------------------------------------------------------------
' Export2Word
'
' Exporteerd de gegevens in query [BronNaam] naar een bestand dat gebaseerd is
' op het sjabloon [SJabloonNaam] en zet deze in de directory [ExportMap].
'------------------------------------------------------------------------------------------
Function Export2Word(BronNaam As String, SjabloonNaam As String, ExportMap As String, _
                     Optional Pbar As Object) As Boolean

Dim Rc As DAO.Recordset
Dim Fld As DAO.Field

Dim Wrd As Object
Dim WrdDoc As Object
Dim MyRange As Object

Dim WordWasOpen As Boolean
Dim ShowProgress As Boolean
Dim FieldCounter As Long
Dim ExportDocumentNaamVeld As String
Dim ExportDocumentNaam As String
Dim Tag As String                           ' Mag een maximale lengte hebben van 30 karakters
Dim TagStr As String
Dim ListString As String

Dim RcTemp As DAO.Recordset
Dim StrVar As Variant
Dim i As Integer

'Sjabloon is niet aanwezig
If Len(Dir(SjabloonNaam)) = 0 Then Exit Function

ExportMap = ValidatePath(ExportMap)
'Exportmap is niet aanwezig
If Len(ExportMap) = 0 Then Exit Function

If Not (Pbar Is Nothing) Then ShowProgress = True

On Error GoTo WordNotOpen
WordWasOpen = True
Set Wrd = GetObject(, "Word.Application")
On Error GoTo 0

Set Rc = CurrentDb.OpenRecordset(BronNaam, dbOpenDynaset, dbReadOnly)
If Not Rc.EOF Then
    
    'Zoek of er een veld Document naam is op vrij losse overeenkomst
    For Each Fld In Rc.Fields
        If InStr(1, UCase(Fld.Name), "DOCUMENTNAAM") Then
            ExportDocumentNaamVeld = Fld.Name
            Exit For
        End If
    Next
    'Er is geen veld documentnaam gevonden zodoende kan er geen export plaats vinden.
    If Len(ExportDocumentNaamVeld) = 0 Then Exit Function
    Set WrdDoc = Wrd.Documents.Open(SjabloonNaam)
    If ShowProgress Then
        Pbar.Min = 0
        Pbar.Max = Rc.Fields.Count + 1
        Pbar.Value = 0
        Pbar.Visible = True
    End If
    Rc.MoveFirst
    Do While Not Rc.EOF
        ExportDocumentNaam = Rc.Fields(ExportDocumentNaamVeld)
        ExportDocumentNaam = CleanFileName(ExportDocumentNaam)
        WrdDoc.SaveAs (ExportMap & ExportDocumentNaam)
        Set MyRange = WrdDoc.Content
        'Doorloop alle velden
        For FieldCounter = 0 To Rc.Fields.Count - 1
            Tag = "[" & UCase(Rc.Fields(FieldCounter).Name) & "]"
            TagStr = UCase(Mid$(Tag, 2, 4))
            Select Case TagStr
                Case "LIST"          ' Het is een lijst die moet worden aangemaakt.
                    ListString = ""
                    'Samenstellen lijst
                    Do While Rc.Fields(ExportDocumentNaamVeld).Value = ExportDocumentNaam
                        ListString = ListString & Rc.Fields(FieldCounter) & vbCr
                        Rc.MoveNext
                        'controle einde recordset
                        If Rc.EOF Then
                            Exit Do
                        End If
                    Loop
                    MyRange.Find.Execute Tag, True, True, False, False, False, , 1, , ListString, 2
                    Rc.MovePrevious
                Case "MEMO"         ' Het is een memoveld.
                    Set RcTemp = CurrentDb.OpenRecordset(BronNaam, dbReadOnly, dbForwardOnly)
                    'Rc.MoveFirst  ' bij dynamische cursor is nu (cursorless) niet nodig.
                    StrVar = LoadMemoTekstInVariantArray(Rc.Fields(Tag))
                    RcTemp.Close
                    Set RcTemp = Nothing
                    ' Schrijf strings met string + Tag
                    For i = LBound(StrVar) To UBound(StrVar)
                        If i <> UBound(StrVar) Then
                            'Schrijf de string EN de Tag
                            MyRange.Find.Execute Tag, True, True, False, False, False, , 1, , StrVar(i) & Tag, 2
                        Else
                            'Schrijf alleen de string
                            MyRange.Find.Execute Tag, True, True, False, False, False, , 1, , StrVar(i), 2
                        End If
                    Next
                Case Else
                    'Tag vervangen door veldwaarde
                    MyRange.Find.Execute Tag, True, True, False, False, False, , 1, , Rc.Fields(FieldCounter).Value, 2
            End Select
            If ShowProgress Then Pbar = Pbar + 1
        Next
        Rc.MoveNext
        If ShowProgress Then Pbar = Pbar + 1
        WrdDoc.Save
        WrdDoc.Close False
        Set WrdDoc = Wrd.Documents.Open(SjabloonNaam)
    Loop
End If

WrdDoc.Close False
If Not WordWasOpen Then Wrd.Quit False
Rc.Close
Set Rc = Nothing
Set Wrd = Nothing
If ShowProgress Then Pbar.Visible = False
Exit Function
WordNotOpen:
WordWasOpen = False
Set Wrd = CreateObject("Word.Application")
Resume Next
End Function

Alvast heeeel erg bedankt :thumb:

Het is wel de bedoeling dat alleen de record word uitgeprint die je op dat moment in het form aan het bekijken bent. Is dat wel gewoon mogelijk? Ziet het programma wel welk record je op het moment aan het bekijken bent?
 
Laatst bewerkt:
Hallo Warranty,

je moet de query qry_Toetsrooster_Voorblad aanpassen zodat deze verwijst naar de rij in je formulier.
Open je query in SQL weergave en voeg een konditie toe.

Post anders even je query in SQL weergave.
Geef aan:

- hoe je formulier heet
- welke kolom in de tabel waarop je query is gebouwd je gegevens uniek identificeert en
- wat de naam van het tekstveld is in je formulier dat op die unieke kolom is gebaseerd

Groet,

Tardis
 
Code:
SELECT tbl_Toetsrooster.Id, tbl_Groep.Groep_Groep AS Groep, tbl_Toetsen.Tst_Toets AS Toets, tbl_Toetsen.Tst_Code AS Code, tbl_Studiejaar.StJ_Studiejaar AS Studiejaar, tbl_Toetsrooster.Datum, tbl_Toetsrooster.Begintijd, tbl_Toetsrooster.Eindtijd, tbl_Toetsrooster.Duur, "Voorblad_" & [Id] & "_" & [Datum] & "_" & [Tst_Toets] & "_" & [StJ_Vanaf] & "_" & [StJ_Tot] AS DocumentNaam, tbl_Inleveren.[Inleveren Meenemen] AS InMee, tbl_GeslotenOpen.[Gesloten open] AS GeslotenOpen, tbl_Nieuw.[Nieuw blad] AS Nieuw, tbl_Rekenmachine.Rekenmachine, tbl_Communiceren.Communiceren, tbl_Toetsrooster.Literatuur, tbl_Toetsrooster.[Extra opmerkingen] AS Extra
FROM tbl_Toetsen INNER JOIN (tbl_Rekenmachine INNER JOIN (tbl_Nieuw INNER JOIN (tbl_GeslotenOpen INNER JOIN (tbl_Inleveren INNER JOIN (tbl_Communiceren INNER JOIN (tbl_Studiejaar INNER JOIN (tbl_Lokalen INNER JOIN (tbl_Groep INNER JOIN tbl_Toetsrooster ON tbl_Groep.Groep_ID = tbl_Toetsrooster.Groep) ON tbl_Lokalen.Lok_ID = tbl_Toetsrooster.Lokaal) ON tbl_Studiejaar.StJ_ID = tbl_Toetsrooster.Studiejaar) ON tbl_Communiceren.COMM_ID = tbl_Toetsrooster.Communiceren) ON tbl_Inleveren.INLV_ID = tbl_Toetsrooster.[Inleveren of Meenemen]) ON tbl_GeslotenOpen.GO_ID = tbl_Toetsrooster.[Gesloten of Open]) ON tbl_Nieuw.NW_ID = tbl_Toetsrooster.[Elke vraag nieuw blad]) ON tbl_Rekenmachine.RKM_ID = tbl_Toetsrooster.Rekenmachine) ON tbl_Toetsen.Tst_ID = tbl_Toetsrooster.Toets;

Het formulier heet: "frm_Toetsrooster_Bekijken".
Kolom uit de tabel die de gegeven uniek maakt: "Id".
Naam van de tekstveld die hierop is gebasseerd: "Id".

De query haalt wel gegevens op uit meerdere tabellen zoals je al kunt zien in de SQL weergave.

Het is natuurlijk Select * From [tabel] Where Id = Id ofzoiets. Ik kom er zelf alleen niet uit.
 
Laatst bewerkt:
Probeer dit eens

Code:
SELECT tbl_Toetsrooster.Id, tbl_Groep.Groep_Groep AS Groep, tbl_Toetsen.Tst_Toets AS Toets, tbl_Toetsen.Tst_Code AS Code, tbl_Studiejaar.StJ_Studiejaar AS Studiejaar, tbl_Toetsrooster.Datum, tbl_Toetsrooster.Begintijd, tbl_Toetsrooster.Eindtijd, tbl_Toetsrooster.Duur, "Voorblad_" & [Id] & "_" & [Datum] & "_" & [Tst_Toets] & "_" & [StJ_Vanaf] & "_" & [StJ_Tot] AS DocumentNaam, tbl_Inleveren.[Inleveren Meenemen] AS InMee, tbl_GeslotenOpen.[Gesloten open] AS GeslotenOpen, tbl_Nieuw.[Nieuw blad] AS Nieuw, tbl_Rekenmachine.Rekenmachine, tbl_Communiceren.Communiceren, tbl_Toetsrooster.Literatuur, tbl_Toetsrooster.[Extra opmerkingen] AS Extra
FROM tbl_Toetsen INNER JOIN (tbl_Rekenmachine INNER JOIN (tbl_Nieuw INNER JOIN (tbl_GeslotenOpen INNER JOIN (tbl_Inleveren INNER JOIN (tbl_Communiceren INNER JOIN (tbl_Studiejaar INNER JOIN (tbl_Lokalen INNER JOIN (tbl_Groep INNER JOIN tbl_Toetsrooster ON tbl_Groep.Groep_ID = tbl_Toetsrooster.Groep) ON tbl_Lokalen.Lok_ID = tbl_Toetsrooster.Lokaal) ON tbl_Studiejaar.StJ_ID = tbl_Toetsrooster.Studiejaar) ON tbl_Communiceren.COMM_ID = tbl_Toetsrooster.Communiceren) ON tbl_Inleveren.INLV_ID = tbl_Toetsrooster.[Inleveren of Meenemen]) ON tbl_GeslotenOpen.GO_ID = tbl_Toetsrooster.[Gesloten of Open]) ON tbl_Nieuw.NW_ID = tbl_Toetsrooster.[Elke vraag nieuw blad]) ON tbl_Rekenmachine.RKM_ID = tbl_Toetsrooster.Rekenmachine) ON tbl_Toetsen.Tst_ID = tbl_Toetsrooster.Toets
WHERE  tbl_Toetsrooster.Id = Forms!frm_Toetsrooster_Bekijken!Id;

Groet,

Tardis
 
Hmmm, het werkt niet, helaas... Ik zie ook niet echt wat er fout is, maar then again zulke lange SQL syntaxen ben ik niet gewend.
 
Normaal gesproken werkt deze aanpak.
Waarom bij jou niet valt zo niet te zeggen.

Heb je geprobeerd om je query los te draaien (zonder alle andere code)?

Groet,

Tardis
 
Nu wel ja, en hij vraagt om een "Parameter waarde" op te geven. Als ik dan een bestaand Id invoer, geeft hij alleen dat record. Dit is dus wel zoals het hoort, denk ik. Maar de export functie werkt hierdoor niet meer. Die zegt dat er "Te weinig paramaters zijn. Verwachte aantal is: 1"
 
Melding "te weinig parameters" komt door de verwijzing naar het formulierveld.
Beste wat je kan doen is een aparte tabel maken, je query ombouwen naar een toevoegquery en de gegevens naar de tabel schrijven.
Bron voor je exportfunktie wordt dan je tabel.

Er zijn nog wat meer zaken waar je in je VBA code rekening mee moet gaan houden.
Vraag is of je thuis bent in VBA.

Groet,

Tardis
 
Ik ben niet thuis in VBA, wel in Java en ze gebruiken allebei SQL. Dus in SQL ben ik wel thuis alleen ben niet zulke lange syntaxen gewend. Daar ben ik nog niet zo goed in. Ook heeft VBA zowiezo wel een beetje iets weg van Java, maar dat hebben alle programmeertalen wel met elkaar natuurlijk.

Maargoed het punt: de verwijzing is dus niet goed? De formuliernaam en de naam van het tekstvak kloppen gewoon. Wat is er dan fout aan?
 
Het probleem is niet de verwijzing maar de export funktie.
Die opent de querie als recordset, de verwijzing naar het formulier is als het ware al weg.

Een oplossing is om met een tabel te werken en die te vullen via je query.
Probeer eerst eens om je query om te bouwen naar een toevoegquery en toe te voegen aan een tabel.
Wel eerst even de tabel maken.

Groet,

Tardis
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan