Avatar billede hcthorsen Praktikant
04. februar 2016 - 14:02 Der er 41 kommentarer og
1 løsning

Makroer i Word

Kære eksperter

Jeg har et word-dokument med en tabel. Jeg kunne godt tænke mig at lave det sådan, at man kan trykke på en linie i den pågældende tabel, og så kopieres nogle tal fra den pågældende linie over andre steder i dokumentet. Tænker at det skal laves med makroer, eller hvad? Hvis det er makroer der skal til, hvordan kommer jeg så i gang med det? Jeg kan godt finde ud af at indspille en makro for hver linie i tabellen, men det er en lidt klodset måde at gøre det på.
04. februar 2016 - 14:48 #1
Hej
Har du overvejet bogmærker og felter?

Hvis du sætter et Bogmærke om teksten i tabellen kan du et andet sted bruge feltet REF til at vise det der står i bogmærket.
f.eks. {REF test }

Husk at opdatere feltet med "Vis udskrift"

Du indsætter bogmærker fra Fanen Indsæt --> Bogmærker og feltet fra Indsæt --> Hurtigdele --> Felter.

Med venlig hilsen

Birthe Lauridsen
Praktisk IT
Avatar billede hcthorsen Praktikant
04. februar 2016 - 14:54 #2
Det havde jeg ikke overvejet, men kan det bruges når man skal vælge hvilket linie i tabellen man vil bruge?
Avatar billede supertekst Ekspert
04. februar 2016 - 14:58 #3
Hvis kopiering til bogmærke så er det let via en makro.
Avatar billede hcthorsen Praktikant
04. februar 2016 - 15:06 #4
Har du et fif til hvor man kan lære lidt om det? Jeg går ikke ud fra at jeg bare kan indspille en makro.
Avatar billede supertekst Ekspert
04. februar 2016 - 15:21 #5
Prøv at søge - f.eks. her på Eksperten. Hvis du søger i Programmer / Tekstbehandling / Word / Tables+Bookmark
04. februar 2016 - 15:29 #6
Hej igen
Under felter er der også et der hedder MacroButton. Den kan du sætte ind i cellen i tabellen.
(se her
http://word.mvps.org/FAQs/tblsfldsfms/usingmacrobutton.htm)

Du kan så oprette en makro der sætter et bogmærke ind (som du så kan bruge i dit REF felt). Din udfordring bliver at navngive bogmærket for de skal jo have forskellige navne. Det tror jeg ikke at du kan optage.

f.eks. ActiveDocument.Tables(1).Cell(1, 1) som er 1. celle i kolonne 1. Bliver til BmA1

(se her: https://msdn.microsoft.com/en-us/library/office/ff838362.aspx)

En anden vinkel er at indsætte bogmærker i teksten og så lade makroen finde bogmærket (Søg med F5) og sætte teksten ind der. Det bliver nok lidt mere simpelt rent kodemæssigt.

Du skal stadig rette i koden så den aflæser cellen, for at finde bogmærket.

Håber det bringer dig lidt videre.

Med venlig hilsen

Birthe Lauridsen
Praktisk IT
Avatar billede hcthorsen Praktikant
04. februar 2016 - 15:32 #7
Tak. Jeg har ikke lige tid at kigge på det nu, men vender snarest tilbage.
Avatar billede supertekst Ekspert
04. februar 2016 - 18:22 #8
#7 Har konstrueret en lille model, hvis du er interesseret.
Avatar billede hcthorsen Praktikant
04. februar 2016 - 22:26 #9
#6: Tak for svar. Kigger på det i morgen. Børnene vågner tidligt, så må hellere hoppe i seng.
#8: Den vil jeg da meget gerne se.
Avatar billede supertekst Ekspert
05. februar 2016 - 09:21 #10
Avatar billede hcthorsen Praktikant
05. februar 2016 - 09:38 #11
#10: Sidder og kigger på det nu. Kan ikke lige se at det virker, men arbejder videre:-)
Avatar billede supertekst Ekspert
05. februar 2016 - 09:57 #12
Hvis man klikker på A'et i den første række udføres den makro som er defineret i relation til det felt - jfr. med billedet heraf.
Makroen er så vist for dette felt. Men den er indlagt i dokumentet.

Tilsvarende skal udføres for de øvrige rækker.

Selve VBA-koden kan godt optimeres.
Avatar billede hcthorsen Praktikant
05. februar 2016 - 10:21 #13
Ja, ok nu fatter jeg det. Som du nok fornemmer, så er jeg ikke nogen ørn til det her. Jeg ved ikke om jeg evner at skrive VBA-koden om, men jeg tænker at jeg vel bare kan indspille nogle makroer og knytte dem til feltet.
Avatar billede hcthorsen Praktikant
05. februar 2016 - 10:22 #14
I har begge været meget hjælpsomme. Er det ikke fair at I deler pointene?
Avatar billede supertekst Ekspert
05. februar 2016 - 10:40 #15
Det er ok med deling.

ps: Hvis du er interesseret kan du give mig lidt mere info om din udfordring - så skal jeg hjælpe. Evt. send til @-adressen under min profil.
Avatar billede hcthorsen Praktikant
05. februar 2016 - 10:49 #16
Når jeg prøver at bruge din VBA, så siger den "Det pågældende medlem af samlingen findes ikke". Hvor definerer man at tabellen er Tables(1)?
Avatar billede supertekst Ekspert
05. februar 2016 - 11:01 #17
tekst1 = Tables(1).Cell(1, 2)
(1) refererer til at det er den første tabel i dokumentet.


Den korte VBA-version til den viste tabel:

Dim ræk As Integer, kol As Integer
Dim antalKol As Integer
Public Sub A_Test()
    udfyldBM 1
End Sub
Public Sub B_Test()
    udfyldBM 2
End Sub
Public Sub C_Test()
    udfyldBM 3
End Sub
Public Sub D_Test()
    udfyldBM 4
End Sub
Public Sub E_Test()
    udfyldBM 5
End Sub
Private Sub udfyldBM(Nr)
    antalKol = ActiveDocument.Tables(1).Columns.Count
       
    For kol = 2 To antalKol
        Bookmarks("bm" & kol - 1).Select
        Selection.TypeText Text:=klargørIndhold(Nr, kol)
    Next kol
End Sub
Private Function klargørIndhold(ræk, kol)
Dim tekst1, tekst2
        tekst1 = Tables(1).Cell(ræk, kol)
        tekst2 = Replace(tekst1, Chr(7), "")
        klargørIndhold = tekst2
End Function
Avatar billede hcthorsen Praktikant
05. februar 2016 - 11:39 #18
Ok, nu går du amok. Jeg er kommet igang med din første kode. Den kunne jeg til nød gennemskue, men synes den seneste er lidt langhåret. Jeg drikker vist ikke nok cola, og har aldrig prøvet rollespil:-)

Hvis nu jeg vil i stedet for værdien i tabellen vil indsætte værdien / 3. Hvad skal jeg så skrive i VBA-koden?
Avatar billede supertekst Ekspert
05. februar 2016 - 11:52 #19
Nej - jeg går ikke amok, drikker heller ikke cola eller deltager i rollespil - men har arbejdet med programmering i mange år.. :-)

Vender tilbage..
Avatar billede supertekst Ekspert
05. februar 2016 - 11:56 #20
Dim tekst1, tekst2
        tekst1 = Tables(1).Cell(1, 2)
        tekst2 = Replace(tekst1, Chr(7), "")
        Bookmarks("bm1").Select
        Selection.TypeText Text:=tekst2 / 3
Avatar billede hcthorsen Praktikant
05. februar 2016 - 14:18 #21
Jeg får ikke lige tid til at kigge mere på det i dag. Der skal laves mad til middagsgæster:-)
Avatar billede supertekst Ekspert
05. februar 2016 - 14:29 #22
Ok - god fornøjelse og en god weekend..
Avatar billede hcthorsen Praktikant
06. februar 2016 - 23:09 #23
Det begynder at dæmre for mig hvad det er du laver i koden. Lige nu bøvler jeg med at få word til at vise mig hvor mine bogmærker er. Jeg har sat flueben i "vis bogmærker", men det giver ingenting - grrrrr. Vender tilbage.
Avatar billede supertekst Ekspert
06. februar 2016 - 23:36 #24
Hvilken version af Word anvender du?
Avatar billede hcthorsen Praktikant
06. februar 2016 - 23:50 #25
Jeg forstår ikke lige hvad der sker i denne sætning:

tekst2 = Replace(tekst1, Chr(7), "")

Kan du kaste lys over sagen?
Avatar billede hcthorsen Praktikant
07. februar 2016 - 00:04 #26
Aha, nu forstår jeg hvorfor mine bogmærker slettes i dokumentet. Jeg har åbenbart ikke forstået hvad bogmærker er. Jeg troede man kunne indsætte samme bogmærke flere steder i dokumentet, men det kan man åbenbart ikke. Jeg har brug for at samme værdi fra en tabel indsættes flere steder i dokumentet.
Avatar billede hcthorsen Praktikant
07. februar 2016 - 00:38 #27
Jeg har egentlig fået din kode til at spille, men som ovenfor nævnt, så har jeg misforstået det med bogmærkerne. Derfor har jeg brug for at indsætte mange flere bogmærker. Jeg har brug for følgende:

bm1=kol2
bm2=kol2
bm3=kol3
bm4=kol2/2 (1 decimal)
bm5=kol3/2 (1 decimal)
bm6=kol2/3 (1 decimal)
bm7=kol3/3 (1 decimal)
bm8=kol2/3 (1 decimal)
bm9=kol3/3 (1 decimal)
bm10=kol3
bm11=kol2/3 (1 decimal)
bm12=kol2
bm13=kol2

Giver det mening?
Avatar billede supertekst Ekspert
07. februar 2016 - 11:24 #28
#25 Det er for at fjerne det tegn som findes sidste i celle
Avatar billede hcthorsen Praktikant
07. februar 2016 - 12:56 #29
Nu er jeg nået frem til følgende:

Dim ræk As Integer, kol As Integer
Public Sub A_udfyld()
    udfyldBM 1
End Sub
Public Sub B_udfyld()
    udfyldBM 2
End Sub
Public Sub C_udfyld()
    udfyldBM 3
End Sub
Public Sub D_udfyld()
    udfyldBM 4
End Sub
Public Sub E_udfyld()
    udfyldBM 5
End Sub
Public Sub F_udfyld()
    udfyldBM 6
End Sub
Public Sub G_udfyld()
    udfyldBM 7
End Sub
Public Sub H_udfyld()
    udfyldBM 8
End Sub
Public Sub I_udfyld()
    udfyldBM 9
End Sub
Private Sub udfyldBM(Nr)
    Bookmarks("bm1").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm2").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm3").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3)
    Bookmarks("bm4").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2) / 2
    Bookmarks("bm5").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3) / 2
    Bookmarks("bm6").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2) / 3
    Bookmarks("bm7").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3) / 3
    Bookmarks("bm8").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2) / 3
    Bookmarks("bm9").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3) / 3
    Bookmarks("bm10").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3)
    Bookmarks("bm11").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2) / 3
    Bookmarks("bm12").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm13").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
End Sub
Private Function klargørIndhold(ræk, kol)
Dim tekst1, tekst2
        tekst1 = Tables(1).Cell(ræk, kol)
        tekst2 = Replace(tekst1, Chr(7), "")
        klargørIndhold = tekst2
End Function

Det er måske ikke så sexet, men det gør jobbet. Det eneste jeg savner er at få rundet af til 1 decimal. Det ville også være fedt hvis der var en "trim" funktion. Det ser ud til at der bliver indsat en masse mellemrum, kan det passe?
Avatar billede hcthorsen Praktikant
07. februar 2016 - 14:00 #30
Der er også det problem, at der bliver indsat linieskift, der hvor der bliver indsat tal fra tabellen :-(
Avatar billede hcthorsen Praktikant
07. februar 2016 - 14:14 #31
Nu med afrunding. Men det der linieskift driller stadig.

Dim ræk As Integer, kol As Integer
Public Sub A_udfyld()
    udfyldBM 1
End Sub
Public Sub B_udfyld()
    udfyldBM 2
End Sub
Public Sub C_udfyld()
    udfyldBM 3
End Sub
Public Sub D_udfyld()
    udfyldBM 4
End Sub
Public Sub E_udfyld()
    udfyldBM 5
End Sub
Public Sub F_udfyld()
    udfyldBM 6
End Sub
Public Sub G_udfyld()
    udfyldBM 7
End Sub
Public Sub H_udfyld()
    udfyldBM 8
End Sub
Public Sub I_udfyld()
    udfyldBM 9
End Sub
Private Sub udfyldBM(Nr)
    Bookmarks("bm1").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm2").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm3").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3)
    Bookmarks("bm4").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 2) / 2 + 0.000001, 1)
    Bookmarks("bm5").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 3) / 2 + 0.000001, 1)
    Bookmarks("bm6").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 2) / 3 + 0.000001, 1)
    Bookmarks("bm7").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 3) / 3 + 0.000001, 1)
    Bookmarks("bm8").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 2) / 3 + 0.000001, 1)
    Bookmarks("bm9").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 3) / 3 + 0.000001, 1)
    Bookmarks("bm10").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 3)
    Bookmarks("bm11").Select
    Selection.TypeText Text:=Round(klargørIndhold(Nr + 1, 2) / 3 + 0.000001, 1)
    Bookmarks("bm12").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
    Bookmarks("bm13").Select
    Selection.TypeText Text:=klargørIndhold(Nr + 1, 2)
End Sub
Private Function klargørIndhold(ræk, kol)
Dim tekst1, tekst2
        tekst1 = Tables(1).Cell(ræk, kol)
        tekst2 = Replace(tekst1, Chr(7), "")
        klargørIndhold = tekst2
End Function
Avatar billede supertekst Ekspert
07. februar 2016 - 14:24 #32
Jeg prøver at se på din kode..
Avatar billede supertekst Ekspert
07. februar 2016 - 14:33 #33
Private Function klargørIndhold(ræk, kol)
Dim tekst1, tekst2
        tekst1 = Tables(1).Cell(ræk, kol)
        tekst2 = Left(tekst1, Len(tekst1) - 2)  '<<< justering
        klargørIndhold = tekst2
End Function
Avatar billede hcthorsen Praktikant
07. februar 2016 - 14:37 #34
Jamen for fanden da - det sparker røv! Du får julekort fremover!
Avatar billede supertekst Ekspert
07. februar 2016 - 14:57 #35
fint - der er lang tid til jul - så hvis du giver lidt point i mellemtiden, så.. :-)
Avatar billede hcthorsen Praktikant
07. februar 2016 - 15:00 #36
Birthe, håber det er OK at pointene går til supertekst.
Avatar billede hcthorsen Praktikant
07. februar 2016 - 15:30 #37
Kan man nå at snige en sidste detalje ind? Et af tallene i tabellen er fx. 2.9. Delt med 3 rundes rigtig nok af til 1, men det bør føres ind i dokumentet som 1.0. Det er 1 decimal i min optik. Hvorfor sker det ikke?
Avatar billede supertekst Ekspert
07. februar 2016 - 17:41 #38
Prøv med følgende de relevante steder:

Selection.TypeText Text:=Format(Round(klargørIndhold(Nr + 1, 2) / 3 + 0.000001, 1), "#0.0")  'klargørIndhold(Nr + 1, 2)
Avatar billede supertekst Ekspert
07. februar 2016 - 17:42 #39
PS: Sidste linje skal ikke med
Avatar billede hcthorsen Praktikant
07. februar 2016 - 18:16 #40
Jamen dog. Nu er det helt perfekt. Endnu engang tak:-)
Avatar billede supertekst Ekspert
07. februar 2016 - 22:53 #41
Selv tak
Avatar billede hcthorsen Praktikant
08. februar 2016 - 07:03 #42
Opretter lige lille bonusspg. i samme kategori.
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

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