Vaste tekst na keuze uit combobox

Status
Niet open voor verdere reacties.

maomanna

Gebruiker
Lid geworden
20 feb 2014
Berichten
234
Voor een document heb ik een userform met daarop een combobox.
Deze wordt gevuld met een array bij initialize van het document.

Nu wil ik bij een standaard tekst op de documentvariabele na het kiezen van een van de drie opties.

Daarnaast moet er een extra veld bijkomen als optie 1 wordt gekozen.

Een voorbeeld is toegevoegd. Bekijk bijlage test.zip
 
Je voorbeeldje is behooorlijk onduidelijk, en ondersteunt je vraag m.i. ook niet. Al zie ik wel een keuzelijst staan, maar ik heb geen idee wat je wilt.
Nu wil ik bij een standaard tekst op de documentvariabele na het kiezen van een van de drie opties.
Daarnaast moet er een extra veld bijkomen als optie 1 wordt gekozen.
En deze zinnen helpen daarbij ook niet echt...
 
in de combobox heb ik 3 opties die gekozen kunnen worden.

Nu is het zo dat de inhoud van de combobox wordt overgenomen in de docvariabele in het word-document.
Wat ik niet wil is dat de inhoud van de combobox in de docvariabele wordt geplaatst, maar een tekst.

In de vba van het testbestand staat dit:

Code:
Case "Optie1"
      cboOpdrOpties = "Tekst 1"
   Case "Optie2"
      cboOpdrOpties = "Tekst 2"
   Case "Optie3"
      cboOpdrOpties = "tekst 1"
   End Select

Als ik in de combobox optie 1 selecteer, moet hij Tekst 1 in het worddocument plaatsen en niet "Optie1" (wat hij nu doet).


wat ik bedoel met een extra veld, is dat zodra optie 1 wordt gekozen, er extra informatie ingevuld moet worden welke in het document geplaatst moet worden.

hopelijk is het nu wat duidelijker.
 
Je geeft niet aan waar die extra tekst moet komen; ik zou daar een aparte DocVariabele voor gebruiken. Maar die is er dus niet :).
Om te beginnen: je opzet is nu niet helemaal correct meer. Als je een variabele wilt hergebruiken in een andere routine, moet je hem globaal declareren en niet in een procedure. Dus helemaal bovenin:
Code:
Option Explicit
Dim strOpdrOpties As String, strExtraZin As String
Daarnaast moet je de naam van de variabele niet hetzelfde doen als de naam van het object, want daar wordt Word natuurlijk helemaal gek van. Zie het alsof je 12 kinderen hebt, die allemaal Jaap heten. Niet handig :).

Code:
Private Sub cboOpdrOpties_Change()
    Select Case cboOpdrOpties
        Case "Optie1"
           strOpdrOpties = "Tekst 1 als voorbeeld"
        Case "Optie2"
           strOpdrOpties = "Tekst 2 als ander voorbeeld"
        Case "Optie3"
           strOpdrOpties = "tekst 3 als ultieme voorbeeld"
    End Select
End Sub

En dit is genoeg om de veldcode te plaatsen:
Code:
Private Sub cmdok_Click()
Dim ct As Control
Dim docVar As Variable
Dim shp As InlineShape

    For Each ct In Controls
        If TypeName(ct) = "TextBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Text = "", " ", ct.Text)
        If TypeName(ct) = "CheckBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Value = 0, 0, 1)
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
        End If
    Next

    For Each shp In ActiveDocument.InlineShapes
        With shp
            If .OLEFormat.ProgID = "Forms.OptionButton.1" Then
                .OLEFormat.Object.Value = Me("Opt" & .OLEFormat.Object.Name).Value
            End If
        End With
    Next shp
    
    ActiveDocument.Fields.Update
    Unload Me

End Sub
 
De extra tekst werkt prima! ook de declaratie bovenin gaat goed.

Alleen gaat er in velden erna wat fout (in het werkbestand, welke ik helaas niet mag delen)
Het is me gelukt om het probleem te reproduceren naar het testbestand.

Bekijk bijlage test.zip

De extra velden heb ik toegevoegd.
 
En wat is het probleem dan? Ik zie wel een ontwerpfout, op basis van je initiele vraag tenminste.... Je wilt extra tekst als optie 1 wordt gekozen, wat m.i. inhoudt dat je géén extra tekst wilt als er andere opties worden gekozen. Maar je hebt wél al alle variabelen in eigen alinea's in je tekst gezet. Dus wat je ook doet: je houdt in ieder geval een bak lege (of gevulde, als je optie 1 kiest) alinea's in je document. Ik zou een variabele pas vullen op het moment dat je wat kiest, en ik zou alle tekst daarbij in één variabele zetten. En die dus leeg maken als er niks gekozen wordt. En ook de alinea-einde in de variabele meenemen, zodat je geen nodeloze lege regels krijgt.
 
je slaat de spijker op zn kop.
Je omschrijft mijn vraag perfect.

De variabelen wil ik eigenlijk in een bijlage/nieuwe pagina zetten.
Die nieuwe pagina zou niet gemaakt moeten worden als een andere optie wordt gekozen dan optie 1.
 
Des te meer reden om geen losse variabelen al in je document te zetten :). Het is niet zo moeilijk om op basis van de keuze aan het eind van het document een nieuwe pagina toe te voegen met de extra teksten.
 
het probleem is alleen dat ik niet weet hoe ik dat moet doen. :o

met zoekwoorden waar ik naar moet zoeken, kom ik al een heel eind.

Met het andere bestand ben ik een heel eind gekomen, al is dat behoorlijk 1:1 zonder voorwaardes/extra opties.
 
Laatst bewerkt:
Je geeft niet aan waar die extra tekst moet komen; ik zou daar een aparte DocVariabele voor gebruiken. Maar die is er dus niet :).
Om te beginnen: je opzet is nu niet helemaal correct meer. Als je een variabele wilt hergebruiken in een andere routine, moet je hem globaal declareren en niet in een procedure. Dus helemaal bovenin:
Code:
Option Explicit
Dim strOpdrOpties As String, strExtraZin As String
Daarnaast moet je de naam van de variabele niet hetzelfde doen als de naam van het object, want daar wordt Word natuurlijk helemaal gek van. Zie het alsof je 12 kinderen hebt, die allemaal Jaap heten. Niet handig :).

Code:
Private Sub cboOpdrOpties_Change()
    Select Case cboOpdrOpties
        Case "Optie1"
           strOpdrOpties = "Tekst 1 als voorbeeld"
        Case "Optie2"
           strOpdrOpties = "Tekst 2 als ander voorbeeld"
        Case "Optie3"
           strOpdrOpties = "tekst 3 als ultieme voorbeeld"
    End Select
End Sub

En dit is genoeg om de veldcode te plaatsen:
Code:
Private Sub cmdok_Click()
Dim ct As Control
Dim docVar As Variable
Dim shp As InlineShape

    For Each ct In Controls
        If TypeName(ct) = "TextBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Text = "", " ", ct.Text)
        If TypeName(ct) = "CheckBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Value = 0, 0, 1)
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
        End If
    Next

    For Each shp In ActiveDocument.InlineShapes
        With shp
            If .OLEFormat.ProgID = "Forms.OptionButton.1" Then
                .OLEFormat.Object.Value = Me("Opt" & .OLEFormat.Object.Name).Value
            End If
        End With
    Next shp
    
    ActiveDocument.Fields.Update
    Unload Me

End Sub


Met deze code wordt elke Combobox ingevuld met de tekst uit de gekozen optie.
ook velden die worden gevuld vanuit de combobox worden niet automatisch meer geupdate.

Het lijkt erop dat de declaraties niet helemaal goed gaan.
 
Laatst bewerkt:
ik heb een extra declaratie gemaakt op de andere cbo's.

Code:
 For Each ct In Controls
        If TypeName(ct) = "TextBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Text = "", " ", ct.Text)
        If TypeName(ct) = "CheckBox" Then ActiveDocument.Variables(ct.Name) = IIf(ct.Value = 0, 0, 1)
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
        End If
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrEenheid = "", " ", strOpdrEenheid)
        End If
    Next

en deze strOpdrEenheid bij de Option Explicit gezet.

lijkt te werken!
 
Dan zou ik zeggen: document erbij met de laatste versie :).
 
Laten we even naar je code kijken, en bekijken wat je nu precies doet. Het gaat dan om dit stukje:
Code:
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
        End If
        If TypeName(ct) = "ComboBox" Then
            ActiveDocument.Variables(ct.Name).Value = IIf(strOpdreenheid = "", " ", strOpdreenheid)
        End If

Hier heb je twee identieke opdrachten, die beide dus op dezelfde keuzelijst worden losgelaten. De eerste If..End If doet het juiste (voor de eerste keuzelijst dan). Die zet de variabele strOpdrOpties in de DocVariable. Maar daarna doe je precies hetzelfde, maar nu zet je de variabele strOpdreenheid er in. En die is leeg.... Omdat de laatste opdracht blijft staan, is dat dus je resultaat. Kortom: wat je wilt, kan zo niet. Je zult elke variabele moeten vullen op basis van de naam. En dat kan dus best als subloop binnen de eerste loop.
 
Hier kom je volgens mij wel een eind mee...
Code:
        If TypeName(ct) = "ComboBox" Then
            Select Case ct.Name
                Case "cboOpdrOpties"
                    ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
                Case "cboOpdreenheid"
                    ActiveDocument.Variables(ct.Name).Value = IIf(Me.cboOpdreenheid.Value = "", " ", Me.cboOpdreenheid.Value)
            End Select
        End If
 
het lijkt de goede kant op te gaan.
Als ik 3 cbo's heb, dan wordt het dus dit:

Code:
If TypeName(ct) = "ComboBox" Then
            Select Case ct.Name
                Case "cboOpdrOpties"
                    ActiveDocument.Variables(ct.Name).Value = IIf(strOpdrOpties = "", " ", strOpdrOpties)
                Case "cboOpdreenheid"
                    ActiveDocument.Variables(ct.Name).Value = IIf(Me.cboOpdreenheid.Value = "", " ", Me.cboOpdreenheid.Value)
                Case "cboBehoefte"
                    ActiveDocument.Variables(ct.Name).Value = IIf(Me.cboBehoefte.Value = "", " ", Me.cboBehoefte.Value)
            End Select

Helaas vult hij de derde niet. (cboOpdrEenheid).

handmatig (rechtermuis -> Veld bijwerken) kan het wel, maar niet de bedoeling
 
Laatst bewerkt:
Als de DocVariable in je document anders heet, dan gaat de code niet werken. Dat is de enige reden die ik kan verzinnen. Ik neem tenminste aan dat je de keuzelijst in de code hebt gezet met de IntelliSense techniek (Me.c typen, en dan de keuzelijst selecteren uit de lijst) zodat je zeker weet dat die bestaat en de naam correct is.
 
hij staat goed.
als ik hem handmatig (rechtermuis -> Veld bijwerken) bijwerk, pakt hij de nieuwe waarde wel, maar dat is niet de bedoeling
 
Dat updaten gaat m.i. nodeloos ingewikkeld:
Code:
    ActiveDocument.Fields.Update
is al genoeg.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan