PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBAAnvända text i word som filnamnAnvända text i word som filnamn
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2021-06-02 07:59
 

 Hej,

Jag jobbar på ett makro där målet är att det för varje sida i ett långt dokument ska hämta ett namn från ett adressfält, och sedan spara ner varje enskild sida som PDF med det namnet som filnamn. Jag har kommit en bit på väg med hjälp av googlingar och test, men inte fått det att fungera helt. Det verkar som att varje gång loopen som skapar pdf:erna går så hämtar den namnet i den första sidan i dokumentet och byter alltså inte till namnet i sida 2 osv. Är det någon som kan peka mig åt rätt håll så är jag otroligt tacksam! Så här ser koden ut just nu:

 

Sub SaveAsSeparatePDFs()

'Updated by Extendoffice 20180906

    Dim I As Long

    Dim xStr As String

    Dim xPathStr As Variant

    Dim xDictoryStr As String

    Dim xFileDlg As FileDialog

    Dim xStartPage, xEndPage As Long

    Dim xStartPageStr, xEndPageStr As String

    Dim namn As Range

    Dim namntext As String

    

    

    Set xFileDlg = Application.FileDialog(msoFileDialogFolderPicker)

    If xFileDlg.Show <> -1 Then

        MsgBox "Please chose a valid directory", vbInformation, "nman"

        Exit Sub

    End If

    xPathStr = xFileDlg.SelectedItems(1)

    xStartPageStr = InputBox("Begin saving PDFs starting with page __? " & vbNewLine & "(ex: 1)", "Kutools for Word")

    xEndPageStr = InputBox("Save PDFs until page __?" & vbNewLine & "(ex: 7)", "Kutools for Word")

    If Not (IsNumeric(xStartPageStr) And IsNumeric(xEndPageStr)) Then

        MsgBox "The enterng start page and end page should be number format", vbInformation, "Kutools for Word"

        Exit Sub

    End If

    xStartPage = CInt(xStartPageStr)

    xEndPage = CInt(xEndPageStr)

    If xStartPage > xEndPage Then

        MsgBox "The start page number can't be larger than end page", vbInformation, "Kutools for Word"

        Exit Sub

    End If

    If xEndPage > ActiveDocument.BuiltInDocumentProperties(wdPropertyPages) Then

        xEndPage = ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)

    End If

    

    

    ' detta är loopen som sparar varje sida som pdf

    

    For I = xStartPage To xEndPage

    

    Set namn = ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, I)   ' denna ska ta fram en ny sida varje gång loopen körs

    Set namn = ActiveDocuments.Paragraphs(8).Range                  ' detta är fältet där namnet jag vill använda finns 

    

    namntext = Replace(namn.Text, vbCr, vbNullString)               ' denna tar bort paragraftecknet från filnamnet

    

        ActiveDocument.ExportAsFixedFormat xPathStr & "\Page_" & namntext & I & ".pdf", _

        wdExportFormatPDF, False, wdExportOptimizeForPrint, wdExportFromTo, I, I, wdExportDocumentWithMarkup, _

        False, False, wdExportCreateHeadingBookmarks, True, False, False

        

    Next

    

End Sub

 

Jag antar att det är något som är fel uttryckt i delen där jag försöker ange variabeln "namn" men jag kan inte hitta felet.. Som sagt otroligt uppskattat om någon har möjlighet att peka ut felet åt mig :)

 

Nytt inlägg
 2021-06-03 21:03
 
 Ändrad av Christian  på 2021-06-03 20:06:14

 Hej Linus

Activedocument.paragraph(8) motsvarar din åttonde paragraf i ditt dokument. Den kommer alltså alltid vara samma pragraf, oberoende av vilken sida du är på. Har du samma antal paragrafer på varje sida? i så fall så kan du hitta nästa förekomst med logisk talföljd. Är det den sista paragrafen på sida 1 så blir nästa paragraf 16, därefter 24 osv.

Har du kanske gemensamt ord i paragraferna som innehåller filnamnen? Då kan du iterera dina paragrafer och leta efter ord i texten. Debug.print behöver att du har direktfönstret uppe för att synas. Ligger under fliken visa -> direktfönster.

Hoppas detta hjälper dig på vägen. 

Sub iterateparas()

   Dim para As Paragraph

   Dim xInt as integer 'Xint sätts till paragrafnummer

   Dim str as string: str = "Något gemensamt ord eller mening"

   For Each para In ActiveDocument.Paragraphs         

         Xint = ActiveDocument.Range(0, para.Range.End).Paragraphs.Count

          If instr(para.text, str) >0 then  ' Detta undersöker om str finns i paragraftexten.

                  debug.print "hittat del av filnamn i paragraf " & xint

                  'debug.print para.range.text    denna rad skriver ut hittad paragraftext om du behöver den

          End if         

    Next para

End Sub

 

Nytt inlägg
 2021-06-07 11:55
 

 Hej Christian - tack!

Alltså, namnen i adressfältet är alltid olika så jag kan inte söka på något särskilt ord där, och dokumentet i sig är fullt med annan info så jag vet inte om man kan lita på att paragraf nr 8 alltid har lika många paragrafer under sig? Jag vet inte om jag uttrycker mig så värst tydligt här :)

Det finns inget sätt att påbörja paragraf-sökningen på varje enskild sida, man kan inte koppla in sidnumret i Activedocument.paragraph(8) på något sätt? Eller finns det något substitut till just Paragraph som är enklare att använda på varje enskild sida?

Supertack för hjälp i alla fall och för att du tog dig tid att skriv ihop en exempelkod, jag ska se om jag kan använda den för att hitta min knepiga paragraf :)

 

Nytt inlägg
 2021-06-07 14:25
 

Hej linus

Nja, paragraph(8) kan man nog hitta sidnumret till bakvägen via dess range, och titta på början eller slutet på denna. Men hur vet man om paragrafen är rätt stycke om vi inte kan söka efter något i texten?. Det finns dock en lösning som kanske skulle kunna fungera för dig, men det blir ganska mycket manuellt. Man kan lägga in bookmarks i worddokumentet, dessa blir sedan hyfsat lätta att identifiera med kod efterssom man kan loopa igenom samlingen med alla bookmarks, ta deras texter och slänga in dem som filnamn. På fliken infoga hittar du infoga bokmärke, tänk på att döpa dem så att du kan plocka ut informationen från dess bokmärkesnamn. Exempelvis, bFilnamn1, skulle motsvara filnamnet på sida 1, osv osv. 

Skriver ingen kod till dig denna vända då jag är osäker på om denna ganska jobbiga manuella metod kan vara något för dig.

Mvh

Christian

Nytt inlägg
 2021-06-09 15:53
 

 Hej Christian,

Jag tror att jag har rört till det lite med problembeskrivningen :) Såhär: varje sida i dokumentet startar med ett adressfält och från det fältet vill jag hämta namnet. Genom att prova mig fram har jag hittat att raden namnet står på är paragraph(8). Så jag vill hitta namnet på sida1, sen börja om och hitta namnet på sida 2, dvs nollställa paragraph-räkningen så att jag kan hitta raden där namnet står. Jag ska se om bokmärkeslösningen kan vara något.

Igen - tack för att du tog dig tida att svara :)

Linus

Nytt inlägg
 2021-06-11 19:30
 

 Hej hej

Då får du skapa ett nytt objekt som nollas vid varje ny sida. Du kommer inte kunna resetta indexerongen på de riktiga paragraferna. Sedan är det ganska ofta så att sista paragrafen på varje sida ofta även påbörjar nästa sida. Så inte helt säkert att para8 kommer fungera ändå Efterssom det i så fall blir blir en förskjutning. Kanske är det inte så i ditt fall. Det ska finnas möjlighet att hitta sidnummer för paragrafen via dess range. Så du kan pröva o loopa alla paragrafer och leta efter när sidbrytning sker, därefter resetta en räknare tills den kommer till 8.

Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBAAnvända text i word som filnamnAnvända text i word som filnamn

PNG32 PNG32
Excelforum drivs av Excelspecialisten som bedriver utbildning i Excel och VBA, tillhandahåller support och hjälp med Excel, utvecklar program i Excel. Är ni i behov av en konsult inom Excel, VBA eller VSTO, eller söker en excelkurs, kontakta oss.
Copyright 2013 ExcelSpecialisten XLS AB   Användarvillkor  Personliga uppgifter