Formulier met gegevens uit Excel

Status
Niet open voor verdere reacties.

René2322

Gebruiker
Lid geworden
8 jun 2005
Berichten
10
Goedemiddag,

Voor m'n werk ben ik bezig met een soort klant-specifieke handleiding. Hiervoor zou ik graag een beveiligd formulier in Word hebben. Hierin zou, naast wat klantspecifieke gegevens een pull-down menu moeten komen welke gevuld is met een serie waarden uit een excel-document (A1-A20). De rest van het document bevat een hoeveelheid standaardtekst waarbij her en der waarden moeten komen welke corresponderen met de keuze uit het pull-down menu. Als ik dus waarde A4 kies, zou de rest van het document gevuld moeten worden met B4 tot zeg maar H4.
Een ingevuld formulier wordt vervolgens bewaard als PDF.

De reden dat ik dit niet in Excel doe is omdat ik de opmaak hierin niet acceptabel vind. Vandaar dat ik een poging in Word wil wagen.

De mail-merge functie bied voor zover ik weet niet hetgeen ik zoek. De standaard formulier elementen lijken niet naar een extern document te kunnen linken. En het is me tot nog toe niet gelukt om middels een macro te verwijzen naar een tekstvak welke zich niet op een userform bevind. Met een userform kan ik de gewenste gegevens ophalen, echter zou ik niet weten hoe ik ze vervolgens op de gewenste plaatsen in mijn tekst krijg. Ondanks dat Google toch vaak mijn vriend is kan ik dit keer niets vinden.

Ik kan me niet voorstellen dat hetgeen ik wil niet kan. Is er iemand doe mij een schop in de juiste richting kan / zou willen geven.

Bvd,
René

// Ik werk trouwens met Office 2007 (word, excel, powerpoint en outlook).
 
Je zult toch met een Userform moeten gaan werken als je keuzelijsten wilt vullen vanuit Excel. Dat kan, want je kunt in VBA een Excel sessie openen, en de gegevens ophalen. Misschien dat het ook nog wel op andere manieren kan, maar via een Excel sessie is denk ik het makkelijkst.
Op deze pagina vind je (na de voorbeelden van Word en Access) een aantal methodes om keuzelijsten te vullen vanuit Excel. Allicht dat je er één van aan de praat krijgt :)
 
Bedankt voor de reactie. De keuzelijst vullen vanuit een userform is geen probleem voor mij. Het lukt me om te connecten met een opgegeven exceldocument en hier gegevens uit te halen. Wat ik dan alleen mis is de kennis/mogelijkheid om deze keuze, en zeg 8 bijbehorende waarden, naar verschillende tekstvakken in m'n formulier te schieten.

Ik zal de opgegeven link volgen. Mogelijk staat hier nog een en ander in.


Heel simpel gezegd wil ik dus:
Keuzelijst ==> Ronald (array: Ronald, Mark, Bas)
OK

En dan mijn formulier gevuld krijgen met:

Ronald heeft 4 van de 8 keer raak geschoten en gaat hierdoor niet naar de volgende ronde.

René
 
Teksten die je uit een formulier haalt, kun je met DocProperty veld in een document plaatsen, of met Bladwijzers. Ik gebruik zelf deze constructie in een specifiek formulier om waarden uit een tekstveld in een document te zetten:
Code:
For Each ctl In Controls
    With ctl
        If Left(.Name, 4) = "Text" Then
            sVeld = .Tag
            If Not Me(ctl.Name) = "" Then
                sWaarde = .Value
                On Error Resume Next
                ActiveDocument.CustomDocumentProperties(sVeld).Delete
                ActiveDocument.CustomDocumentProperties.Add Name:=sVeld, LinkToContent:=False, _
                    Value:=sWaarde, Type:=msoPropertyTypeString
                If ActiveDocument.Bookmarks.Exists(sVeld) Then
                    If InStr(1, sVeld, "Totaal") > 0 Then
                        ActiveDocument.Bookmarks(sVeld).Range.Text = Format(Me(ctl.Name).Value, "Currency")
                    Else
                        ActiveDocument.Bookmarks(sVeld).Range.Text = Me(ctl.Name).Value
                    End If
                End If
            End If
        End If
    End With
Next
Deze methode maakt gebruik van de eigenschap Tag van formulierobjecten om de naam van de bladwijzers in het document op te slaan. Elke control wordt dus uitgelezen, en als er een Tag is wordt de waarde uit het veld in het document bij de aangewezen bladwijzer neergezet.
Je ziet ook nog twee regels die de formulierwaarden opslaan in CustomDocumentProperties. Deze worden bij het opslaan vervangen door de nieuwe waarden van het formulier. Voordeel daarvan is dat als je het document de volgende keer opent, je de opgeslagen waarden weer makkelijk kunt uitlezen en in het formulier zetten, zodat de gebruiker ze niet opnieuw hoeft in te voeren. Die twee regels kun je uiteraard verwijderen.
 
Heel erg bedankt. De grove lijnen begrijp ik. Ben het geheel nu aan het toepassen. Hopelijk lukt dit zonder verdere vragen.
 
Toch nog even een vraag...

Middels de early binding wil ik een array vullen met gegevens uit excel.
Omdat het een range van 3 kolommen en (max) 100 rijen betreft denk ik dat ik dan spreek over een multidimensionale array.

Wat ik wil is een userform met 3 listboxes, waarvan de eerste wordt gevuld met waardes uit de eerste kolom uit de range. Een keuze uit de 1e listbox zou als event moeten fungeren om de 2e listbox te vullen met waardes uit de 2e kolom (waarbij de waarde uit de 1e kolom overeenkomt met de keuze van de 1e listbox). Misschien dat ik hiervoor een 2e array moet aanmaken.

Ik kom niet verder dan het vullen van de 1e listbox. Wanneer ik vervolgens een poging doe om alle waardes van de array in een msgbox te printen (eens kijken hoe de array er dan uit ziet) krijg ik een fout in een subscript.

De volgende code heb ik op het pad na gekopieerd van: http://gregmaxey.mvps.org/word_tip_pages/populate_userform_listbox_or_combobox.html
Code:
Private Sub Userform_Initialize()
'Uses early binding and requires a reference to the Excel Object Library _
  see:  http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm
Dim xlApp As Excel.Application
Dim xlbook As Excel.Workbook
Dim Listarray As Variant
Dim bStartApp As Boolean
  On Error Resume Next
  Set xlApp = GetObject(, "Excel.Application")
  If Err Then
    bStartApp = True
    Set xlApp = New Excel.Application
  End If
  On Error GoTo 0
  With xlApp
    Set xlbook = .Workbooks.Open(ActiveDocument.Path & "\TestSheet.xls")
    Listarray = xlbook.Names("mySSRange").RefersToRange.Value
    xlbook.Close SaveChanges:=False
    Set xlbook = Nothing
  End With
  If bStartApp Then xlApp.Quit
  Set xlApp = Nothing
  With ListBox1
    .ColumnCount = UBound(Listarray, 2)
    .Clear
    .List() = Listarray
  End With
lbl_Exit:
  Exit Sub
End Sub

Wanneer MySSRange een range is van 1 kolom en 3 rijen, krijg ik netjes 3 waarden in m'n listbox. Als ik de range aanpas naar 3 rijen en 3 kolommen, dan krijg ik een listbox waarin 3 waarden per regel staan. Een aanpassing aan de code:
Code:
    .Clear
    .ColumnCount = 1 'UBound(Listarray, 2)
    .List() = Listarray
Maakt dat ik weer enkel de eerste kolom zie. Snap alleen niet hoe de array er nu uit ziet.

De code die ik vervolgens gebruik om te zien waar de array nu eigenlijk uit bestaat:

Code:
    Dim vntArray As Variant
    Dim strBuf As String
    Dim intIndex As Integer

    vntArray = Listarray
    For intIndex = LBound(vntArray) To UBound(vntArray)
        strBuf = strBuf & "Index " & intIndex & " = " & vntArray(intIndex) & vbLf
    Next
    MsgBox "My Array contains the following " & vbLf & strBuf, vbInformation

Wat ik mis: kennis... Zijn er nog handige websites met voorbeelden en/of uitleg (engels of nederlands), of is er hier iemand die me enige uitleg kan en wil geven.

bvd,
Ren�
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan