04. februar 2016 - 14:02Der 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å.
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
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.
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.
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.
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
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?
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.
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.
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:
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?
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
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?
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.