Avatar billede denero Juniormester
05. september 2013 - 11:55 Der er 3 kommentarer og
1 løsning

Hente billede til word doc.

Word 2010

Bruger flg. kode til at indsætte et billede i brevhovedet på et word doc.Den er noget sammensat, men funker. Dog er jeg stødt ind i det problem, at hvis man trykker på annuller i billedmappen, har den jo åbnet brevhovedet i doc., men får det ikke lukket - tror jeg nok. Man skulle vel først have billedet ind i en "streng, før man begynder, at bearbejde doc.
Jamen, så er spørgsmålet altså - hvordan?


    Application.Run MacroName:="IkkeOpdateringAfSkærm"
   
        'Speciel første side
    With Selection.PageSetup
        .DifferentFirstPageHeaderFooter = True
    End With

    'Find første side
    Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="1"
   
    'Slet evt gl. forsidebillede
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
   
    'Sletter evt gl. forsidebillede
    If ActiveDocument.Bookmarks.Exists("Forsidebillede") Then
    ActiveDocument.Bookmarks("Forsidebillede").Select
    Selection.Delete
    End If
   
    'Sletter evt LogoRD
    If ActiveDocument.Bookmarks.Exists("LogoRD") Then
    ActiveDocument.Bookmarks("LogoRD").Select
    Selection.Delete
    End If
 
    'Sletter evt. LogoNederst
    If ActiveDocument.Bookmarks.Exists("LogoNederstRD") Then
    ActiveDocument.Bookmarks("LogoNederstRD").Select
    Selection.Delete
    End If
   
    'Sletter evt. teksboks
    If ActiveDocument.Bookmarks.Exists("Tekst") = True Then
   
    'Kopierer udgangspunkt(font)
    Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="1"
    Selection.TypeText Text:="1"
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Cut
   
    ActiveDocument.Bookmarks("Tekst").Select
    Selection.WholeStory
   
    'Indsætter udgangstekst
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
   
    'Sletter
    Selection.ShapeRange.Select
    Selection.Delete
    Else
    End If

    'Sætter billedarkiv
    Dim sPixFolder As String
    ''' store the default pictures location
    sPixFolder = Options.DefaultFilePath(wdPicturesPath)
    ''' change the default pictures location
    Options.DefaultFilePath(wdPicturesPath) = "C:\Users\pom\Pictures\"
    ''' open the dialog box
    Dialogs(wdDialogInsertPicture).Show
    ''' restore the default pictures location
    Options.DefaultFilePath(wdPicturesPath) = sPixFolder
   
    'Marker billede
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Select
   
    'Indsætte bogmærke
    With ActiveDocument.Bookmarks
        .Add Range:=Selection.Range, Name:="Forsidebillede"
        .DefaultSorting = wdSortByName
        .ShowHidden = False
    End With
   
    'Ombryde/størrelse billede
    Selection.ShapeRange.WrapFormat.Type = wdWrapNone
    Selection.ShapeRange(1).LockAspectRatio = msoFalse
    Selection.ShapeRange.Width = CentimetersToPoints(20.01)
    Selection.ShapeRange.Height = CentimetersToPoints(28.69)
   
    'Placering
    With Selection.ShapeRange
        .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
        .Left = 14
        .RelativeVerticalPosition = wdRelativeVerticalPositionPage
        .Top = 14
    End With
   
    'Lukker brevhoved
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
   
    Application.Run MacroName:="OpdaterSkærm"
Avatar billede Lene Fredborg Ekspert
05. september 2013 - 13:23 #1
Du kan evt. beholde størstedelen af din kode men lave følgende ændring, som vil afslutte makroen og gå tilbage til hovedindholdet, hvis der ikke vælges et billede:


UDSKIFT følgende linje:
Dialogs(wdDialogInsertPicture).show

MED FØLGENDE:

    With Dialogs(wdDialogInsertPicture)
        If .Show <> -1 Then
            'Intet billede valgt
            Application.Run MacroName:="OpdaterSkærm"
            'Gå til main story
            ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
           
            MsgBox "Intet billede valgt"
           
            'Afslut
            Exit Sub
        End If
    End With


Forklaring: resultatet af .Show = -1, hvis der er valgt et billede og klikket OK. Hvis resultatet er et andet (klik på Annuller eller krydset), så skal koden stoppe, flytte markering tilbage til hovedområdet og slå ScreenUpdating til igen.

Det ville dog være en langt bedre løsning at ændre hele makroen til at bruge RANGE i stedet for SELECTION - det er generelt meget bedre at undlade at ændre selection, og range give meget bedre styr på tingene. Jeg kan god hjælpe dig i den retning, hvis du er interesseret, men der går nogle timer, inden jeg kan finde tid til det.
Avatar billede denero Juniormester
05. september 2013 - 13:38 #2
Tusind tak det virker.
Det du skriver til sidst med "Range" er jeg ikke helt med på, men hvis du får tid, vil jeg selvfølgelig gerne høre om det.
Lægger du et svar?
Avatar billede Lene Fredborg Ekspert
05. september 2013 - 17:55 #3
Der er mange fordele ved at bruge Range i stedet for Selection. Eksempler: man kan altid styre fuldstændig præcis, hvad man "har fat i", man undgår at ændre på, hvad der er markeret i dokumentet (du har sikkert erfaret, at det kan give problemer) - og du kan også operere med ranges i flere forskellige dokumenter helt uden at aktivere dokumenterne, hvis du har brug for det. Det kræver en del øvelse at få rigtig fat i det med ranges, men det er umagen værd.

For grundlæggende info om Range, se f.eks.:
http://msdn.microsoft.com/en-us/library/office/aa223066(v=office.11).aspx
og følgende, hvor du finder eksempler:
http://msdn.microsoft.com/en-us/library/office/aa171380(v=office.11).aspx


Nedenfor har jeg omdannet noget af koden fra din makro og skrevet kommentarer:

    Dim oSec As Section
    Dim rngHeader As Range
    Dim rngFooter As Range
   
    'Hvis du, som i dit tilfælde, ønsker at tage fat i sektion 1 i dokumentet
    Set oSec = ActiveDocument.Sections(1)

    'Sådan kan du få fat i FirstPage header i sektionen oSec
    Set rngHeader = oSec.Headers(wdHeaderFooterFirstPage).Range
    'eller PrimaryHeader
    Set rngHeader = oSec.Headers(wdHeaderFooterPrimary).Range
    'eller f.eks. FirstPage sidefod
    Set rngFooter = oSec.Footers(wdHeaderFooterFirstPage).Range
   
    'Derefter kan du f.eks. gøre noget med indholdet i headeren - uden at have brugt selection
    With rngHeader
        'Sletter evt gl. forsidebillede
        If .Bookmarks.Exists("Forsidebillede") Then
            .Bookmarks("Forsidebillede").Range.Delete
        End If
   
        'Sletter evt LogoRD
        If .Bookmarks.Exists("LogoRD") Then
            .Bookmarks("LogoRD").Range.Delete
        End If
       
        'Indsæt f.eks. tekst
        .InsertBefore "Dette er tekst i sidehovedet"
        'nu er den indsatte tekst en del af rngHeaderSec1
       
        'Når du skal teste, kan du du godt have nytte af midlertidigt at indsætte kode, som markerer et range
        'f.eks.:
'slet igen efter test
.Select
   
        '...alskens andre ting kan du gøre helt uden at bruge selection
    End With
   

    'Ryd op til sidst, når du er færdig med at bruge dine objekter
    Set oSec = Nothing
    Set rngHeader = Nothing
Avatar billede denero Juniormester
06. september 2013 - 07:57 #4
Tak for fyldestgørende forklaring og forslag til ændring af kode. Der er lidt at arbejde med.

God weekend.
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