27. september 2007 - 10:49Der er
26 kommentarer og 1 løsning
Begrænsninger i side opsætning?
Jeg sider med et word dokument som er genereret via brevflet, filen består af 108 flettede poster, som giver et dokument med 108 sektions skift, hver sektion har i side opsætning / kassette valg første side kassette1 resten kassette2, dette vil jeg gerne ændre, så hver sektion bliver første side kassette2 resten kassette4, men det ser ud til der er en begrænsning på 101 side. Hvis jeg vil ændre With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke3 End With står .FirstPageTray og .OtherPagesTray allerede til 9999999, så makroen går sirekte i fejl. Sletter jeg sektioner så der kun er 99 tilbage virker det fint, så er der nogen der kender til denne begrænsning, eller har en ide til hvordan man kan omgå dette problem?
Vi er helt enig, men nu har vi en masse allerede flettede dokumenter, som skal ændres. Kender du noget til denne begrænsning eller en måde at omgå det på.
Nej, jeg kender ikke til begrænsningen (har nu heller aldrig prøvet at teste det).
Du løber alle sektionerne igennem hver for sig og ændrer setup'et, ikk'? Og du har en printer med bakkerne som den aktive printer, når du løber dokumentet igennem? Hvilken Office-version kører du med?
For Each objSection In ActiveDocument.Sections objSection.PageSetup.FirstPageTray = Bakkevalg1 objSection.PageSetup.OtherPagesTray = bakkevalg2 Next objSection
Husk at ændre bakkevalgene til det korrekte i forhold til din printer.
Det er ikke nødvendigt at løbe alle sektionerne igennem, hvis sidehovedet i efterfølgende sektioner er linket til den foregående. Så kan du nøjes med den første sektion.
Ved at collapse ranget bliver evt. eksisterende tekst el. lignende ikke slettet fra sidehovedet. Hvis evt. tekst skal fjernes i samme moment, skal du blot fjerne linjerne med collapse.
***** Dim objSection As Section Dim objHeaderFirst As Range Dim objHeaderPrimary As Range
For Each objSection In ActiveDocument.Sections Set objHeaderFirst = objSection.Headers(wdHeaderFooterFirstPage).Range Set objHeaderPrimary = objSection.Headers(wdHeaderFooterPrimary).Range objHeaderFirst.Collapse wdCollapseStart objHeaderPrimary.Collapse wdCollapseStart
Når du nu så pænt siger jeg gerne må forstyrer, Hvad siger du så til samme senario som print feltet, men istedet for at indsætte feltet i headeren, skal den indsættes i toppen af siderne, men sådan at første side har et print felt med et indhold og resten af siderne et print felt med et andet indhold. Da det er et nyt spørgsmål er jeg selvfølgelig villig til at lave et emne.
For mig er toppen af siderne headeren; hvis det ikke skal være i headeren, må du overtale mig til andet ;-) God forklaring eller argument - om ikke andet så for at give det rigtige hint eller "nåwet" til en løsning.
Ok prøver, Jeg skal lave en makro genvejs tast der når den er kørt, har indsat disse print koder, indholdet af disse koder skulle så gerne gøre at når dokumentet bliver udskrevet, vil der på første side være et logo overlay, og på resten af siderne et andet. Jeg er ikke så meget for at bruge header, da det er forskellige typer af dokumenter, og nogle af disse har allerede en del opsætning i headeren.
Det kunne måske løses, ved først at udskrive side 1 og der efter resten, med indsat print felt.
Jeg har allerede lavet noget kode der virker, men det er 10 kilometer langt, da det er lavet med makro optageren, skal jeg indsætte det så du kan se hvad det gør?
Ahaa... så vi taler om logo. Skal logoet ikke være placeret samme sted uanset dokumenttype?
Umiddelbart ville jeg oprette et flydende objekt med logoet, sørge for, at det har den rigtige placering, gemme det som en autotekst og så - via kode - smide det ind i dokumentet; formentlig stadig i headeren, da jeg synes, at det er noget "snask" at skulle sætte det samme ind (fra side 2 og frem) flere gange. Og da du jo har lært *s* at collapse sidehovedet, er det ikke noget problem, at der står noget andet i forvejen.
"Logoet" kan være et giro overlay, en betalings bagside, rigtigt logo ovs. så de er forskellige og ikke placeret ens. De ligger som et pcl overlay på printeren, derfor print feltet. Kan man med den makro du lavede, indsætte et print felt på første side og et andet på resten?
Ja, så er den eneste måde nok at indsætte print feltet på hver side, jeg har prøbet at løse det på nedenstående måde, tror du den kan forkortes.
Public pr As String Public FjernPrinter As String Public Bakke1 As Long Public Bakke2 As Long Public Bakke3 As Long Public Bakke4 As Long Public Bakke5 As Long Public Bakke6 As Long Public Deck As Long
Public Const pr1 = "standard" Public Const pr2 = "ikke_brugt1" Public Const pr3 = "ikke_brug2" Public Const pr4 = "\\ks-dc2\nrp5-073-cir2" Public Const pr5 = "\\ks-dc2\nrp6-034-cir1" Public Const pr6 = "ikke_brugt3" Public Const pr7 = "\\ks-dc2\nrp6-091-cir1" Public Const pr8 = "\\ks-dc2\nrp6-091-cir2" Public Const pr9 = "\\ks-dc2\biblio" Public Const pr10 = "\\ks-dc2\dirsek1" Public Const pr11 = "\\ks-dc2\dirsek2" Public Const pr12 = "\\ks-dc2\biblio2"
Public Const Originalt_brev = 0 'Udskriver side 1 fra bakke 2 og resten af siderne fra bakke 3. Genvej Alt + A.
Public Const Originalt_brev_og_kopi = 1 'Udskriver side 1 fra bakke 2 og resten af siderne fra bakke 3 + udskriv side 1 med overlay fra stort magasin og resten af siderne med side 2 overlay fra stort magasin. Genvej Alt + S.
Public Const Kopi_af_brev = 2 'Udskriv side 1 med overlay fra stort magasin og resten af siderne med side 2 overlay fra stort magasin. Genvej Alt + D.
Public Const Originalt_dokument = 3 'Udskriver alle sider fra bakke 3. Genvej Alt + Q.
Public Const Originalt_dokument_og_kopi = 4 'Udskriver alle sider fra bakke 3 + udskriv alle sider med side 2 overlay fra stort magasin. Genvej Alt + W.
Public Const Kopi_af_dokument = 5 'Udskriv alle sider med side 2 overlay fra stort magasin. Genvej Alt + E.
Public Const Alle_sider_på_side_1 = 6 'Udskriv alle sider fra bakke 2. Genvej Alt + L.
Public Const Alle_sider_på_side_1_og_kopi = 7 'Udskriv alle sider fra bakke 2 + udskriv med side 1 overlay fra stort magasin. Genvej Alt + K
Public Const Aktuel_side1 = 8 'Udskriver aktuel side fra bakke 2. Genvej Alt + G.
Public Const Aktuel_side2 = 9 'Udskriver aktuel side fra bakke 3. Genvej Alt + R.
Public Const Dokument_med_3_kopier = 10 'Udskriver hele dokumentet fra bakke 3 + udskriver 3 eksemplarer af hele dokumentet med side 2 overlay fra stort magasin. Genvej Alt + Æ.
Public Sub OriginaltBrev() VaelgBakke (Originalt_brev) End Sub
Public Sub OriginaltBrevOgKopi() VaelgBakke (Originalt_brev_og_kopi) End Sub
Public Sub KopiAfBrev() VaelgBakke (Kopi_af_brev) End Sub
Public Sub OriginaltDokument() VaelgBakke (Originalt_dokument) End Sub
Public Sub OriginaltDokumentOgKopi() VaelgBakke (Originalt_dokument_og_kopi) End Sub
Public Sub KopiAfDokument() VaelgBakke (Kopi_af_dokument) End Sub
Public Sub AlleSiderPåSide1() VaelgBakke (Alle_sider_på_side_1) End Sub
Public Sub AlleSiderPåSide1OgKopi() VaelgBakke (Alle_sider_på_side_1_og_kopi) End Sub
Public Sub AktuelSide1() VaelgBakke (Aktuel_side1) End Sub
Public Sub AktuelSide2() VaelgBakke (Aktuel_side2) End Sub
Public Sub DokumentMed3Kopier() VaelgBakke (Dokument_med_3_kopier) End Sub
Function CP(pr1, pr2 As String) As Boolean CP = False If InStr(UCase(pr1), UCase(pr2)) > 0 Then CP = True End If End Function
Sub VaelgBakke(Valg As Integer)
Dim ActivPage, varNumberPages As Variant Dim StandardPrinter Dim sprinter As String Dim stprinter As String Dim intEnd As Integer
'Slå udskriv i baggrunden fra Options.PrintBackground = True 'False
'valg af printer sprinter = Application.ActivePrinter
Application.ScreenUpdating = False On Error GoTo Err_VaelgBakke
'Undersøger om der findes mellemrum i UBC streng 'hvis der gør konkatineres strPrinter ved mellemrummet intEnd = InStr(1, sprinter, " ") If intEnd > 1 Then sprinter = Left(sprinter, intEnd - 1) End If
pr = sprinter pr = LCase(pr)
'Kassette koder for valgte printer indlæses Select Case True Case CP(pr, pr1), CP(pr, pr2), CP(pr, pr3), CP(pr, pr4), CP(pr, pr5) Bakke1 = 1 Bakke2 = 3 Bakke3 = 2 Bakke4 = 264 Deck = 265
Case CP(pr, pr6), CP(pr, pr7), CP(pr, pr8), CP(pr, pr9), CP(pr, pr10), CP(pr, pr11), CP(pr, pr12) Bakke1 = 1 Bakke2 = 2 Bakke3 = 2 Bakke4 = 264 Deck = 265 Case Else MsgBox "Printer '" & pr & "' er ikke genkendt af programmet." & vbCrLf & _ "Standard skuffevalg vil blive benyttet ('Tray2/Tray3')" & vbCrLf & vbCrLf & _ "Kontakt IT-afdelingen", vbInformation, "Valg af papirskuffer" Bakke1 = wdPrinterDefaultBin Bakke2 = wdPrinterDefaultBin Bakke3 = wdPrinterDefaultBin Exit Sub End Select
'Tæl antal sider varNumberPages = ActiveDocument.Content.Information(wdActiveEndAdjustedPageNumber)
Select Case Valg Case Originalt_brev: 'Sæt kassette valg til side 1 fra kassette 2 og øvrige fra kassette 3 With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False Case Originalt_brev_og_kopi: 'Sæt kassette valg til side 1 fra kassette 2 og øvrige fra kassette 3 With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 1 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side1Logo Else: Side1Logo Side2LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Fjern logoer RydLogo
Case Kopi_af_brev: 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 1 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side1Logo Else: Side1Logo Side2LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Fjern logoer RydLogo
Case Originalt_dokument: With ActiveDocument.PageSetup .FirstPageTray = Bakke3 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False
Case Originalt_dokument_og_kopi: With ActiveDocument.PageSetup .FirstPageTray = Bakke3 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 2 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side2Logo Else: Side2Logo Side2LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Fjern logoer RydLogo
Case Kopi_af_dokument: 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 2 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side2Logo Else: Side2Logo Side2LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Fjern logoer RydLogo
Case Alle_sider_på_side_1: With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke2 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False
Case Alle_sider_på_side_1_og_kopi: With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke2 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 2 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side1Logo Else: Side1Logo Side1LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Fjern logoer RydLogo
Case Aktuel_side1: With ActiveDocument.PageSetup .FirstPageTray = Bakke2 .OtherPagesTray = Bakke2 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Range:=wdPrintCurrentPage Application.ScreenUpdating = False
Case Aktuel_side2: With ActiveDocument.PageSetup .FirstPageTray = Bakke3 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Range:=wdPrintCurrentPage Application.ScreenUpdating = False
Case Dokument_med_3_kopier: With ActiveDocument.PageSetup .FirstPageTray = Bakke3 .OtherPagesTray = Bakke3 End With Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Application.ScreenUpdating = False 'Sæt kassette valg til paperdeck With ActiveDocument.PageSetup .FirstPageTray = Deck .OtherPagesTray = Deck End With 'Indsæt Logo 2 på første side og logo 2 på øvrige If varNumberPages = 1 Then Side2Logo Else: Side2Logo Side2LogoResten End If Application.ScreenUpdating = True 'Udskriv alle sider ActiveDocument.PrintOut Copies:=3 Application.ScreenUpdating = False 'Fjern logoer RydLogo
End Select
'Sæt sideopsætning tilbage til auto With ActiveDocument.PageSetup .FirstPageTray = wdPrinterDefaultBin .OtherPagesTray = wdPrinterDefaultBin End With
'Cursor bliver kørt til top af dokument ' Selection.HomeKey Unit:=wdStory ' Application.ScreenUpdating = True
Exit_VaelgBakke: Exit Sub
Err_VaelgBakke: MsgBox Prompt:="Kunne ikke finde printer." & Chr$(13) & Err.Description, Title:="Printer fejl" Resume Exit_VaelgBakke
End Sub
Sub Side1Logo()
'Gå til top af dokument Selection.HomeKey Unit:=wdStory If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f0Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f3Y&f2X", PreserveFormatting:=True End If End Sub
Sub Side1LogoResten() Dim ActivPage, varNumberPages As Variant
'Tæl antal sider varNumberPages = ActiveDocument.Content.Information(wdActiveEndAdjustedPageNumber)
'Find aktive side nr ActivPage = Selection.Information(wdActiveEndPageNumber)
'Gå til aktiv side plus 1 Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="(ActivPage + 1)"
'Find aktive side nr ActivPage = Selection.Information(wdActiveEndPageNumber)
'Hvis aktiv side nr er midre end antal sider indsættes logo 1 på resten af siderne If ActivPage < varNumberPages Then Side1LogoResten1 Else: 'Hvis aktiv side nr er lig med antal sider indsættes logo 1 If ActivPage = varNumberPages Then If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f0Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f3Y&f2X", PreserveFormatting:=True End If End If End If End Sub
Sub Side1LogoResten1()
If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f0Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f3Y&f2X", PreserveFormatting:=True End If Side1LogoResten End Sub
Sub Side2Logo()
'Gå til top af dokument Selection.HomeKey Unit:=wdStory
If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f1Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f4Y&f2X", PreserveFormatting:=True End If End Sub
Sub Side2LogoResten() Dim ActivPage, varNumberPages As Variant 'Tæl antal sider varNumberPages = ActiveDocument.Content.Information(wdActiveEndAdjustedPageNumber) 'Find aktive side nr ActivPage = Selection.Information(wdActiveEndPageNumber) 'Gå til aktiv side plus 1 Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="(ActivPage + 1)" 'Find aktive side nr ActivPage = Selection.Information(wdActiveEndPageNumber) 'Hvis aktiv side nr er midre end antal sider indsættes logo 2 på resten af siderne If ActivPage < varNumberPages Then Side2LogoResten1 Else: 'Hvis aktiv side nr er lig med antal sider indsættes logo 2 If ActivPage = varNumberPages Then If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f1Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f4Y&f2X", PreserveFormatting:=True End If End If End If End Sub
Sub Side2LogoResten1()
If ActiveDocument.PageSetup.Orientation = wdOrientPortrait Then 'Indsæt print felt med pcl kode Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f1Y&f2X", PreserveFormatting:=True Else Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PRINT &u600D&l0O&f4Y&f2X", PreserveFormatting:=True End If Side2LogoResten End Sub
Sub RydLogo() 'Slå vis koder til ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "^d PRINT" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll 'Slå vis koder fra ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes
Ja, det kan godt forkortes. Du skal sætte dig ned og analysere din kode. Alle de steder, hvor du rent faktisk gør det samme - evt. med forskellige variabler - bør du smide i en subprocedure (med argumenter, hvis der er forskellige variabler). Så skal du kun have koden en gang; meget nemmere at vedligeholde.
Overvej at splitte din Select Case Valg - det kan du umiddelbart gøre på en måde, så du kalder en subprocedure fra din oprindelige procedure (f.eks. fra OriginaltBrevOgKopi, hvor du jo allerede ved hvilket valg der er foretaget).
Det er nu mest den del med indsættelse af print felter jeg mener. F.eks SideLogo1 indsætter logo på side 1, SideLogo1Resten chekker om der er flere sider og indsætter logo på sidste side, SideLogo1Resten1 indsætter logo på hver side SideLogo1Resten finder untagen sidste, det er denne gennem rulning af dokumentet + indsættelse af print feltet øverst på siden der burde kunne gøres nemmere, men jeg er ikke hjemme i mine typer, er det ikke muligt at lave et range på f.eks side 2 til slut a dokumentet gennem rulle ranget og indsætte feltet?
Det er jo netop der, hvor benyttelse af sidehovedet kommer ind. Så skal du hverken tjekke antalsider eller løbe noget igennem (medmindre du har sektioner, hvor sidehoved ikke hænger sammen med tidligere). Du skal kun sørge for at have speciel første side, hvis den skal se anderledes ud end resten og derefter håndtere dine indsættelser én gang i hver type sidehoved (primary, firstpage).
Du har ganske ret i at insætte i sidehovedet er det nemmeste, problemet er bare jeg ikke altid kan være sikker på sidehovedet hænger sammen med tidligere hoved. Jeg tror jeg vil sige mange tak for din meget konpetente hjælp, og søge videre på nettet.
Men i øvrigt kan du tjekke på, om sidehovederne (hvis der er flere sektioner) hænger sammen med den forrige. Hvis det ikke gør, indsætter du dit logo/overlay igen. Det er rimelig nemt at have med at gøre. Sig til, hvis du vil have indspark på den front.
Synes godt om
Ny brugerNybegynder
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.