1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Excel Makro auf welcher Seite liegt die Zelle?

Discussion in 'Office-Programme' started by goofy333, Jan 25, 2008.

Thread Status:
Not open for further replies.
  1. goofy333

    goofy333 Kbyte

    Gibt es eine Möglichkeit, in einem Makro herauszubekommen, auf welcher Druckseite eine selektierte Zelle steht (Seitennummer)?
     
  2. brum

    brum Kbyte

    Ja. Ich hab für Dich ein Beispiel-Makro erstellt.

    Code:
    Sub ZelleAufSeite()
      Set AktiveZelle = ActiveCell
      Cells.SpecialCells(xlLastCell).Select 'Diese Zeile ist wichtig, damit der folgende Teil mit HPageBreaks funktioniert.
      Seite = 1
      Do Until Seite > ActiveSheet.HPageBreaks.Count
        If AktiveZelle.Row < ActiveSheet.HPageBreaks.Item(Seite).Location.Row Then Exit Do
        Seite = Seite + 1
      Loop
      AktiveZelle.Select
      MsgBox Seite
    End Sub
    
    Edit: Hab gerade herausgefunden, dass das nur funtioniert, wenn die ganze Breite auf die Seite passt, also es nach rechts keine zweite Seite gibt...

    Gruss
    Bruno
     
  3. Beverly

    Beverly Halbes Megabyte

    Hi,

    vielleicht dir das hier weiter

    Code:
    Sub seitennummer()
        Dim loHUmbruch As Long
        Dim loVUmbruch As Long
        For loHUmbruch = 1 To ActiveSheet.HPageBreaks.Count
            If ActiveSheet.HPageBreaks(loHUmbruch).Location.Row > Selection.Row Then Exit For
        Next loHUmbruch
        For loVUmbruch = 1 To ActiveSheet.VPageBreaks.Count
            If ActiveSheet.VPageBreaks(loVUmbruch).Location.Column > Selection.Column Then Exit For
        Next loVUmbruch
        If ActiveSheet.PageSetup.Order = xlDownThenOver Then
            MsgBox loHUmbruch + (loVUmbruch - 1) * (ActiveSheet.HPageBreaks.Count + 1)
        Else
            MsgBox loVUmbruch + (loHUmbruch - 1) * (ActiveSheet.VPageBreaks.Count + 1)
        End If
    End Sub
    
     
  4. brum

    brum Kbyte

    Mir ist noch eingefallen, dass Du eventuell einen Druckbereich festgelegt haben könntest. Dann musst Du natürlich noch überprüfen, ob die Zelle ausserhalb dieses Bereichs liegt.

    Dann also noch diesen Bereich an den Anfang des Makros setzen:

    Code:
    If ActiveSheet.PageSetup.PrintArea > "" Then
      Set isect = Application.Intersect(Range(ActiveSheet.PageSetup.PrintArea), ActiveCell)
      If isect Is Nothing Then
        MsgBox "Aktive Zelle ausserhalb des Druckbereichs."
        Exit Sub
      End If
    End If
    
    Gruss
    Bruno
     
  5. Beverly

    Beverly Halbes Megabyte

    Hi Bruno,

    das ist eine hervorragende Idee, da der TO ja geschrieben hat, dass er sich auf den Druckbereich beziehen möchte. Man kann deinen Code noch ein klein wenig zusammenfassen und ohne die Variable isect auskommen, sodass der komplette Code dann so aussehen könnte

    Code:
    Sub seitennummer()
        Dim loHUmbruch As Long
        Dim loVUmbruch As Long
        If ActiveSheet.PageSetup.PrintArea <> "" Then
            If Not Intersect(Selection, Range(ActiveSheet.PageSetup.PrintArea)) Is Nothing Then
                For loHUmbruch = 1 To ActiveSheet.HPageBreaks.Count
                    If ActiveSheet.HPageBreaks(loHUmbruch).Location.Row > Selection.Row Then Exit For
                Next loHUmbruch
                For loVUmbruch = 1 To ActiveSheet.VPageBreaks.Count
                    If ActiveSheet.VPageBreaks(loVUmbruch).Location.Column > Selection.Column Then Exit For
                Next loVUmbruch
                If ActiveSheet.PageSetup.Order = xlDownThenOver Then
                    MsgBox loHUmbruch + (loVUmbruch - 1) * (ActiveSheet.HPageBreaks.Count + 1)
                Else
                    MsgBox loVUmbruch + (loHUmbruch - 1) * (ActiveSheet.VPageBreaks.Count + 1)
                End If
            Else
                MsgBox "Außerhalb des Druckbereichs"
            End If
        Else
            MsgBox "Kein Druckbereich festgelegt"
        End If
    End Sub
    Generell wird aber davon ausgegangen, dass der selektierte Bereich komplett innerhalb (oder komplett außerhalb) des Druckbereichs liegt. Wurde nur eine Zelle gewählt, ist das kein Problem. Wenn bei mehreren Zellen nur eine davon außerhalb liegt, wird das jedoch nicht berücksichtigt - es wird immer der Schnittbereich der Markierung mit dem Druckbereich zu Grunde gelegt.
     
  6. goofy333

    goofy333 Kbyte

    Danke, das Makro von Beverly funktioniert und erfüllt meine Anforderungen. Ein Druckbereich ist bereits festgelegt. Bei dem erstem Makro hatte ich Probleme. Da bekam ich immer einen Indexfehler.

    Trotzdem nochmal vielen Dank. Jetzt kann ich endlich automatisch in der letzten Zeile auf jeder Druckseite die untere Linie automatisch dick darstellen, so daß sich ein einheitlicher Kasten um die gesamte Tabelle ergibt.
     
  7. brum

    brum Kbyte

    Da gibt es von Microsoft eine Abhilfe: http://support.microsoft.com/kb/210663/de. Leider versteht man das "Deutsch" aber nicht.

    Deshalb habe ich bei meinem Makro auch die folgenden Zeilen eingefügt.

    Zuerst die aktive Zelle merken, dann an das Ende der Tabelle springen...
    Code:
      Set AktiveZelle = ActiveCell
      Cells.SpecialCells(xlLastCell).Select 'Diese Zeile ist wichtig, damit der folgende Teil mit HPageBreaks funktioniert.
    
    ...und am Schluss den Cursor zurückzusetzen.
    Code:
      AktiveZelle.Select
    
    Gruss
    Bruno
     
Thread Status:
Not open for further replies.

Share This Page