Avatar billede anders_holm Nybegynder
11. juni 2013 - 00:26 Der er 10 kommentarer og
1 løsning

Kopierer udfyldt tekst fra kontrolelement(alm. tekst) til ekstra mulighed i rullefelt

Hej,

Jeg har forgæves forsøgt at lave følgende i Word:

En word dokument med 2 kontrolelementer: Den ene er et "tomt" kontrolelement med alm. tekst. Det andet er et rullefelt med pt. kun en forudprogammeret valgmulighed.

Når kontrolelementet med alm. tekst udfyldes bliver teksten "kopieret" til en valgmulighed i nr. 2 (ekstra valgmulighed) i rullefeltet.

Hvordan gøres dette?
Avatar billede Mads Larsen Nybegynder
11. juni 2013 - 15:49 #1
Det kan gøres med VBA

Jeg har oprettet en TextBox og en Combobox og indsat denne kode ved TextBox1_Keydown.

KeyCode 13 = Enter knappen

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode.Value = 13 Then
        ComboBox1.AddItem (TextBox1.Text)
    End If
End Sub
Avatar billede anders_holm Nybegynder
12. juni 2013 - 00:09 #2
Først... tak for din indsats!

Kan dog ikke rigtigt få det til at virke... Der sker ikke rigigt noget. Teksten fra tekstboksen hopper ikke over og bliver valgmulighed nr. 2.

Har oprettet det i et .docm-dokument, har oprettet et textbox og en combobox, har skrevet en første valgmulighed ind i comboboxen, har låst comboxenen, har indsat koden - men det virker stadigt ikke! - Hvad gør jeg galt?

Har du evt. mulighed for at sende mig/uploade det test-dokument du fik det til at virke i?
Avatar billede Mads Larsen Nybegynder
12. juni 2013 - 08:21 #3
Her er et Word document, hvor det virker for mig.
Dog skal du lige regne med at det du tilføjer til ComboBox1 via. TextBox1 IKKE bliver gemt til næste gang du åbner. Det gør den ihver fald ikke i min Office XP

http://gupl.dk/697609/
Avatar billede Lene Fredborg Ekspert
16. juni 2013 - 01:04 #4
#3: Det er ActiveX controls, som er benyttet i dokumentet. Det er noget andet end kontrolelementer (content controls).

Du skal have tilføjet en makro med navnet "Document_ContentControlOnExit" i modulet ThisDocument i dit dokument. En sådan makro vil køre, hver gang du går ud af et kontrolelement.

Jeg har lavet en makro, som du kan bruge eller bygge videre på. Se kommentarerne i makroen. Bemærk, at jeg har givet tekstkontrollen titlen "Text1" og rullefeltet titlen "DropDown1" (angives i dialogboksen Egenskaber (Properties), som kan åbnes fra fanen Udvikler (Developer). Hvis du bruger andre navne, skal du rette i makroen, da den ellers ikke vil virke.
--------------------------

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    Dim strValue As String
    Dim oCC_DropDown As ContentControl
   
    'set reference to DropDown1 (if more found with that title, the first is used)
    Set oCC_DropDown = ActiveDocument.SelectContentControlsByTitle("DropDown1").Item(1)
   
    'if Text1 has been changed, add value to DropDown1 on exit
    If ContentControl.Title = "Text1" Then
        strValue = ContentControl.Range.Text
        'if not the deafault value and not an empty string or spaces only, add value to DropDown1
        If strValue <> ContentControl.PlaceholderText And Trim(strValue) <> "" Then
   
            'if only one item, add - else: first delete item 2, then add
            If oCC_DropDown.DropdownListEntries.Count > 1 Then
                'first delete existing item 2
                oCC_DropDown.DropdownListEntries(2).Delete
            End If
            oCC_DropDown.DropdownListEntries.Add Text:=strValue, Value:=strValue
           
        ElseIf strValue = ContentControl.PlaceholderText Then
            'if text previously entered and now removed, remove item 2 from DropDown1
            If oCC_DropDown.DropdownListEntries.Count > 1 Then
                oCC_DropDown.DropdownListEntries(2).Delete
            End If
        End If
    End If

    'clean up
    Set oCC_DropDown = Nothing

End Sub
--------------------------

Se denne artikel for mere info, som måske kan være til hjælp:
http://gregmaxey.mvps.org/word_tip_pages/insert_content_with_content_controls.html
Avatar billede anders_holm Nybegynder
16. juni 2013 - 18:16 #5
Tak! - Det var faktisk content controls jeg ønskede at bruge!

Men hvordan få jeg macroen til, at gøre det gældende for alle rullefelter ved navn "DropDown1" og altså ikke bare den første?
Jeg har prøvet at slette .Item(1) men så virker hele macroen ikke mere!?
Avatar billede Lene Fredborg Ekspert
16. juni 2013 - 18:33 #6
Er det med fuldt overlæg, at du har flere rullefelter med samme navn? Det lyder umiddelbart ikke korrekt - men de skal måske altid vise samme indhold, dvs. indholdet fra "Text1"?

I øvrigt: i stedet for at bruge navne som "Text1" og "DropDown1" er det meget bedre at bruge beskrivende navne - men jeg ved jo ikke, hvad du har i dine kontroller, så derfor har jeg blot givet dem neutrale navne.
Avatar billede anders_holm Nybegynder
16. juni 2013 - 21:34 #7
Meningen er at jeg har et felt (alm. tekst content control) hvor jeg skrever et navn i og en masse felter (rullefelt content control) der kopiere navnet og sætter navnet ind som valgmulighed nr. 2 i rullefelterne.

Alt tektsten i dokumentet skal indsættes via macroer. Det alm. tekst felt i en makro og de øvrige rullefelter i hver sine makroer. Rullefelterne har 100% samme indhold gennem hele dokumentet, men skal individuelt kunne vælges og kunne gemmes i word og "forblive individuelt valgt" ved gemningen.

Eksempel:

---Makro 1:---
Idag var jeg ude at gå med _________ (alm. tekst felt)
-----------------

---Makro 2:---
Da vi kom til første iskiosk købte _________[Jeg / <indsæt fra alm. tekst felt>] (rullefelt) en is til os begge.
-----------------

---Makro 3:---
Da vi kom til anden iskiosk købte _________[Jeg / <indsæt fra alm. tekst felt>] (rullefelt) en is til os begge.
-----------------

---Makro 4:---
Da vi kom til tredje iskiosk købte _________[Jeg / <indsæt fra alm. tekst felt>] (rullefelt) en is til os begge.
-----------------


Det er ikke sikkert, at det er smart at have samme title på alle rullefelter, men det var blot den eneste løsning jeg lige umiddelbart kunne se ud fra din ellers fantastiske løsning.
Avatar billede Lene Fredborg Ekspert
16. juni 2013 - 23:47 #8
OK. Hvis jeg har forstået det rigtigt, så vil denne version gøre det, du ønsker. Se kommentarer i koden. Alle rullefelterne skal have samme navn i denne situation ("DropDown1" eller noget mere beskrivende).

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    Dim strValue As String
    Dim oCC As ContentControl
   
    'if Text1 has been changed, add value to all dropdown content controls with name "DropDown1" on exit
    If ContentControl.Title = "Text1" Then
        strValue = ContentControl.Range.Text
        'if not the deafault value and not an empty string or spaces only, add value to DropDown1
        If strValue <> ContentControl.PlaceholderText And Trim(strValue) <> "" Then
   
            'check all content controls - if name = "DropDown1" and type is dropdown, then add/replace item
            For Each oCC In ActiveDocument.ContentControls
                If oCC.Title = "DropDown1" And oCC.Type = wdContentControlDropdownList Then
                    'if only one item, add - else: first delete item 2, then add
                    If oCC.DropdownListEntries.Count > 1 Then
                        'first delete existing item 2
                        oCC.DropdownListEntries(2).Delete
                    End If
                    oCC.DropdownListEntries.Add Text:=strValue, Value:=strValue
                   
                ElseIf strValue = ContentControl.PlaceholderText Then
                    'if text previously entered and now removed, remove item 2 from DropDown1
                    If oCC.DropdownListEntries.Count > 1 Then
                        oCC.DropdownListEntries(2).Delete
                    End If
                End If
            Next oCC
        End If
    End If

End Sub
Avatar billede anders_holm Nybegynder
18. juni 2013 - 13:45 #9
Det virker :-)

Er det dog muligt at udvide koden, så den også virker hvis man indsætter macro1 med det alm. tekst felt og udfylder feltet med navnet først og så først efterfølgende indsætter macro2, macro3, macro4 mv... med rullefelterne...?

Altså så man både kan vælge:

(1)-at indsætte alle de ønskede macroer først og så bagefter  udfylde "Text1" med navn og så kan finde det som valgmulighed 2 i et vilkårligt "DropDown1"-rullefelt.
(VIRKER MED KODEN FORSLÅET AF LENE-FREDBORG).

samt:

(2)-at indsætte macro1 med "Text1" først og udfylde dette med navn og så bagefter fx indsætte macro2, macro4 og macro7 og så finde navnet som valgmulighed 2 i disse rullefelter.
(VIRKER PT IKKE).

???? - Så ville koden være som jeg havde forstillet mig.
Avatar billede Lene Fredborg Ekspert
18. juni 2013 - 14:14 #10
Først fik du serveret en makro, som gjorde, hvad du havde beskrevet i første omgang. Du ændrede dernæst ønsker/krav og fik serveret en ny makro, som opfyldte de ønsker/krav. Nu ændrer du igen på, hvad målet er. Derfor bør derfor lukke dette spørgsmål og oprette et nyt. Måske nogen er klar til at hjælpe dig videre. Du kan jo også prøve at arbejde videre med koden selv.

Dette er lavet som et svar, som giver dig mulighed for at acceptere det.
Avatar billede anders_holm Nybegynder
18. juni 2013 - 14:27 #11
Du har ret... Jeg var ikke specifik nok i første omgang og havde ikke forudset, at det ikke ville virke på begge måder.

Jeg siger tak for din hjælp og må få løst problemmet på en anden måde.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Tag et kursus i Word og øg effektiviteten

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester