Makroer der ikke fungerer korrekt i Word 365

Anonym
2020-11-17T10:20:01+00:00

Jeg har en masse makroer som fungerer fint i Word 2016, men i Word 365 er der nogle af dem der ikke længere fungerer korrekt.

Her er et par eksempler:

Jeg har et dokument på to sider. I sidehovet indsættes en tekstboks med noget tekst via en userform. Placering af tekstboksen defineres via vba kode. Dokumentet indeholder ”speciel første side”, og placeringen af tekstboksen er korrekt. Samme kode bliver kørt for at placere tekstboksen på side 2, altså nøjagtig samme placering som på side 1, og alligevel placeres tekstboksen meget længere nede på siden. Det giver ingen mening!

Det, der næsten er endnu mere pudsigt er, at ikke nok med at placeringen er helt forkert, på trods af, at samme kode afvikles, men hvis man efterfølgende kigger på egenskaberne for de to tekstbokse (Dialog boksen Layout) så er det nøjagtig de samme mål der står angivet (Absolut placering: 3,21 til højre for venstre margen og 3 cm under side) på trods af at de to tekstbokse slet ikke er placeret ens.

Jeg har en anden makro som anvender noget tilsvarende kode, men denne gang er det logoer jeg indsætter i sidehovedet. Igen samme kode der afvikles for de forskellige sidehoveder og igen samme fejl. Denne gang er det bare logoet på side 1 som ikke placeres korrekt, og ikke nok med det, så virker det fint i en skabelon men ikke i en anden?!

Tredje og sidste eksempel. Jeg har en stump kode der går ind og fjerner en tekstboks fra sidefoden. Koden fungerer fint, hvis jeg vel og mærke kører den fra VBA editoren (både med F5 og F8). Den afvikles ikke hvis jeg kører den fra Word?!

Jeg oplever så mange mystiske ting der slet ikke giver nogen mening i 365. Det skal siges at ovennævnte eksempler fungerer upåklageligt i Word 2016! Jeg har søgt Nettet tyndt for hjælp men uden held. Jeg håber at der er nogen i dette forum som måske kan give mig et hint om hvad det er der sker i Word 365, eller hvor jeg kan finde noget hjælp. Jeg er dybt frustreret!

Microsoft 365 og Office | Word | Til hjemmet | Windows

Låst spørgsmål. Dette spørgsmål blev migreret fra Microsoft Support-community'et. Du kan stemme om, hvorvidt det er nyttigt, men du kan ikke tilføje kommentarer eller svar eller følge spørgsmålet.

0 kommentarer Ingen kommentarer

9 svar

Sortér efter: Ældste
  1. Anonym
    2020-11-17T16:53:57+00:00

    Det er ikke let at forholde sig til detaljerne uden at se din VBA-kode.

    Er dokumenterne, som du har brugt i Word 2016 og i Word 365 100 % identiske? (typografier, margener, afstand fra kanten for sidehoved/sidefod osv.)

    Hvor har du gemt din VBA-kode?

    Var dette svar nyttigt?

    0 kommentarer Ingen kommentarer
  2. Anonym
    2020-11-18T09:46:49+00:00

    Kære Lene,

    Tak fordi du svarer på dette indlæg.

    Jeg kan oplyse dig, at det er de samme skabeloner jeg anvender og koden ligger i de samme globale skabeloner. Den eneste forskel er, at det virker i Word 2016 (32 bit), men ikke i Word 365 (32 bit). De fleste funktioner virker i 365, på nær lige nogle stykker, men de funktioner som ikke længere virker korrekt har alle at gøre med sidehoved/fod.

    Jeg prøvede i går, at tage den kode der fjerner en tekstboks i sidefoden, og kopierede den over i en ny global skabelon som jeg oprettede i 365, med det resultat, at koden virker som den skal i den nye 365 skabelon. Fint! Tænkte jeg! Jeg gør da bare det samme med den kode som skal placere tekstbokse i mine sidehoveder, men, det virker stadig ikke!?! Jeg havde håbet, at jeg i 365 kunne oprette en ny global skabelon, overføre al koden, men det virker tilsyneladende heller ikke. Når jeg stepper koden igennem er der ingen fejl. Alle værdier er som de skal være så det giver bare ikke nogen mening! Der ligger rigtig meget kode bagved og det ville være umuligt at poste det alt sammen her, men her kan du se lidt af den.

    Sub SidehovedFirstPage(myDoc As Document, n As Integer, strTekst As String)

    Dim bolSpecielførste As Boolean

    Dim hd As HeaderFooter

    Dim shp As Shape

        frmSidehoved.OpdaterProgressBar 5

        'Læser om der er speciel første side

        bolSpecielførste = myDoc.Sections(n).PageSetup.DifferentFirstPageHeaderFooter

        If bolSpecielførste = False Then

            'Hvis ikke speciel første side er valgt, vælges dette midlertidigt

            myDoc.Sections(n).PageSetup.DifferentFirstPageHeaderFooter = True

        End If

        Set hd = myDoc.Sections(n).Headers(wdHeaderFooterFirstPage)

        SelekterSidehoved hd

        Set shp = hd.Shapes.AddTextbox(msoTextOrientationHorizontal, CentimetersToPoints(2), CentimetersToPoints(2), CentimetersToPoints(2), CentimetersToPoints(2))

        frmSidehoved.OpdaterProgressBar 5

        'Tilpasser Tekstboksen

        TilpasTekstISidehovedOpret shp, "F", n, strTekst

        'Indstiller speciel første side til udgangspunkt

        myDoc.Sections(n).PageSetup.DifferentFirstPageHeaderFooter = bolSpecielførste

    End Sub

    Sub SidehovedPrimary(myDoc As Document, n As Integer, strTekst As String)

    Dim hd As HeaderFooter

    Dim shp As Shape

        frmSidehoved.OpdaterProgressBar 5

        Set hd = myDoc.Sections(n).Headers(wdHeaderFooterPrimary)

        SelekterSidehoved hd

        Set shp = hd.Shapes.AddTextbox(msoTextOrientationHorizontal, CentimetersToPoints(2), CentimetersToPoints(2), CentimetersToPoints(2), CentimetersToPoints(2))

        frmSidehoved.OpdaterProgressBar 5

        'Tilpasser tekstboksen

        TilpasTekstISidehovedOpret shp, "P", n, strTekst

    End Sub

    Sub TilpasTekstISidehovedOpret(shp As Shape, strName As String, n As Integer, strTekst As String)

    '    PlaceringAfTekstISidehoved shp

        With shp

            .RelativeHorizontalPosition = wdRelativeHorizontalPositionLeftMarginArea

            .Left = CentimetersToPoints(3.21)

            .RelativeVerticalPosition = wdRelativeVerticalPositionPage

            .Top = CentimetersToPoints(3) ' Anden gang denne kode bliver kørt (fra SidehovedPrimary) er det, at det går galt i netop denne linje. At remme den ud løser ikke problemet. Jeg har prøvet men det resultat at placeringen fortsat er forkert.        .Width = CentimetersToPoints(10)

            .Height = CentimetersToPoints(1)

            .Name = "bmkshtekst" & "_" & n & "_" & strName 'teksboksen navngives"

            .Line.Transparency = 1  'Rammen om boksen er ikke synlig

            With .TextFrame.TextRange

                .Style = "ForsideOverSkriftGrå"

                .ParagraphFormat.leftIndent = 0

                .Text = strTekst

            End With

        End With

    End Sub

    En anden pudsig ting jeg også oplevede i 365 var, at jeg i starten ikke kunne få de makroer som kalder userforms til at virke, med mindre jeg fjernede kode som omhandler positioneringen af userformen (Se nedenfor). Og så pludselig, fra den ene dag til den anden, så virkede det alligevel. Det er bare så mystisk og ikke mindst ved at drive mig til vandvid!

    Private Sub UserForm_Initialize()

    ' Ved load af userform vælges første fane

        Me.StartUpPosition = 0

        Me.Left = Application.Left + (0.5 * Application.Width) - (0.5 * Me.Width)

        Me.Top = Application.Top + (0.5 * Application.Height) - (0.5 * Me.Height)

        Me.MultiPage1.Value = 0

        Call SaetPlacering

    End Sub

    Alle forslag til hvad jeg kan prøve hilser jeg velkommen. PFT.

    Var dette svar nyttigt?

    0 kommentarer Ingen kommentarer
  3. Anonym
    2020-11-18T11:40:51+00:00

    Jeg har set på den VBA-kode, du har postet. Jeg kan ikke teste koden i sin helhed her, da det ville kræve, at jeg havde al koden.

    Jeg prøvede at indsætte tekstboks i både Word 2016 og 365 ved brug af en enkelt (tilpasset) kodelinje fra din kode – og tekstbokse her bliver indsat med samme placering. Men jeg kan jo ikke se, hvad din makro ”SelekterSidehoved”, som du kalder undervejs, laver.

    Jeg har selv udviklet meget omfattende mængder VBA-kode, som anvendes både i Word 2016 og 365 (og i flere andre versioner af Word). Jeg har ikke selv oplevet de problemer, du beskriver. Det er i både Word 2016 og 365 samme hovedversion af Visual Basic for Applications, der er i brug. Der kan være forskelle i de præcise versioner. Hvis du tjekker Word 2016 og 365 via VBE > Help > About Visual Basic for Applications, finder du så forskellige versionsnumre?

    Har du tjekket, om VBE > Tools > References har de samme referencer slået til i dokumenterne i Word 2016 og 365?

    Har du tjekket, om dine indstillinger for sikkerhed i relation til makroer er de samme i Word 2016 og 365 (Filer > Indstillinger > Center for sikkerhed og rettighedsadministration > Indstillinger for Center for sikkerhed og rettighedsadministration > Indstillinger for makro)?

    Hvis du vil dele et af dine dokumenter, inkl. al din kode med mig, vil jeg tilbyde at teste her i både Word 2016 og 365. Jeg vil i givet fald også gerne have to versioner af samme dokument, hvori du har kørt koden i hhv. Word 2016 og 365, så jeg kan undersøge den præcise forskydning, du ser. Jeg kan kontaktes via e-mail fra https://www.thedoctools.com/home/da/kontakt/.

    En bemærkning:

    Navnet på markoen ”SelekterSidehoved”, som du kalder undervejs, tyder på, at du bruger Selection og ikke Range. Det i sig selv kan nok ikke være årsagen til problemerne, men det er generelt langt mere sikkert (og tit markant hurtigere mht. til afvikling af kode) at bruge Range.

    Var dette svar nyttigt?

    0 kommentarer Ingen kommentarer
  4. Anonym
    2020-11-19T15:39:33+00:00

    Kære Lene,

    Endnu en gang, mange tak for dit svar.  Dit svar fik mig til at teste flere af funktionerne på en anden maskine med 365 og her virkede de fleste funktioner. Jeg tror, at det er noget på min maskine der ikke fungerer som det skal, men umiddelbart er det ikke indstillingerne eller versionen den er galt med, for de stemmer overens med andre maskiner (både med 2016 og 365).

    I går tilføjede jeg "UseHyperlinks:=True" til nedenstående procedure. Ikke andet. Det slår fint igennem i 2016 og ligeledes på en anden maskine med 365, men hos mig slår hyperlinkdelen ikke igennem, med mindre jeg kører koden fra VBE via F5 (uden breaks).

    Sub IndsætIndholdProces()

    Dim n As Integer

        'Tilpasser typografien for "indholdsfortegnelse" for de 6 første niveauer

        For n = 1 To 6

            With ActiveDocument.Styles("Indholdsfortegnelse " & n)

                With .ParagraphFormat

                    .leftIndent = CentimetersToPoints(1.6)

                    .FirstLineIndent = CentimetersToPoints(-1.6)

                End With

                .NoSpaceBetweenParagraphsOfSameStyle = False

                With .ParagraphFormat.TabStops

                    .ClearAll

                    .Add Position:=CentimetersToPoints(1.6), Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderSpaces

                    .Add Position:=CentimetersToPoints(15.5), Alignment:=wdAlignTabRight, Leader:=wdTabLeaderDots

                End With

            End With

        Next

        'Indsætter teksten over indholdsfortegnelsen

        With Selection

            .Style = ("Indholdsfortegnelse")

            .TypeText Text:="Indholdsfortegnelse" & Chr(13)

        End With

        'Indsætter indholdsfortegnelse for de første 5 niveauer

        With ActiveDocument

            .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _

                True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _

                LowerHeadingLevel:=1, IncludePageNumbers:=True, AddedStyles:="Overskrift 2;2;Overskrift 3;3;Overskrift 4;4;Overskrift 5;5", UseHyperlinks:=True

            .TablesOfContents(1).TabLeader = wdTabLeaderDots

            .TablesOfContents.Format = wdIndexIndent

        End With

    End Sub

    Den tidligere omtalte funktion hvor jeg skal fjerne en tekstboks i sidefoden, har jeg samme problem med. Den fungerer ikke korrekt hvis jeg kalder funktionen via en knap på ribbon, men den kører fint hvis jeg kører den via VBE (F5 - uden breaks). Mystisk!?

    Den funktion som jeg allerede har sendt dig koden på fungerer fortsat ikke i 365. Hverken på egen eller anden maskine med 365. Det fungerer dog i 2016. Koden SelekterSidehoved kan du se her. I første omgang vil jeg se hvor mange af problemerne skyldes min maskine, og kan jeg slet ikke få det til at virke på 365 overvejer jeg at omskrive hele koden. Det er dog bare pudsigt at det virer i 2016. Såfremt jeg igen støder panden mod muren vil jeg tillade mig at kontakte dig igen. Er det okay? Indtil videre har du givet mig noget at kigge efter og det vil jeg fortsat gøre. 1000 tak for hjælpen. :-)

    Sub SelekterSidehoved(hd As HeaderFooter)

     On Error Resume Next

        hd.Range.Select

        If Err.Number <> 0 Then

            Err.Clear

        End If

        On Error GoTo 0

    End Sub

    Var dette svar nyttigt?

    0 kommentarer Ingen kommentarer
  5. Anonym
    2020-11-20T01:30:12+00:00

    Jeg har nu testet hele din kode til indsættelse af tekstbokse i sidehoveder (udkommentering af progressbar m.m.). Jeg får samme placering af tekstbokse i FirstPage og Primary header både i Word 2016 og 365.

    Mht. indholdsfortegnelsen:

    Din VBA-kode indsætter et TOC-felt med følgende kode:

    { TOC \o "1-1" \h \t "Overskrift 2;2;Overskrift 3;3;Overskrift 4;4;Overskrift 5;5" }

    Med ”men hos mig slår hyperlinkdelen ikke igennem” mener du da, at \h ikke kommer med i dit TOC-felt, medmindre du kører koden med F5?

    Du skriver, at koden ligger i globale skabeloner. Jeg går ud fra, at disse er installeret som add-ins, dvs. placeret i Words Start-mappe. Er det korrekt?

    Er dokumenterne, hvori koden bruges, tomme?

    Er der kompatibilitetsindstillinger slået til under Filer > Indstillinger > Avanceret i dokumenterne?

    Indgår der Event-kode i ThisDocument el.lign.?

    Er generelle Word-indstillinger under Filer > Indstillinger sat i Word 365 som i Word 2016?

    Har du andre add-ins installeret? Hvis det er tilfældet, har du så prøvet at deaktivere disse?

    Din kode til indsættelse af tekstbokse og Selection

    Da du i linjerne:

        Set hd = …

    allerede har defineret et Range, har du slet ikke brug for at bruge selection. Du kan helt undvære (slette) linjerne, hvor du går til sidehovedet:

        SelekterSidehoved hd

    hvilket er langt at foretrække.

    En bemærkning om opbygningen af TOC-feltet:

    Det felt, din VBA-kode danner, vil fejle på computere, som ikke har dansk brugergrænseflade i Office (fordi typografinavne er sprogafhængige), og den vil også fejle, hvis regionale indstillinger har f.eks. komma som listeseparator i stedet for semikolon. Det er måske ikke aktuelt for dine brugere, men jeg vil altid anbefale at lave sproguafhængige løsninger, så vidt det er muligt.

    Du kan f.eks. danne TOC-feltet sådan (forudsætter her, at Selection, som i din kode, er stedet, hvor feltet skal indsættes – kunne med fordel ændres til Range):

        Set oField = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty)

        With oField

            .Code.Text = " TOC \o ""1-5"" \h \t "

            .Update

        End With

        Set oField = Nothing

    Resultatet vil være en noget enklere feltkode, som er uafhængig af sprog og regionale indstillinger:

    { TOC \o "1-5" \h \t }

    Var dette svar nyttigt?

    0 kommentarer Ingen kommentarer