[Excel VBA] Probleem met het zetten van Pagebreaks

Pagina: 1
Acties:
  • 325 views sinds 30-01-2008
  • Reageer

  • De doorloper
  • Registratie: Januari 2003
  • Laatst online: 20-05 19:19
Ik wil met onderstaande code handmatig de pagebreaks instellen op een sheet met alleen grafieken (ChartObjects). Er komen vier grafieken op een pagina, die Landscape wordt afgedrukt. Omdat elke pagina altijd een grafiek linksboven heeft en niet altijd rechtsonder, gebruik ik TopLeftCell in plaats van BottomRightCell (line 11) en sla ik de eerste over om een lege pagina aan het begin te voorkomen.

Onderstaande code geeft een runtime error waar de help van VBA weinig nuttigs over te vertellen heeft: Run-time error 1004: Application-defined or object-defined error. Deze regel heeft betrekking op de toekenning van een waarde aan Pagebreak.Location (line 14).

Weet iemand hoe ik dit ga oplossen?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub SetPrintPageBreaks()
    Dim myObject As Object
    Dim iChart, iPage As Integer
    Dim curRow, lastRow As Long
    Dim skippedFirst As Boolean
    
    iPage = 1
    skippedFirst = vbFalse
    lastRow = -1
    For Each myObject In Sheet5.ChartObjects
        curRow = myObject.TopLeftCell.Row
        If curRow <> lastRow Then
            If skippedFirst Then
                Sheet5.HPageBreaks(iPage).Location = Sheet5.Range(Cells(curRow - 1, 1)) 'Cells(curRow - 1, 1)
                iPage = iPage + 1
                
                lastRow = curRow
            Else
                skippedFirst = vbTrue
            End If
        End If
    Next
End Sub

  • KingRichard
  • Registratie: September 2002
  • Laatst online: 21-03-2025

KingRichard

former Duke of Gloucester

Volgens mijn Excel/VBA online help is HPagebreaks alleen-lezen:
Returns an HPageBreaks collection that represents the horizontal page breaks on the sheet. Read-only.
Ik denk dat je aan de slag moet met de...
PageBreak Property

Returns or sets the location of a page break. Can be one of the following XlPageBreak constants: xlPageBreakAutomatic, xlPageBreakManual, or xlPageBreakNone. Read/write Long.

Remarks
This property can return the location of either automatic or manual page breaks, but it can only set the location of manual breaks (it can only be set to xlPageBreakManual or xlPageBreakNone).

To remove all manual page breaks on a worksheet, set Cells.PageBreak to xlPageBreakNone.
Je zou bijvoorbeeld eerst alle pagebreaks kunnen verwijderen en daarna nieuwe invoegen op de juiste plekken.

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Correct me if I'm wrong: de collectie is (uiteraard) alleen lezen, het location Object is lezen/schrijven. Je stelt location in op een range, ie een object. En dan vereist VBA het sleutelwoord SET:

set pagebreak.location=range

Ook zie ik nergens in je code dat je de pagebreaks aanmaakt, m.a.w. staan ze al in je sheetje? Dan kun je het ook nog omdraaien:

For each pb in sheet.pagebreaks
//doe wat je moet doen
Next pb

[ Voor 32% gewijzigd door Lustucru op 12-01-2004 23:06 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • KingRichard
  • Registratie: September 2002
  • Laatst online: 21-03-2025

KingRichard

former Duke of Gloucester

Niesje schreef op 12 januari 2004 @ 22:58:
Correct me if I'm wrong:[...]
De documentatie is nogal vaag over HPagebreak.Location, maar niet over PageBreak. PageBreak is een property van de cel, niet van de sheet. Een collectie cellen kan op die manier wel een collectie Pagebreaks hebben, vandaar het voorbeeld Cells.PageBreak = xlPageBreakNone

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

KingRichard schreef op 13 januari 2004 @ 00:01:
[...]
De documentatie is nogal vaag over HPagebreak.Location, maar niet over PageBreak. PageBreak is een property van de cel, niet van de sheet. Een collectie cellen kan op die manier wel een collectie Pagebreaks hebben, vandaar het voorbeeld Cells.PageBreak = xlPageBreakNone
je hebt volkomen gelijk: ik had de pagebreak property van het rangeobject volkomen over het hoofd gezien. Was een beetje op het verleerde spoor gezet door die coderegel:
Sheet5.HPageBreaks(iPage).Location = Sheet5.Range(Cells(curRow - 1, 1))
ipv het kortere:
Sheet5.Range(Cells(curRow - 1, 1).pagebreak=xlpagebreakmanual,

Wat schrijft ms zelf:
Met de methode Add kunt u een horizontaal pagina-einde toevoegen. In het volgende voorbeeld wordt een horizontaal pagina-einde toegevoegd boven de actieve cel.

ActiveSheet.HPageBreaks.Add Before:=ActiveCell
gevolgd door:

In het volgende voorbeeld wordt de positie van het eerste horizontale pagina-einde gewijzigd.

Worksheets(1).HPageBreaks(1).Location = Worksheets(1).Range("e5")
. en dat werkt wonder boven wonder niet :'(

[ Voor 33% gewijzigd door Lustucru op 13-01-2004 01:07 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • KingRichard
  • Registratie: September 2002
  • Laatst online: 21-03-2025

KingRichard

former Duke of Gloucester

Misschien moet De doorloper het eens met één cel proberen i.p.v. een range. Ik hoop dat hij ook nog eens een keer reageert, terwijl wij druk bezig de diepere waarheden van VBA te doorgronden ;) .

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Pas op, dadelijk verhuizen we naar W&L :9

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • De doorloper
  • Registratie: Januari 2003
  • Laatst online: 20-05 19:19
het werkt inmiddels:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Sub SetPrintPageBreaks()
    Dim myObject As Object
    Dim iChart, iObject As Integer
    Dim curRow, lastRow, MostRightCol As Long
    Dim skippedFirst, skippedFirstRowOnPage As Boolean
    
    iObject = 0
    skippedFirst = vbFalse ' boven de bovenste grafiek geen pagebreak
    skippedFirstRowOnPage = vbFalse
    lastRow = -1
    
    Sheet5.PageSetup.PrintArea = ""
    Sheet5.ResetAllPageBreaks
    
    For Each myObject In Sheet5.ChartObjects
        curRow = myObject.TopLeftCell.Row
        
        If iObject = 1 Then
            ' Voer dit uit voor de tweede grafiek
            MostRightCol = myObject.BottomRightCell.Column
            Sheet5.VPageBreaks.Add Before:=Sheet5.Cells(1, MostRightCol + 1)
        End If
        If iObject Mod 9 = 0 And iObject <> 0 Then
            ' Eerste object in nieuwe serie
            Sheet5.HPageBreaks.Add Before:=Sheet5.Cells(curRow, 1)
            skippedFirstRowOnPage = Not skippedFirstRowOnPage
        ElseIf curRow <> lastRow Then
'        If curRow <> lastRow Then
            If skippedFirst Then
                If skippedFirstRowOnPage Then
                    Sheet5.HPageBreaks.Add Before:=Sheet5.Cells(curRow, 1)
                    skippedFirstRowOnPage = vbFalse
                Else
                    skippedFirstRowOnPage = vbTrue
                End If
            Else
                skippedFirst = vbTrue
            End If
            lastRow = curRow
        End If
        iObject = iObject + 1
    Next
End Sub


ff resetten en dan de breaks toevoegen werkt perfect.  :P

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Goed werk heeft tijd nodig ;). Blij dat het werkt.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1