Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Objekte fixieren

Objekte fixieren
21.03.2009 23:19:10
Jörg
Guten Abend zusammen!
Die Frage, wie Objekte in einem Arbeitsblatt "scroll-resistent" fixiert werden können, taucht ja im Archiv öfter auf, mit Antworten von "geht nicht" bis zu Userform drunter legen u.a.m. ist alles dabei, und meist klappt es am Ende nicht zufriedenstellend. Ich kann aber irgendwie nicht glauben, daß etwas in Excel nicht machbar sein soll, was auf jeder Website möglich ist...
In meinem Fall ist es wie bei anderen Fragern auch: Fenster fixieren oder so geht nicht.
Wäre es nicht eine Möglichkeit, die Eigenschaften Left und Top an ein Scoll-Ereignis zu koppeln? Wie könnte ein Code dafür aussehen?
Gruß Jörg
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Objekte fixieren
21.03.2009 23:26:48
Hajo_Zi
Hallo Jörg,
Scroll löst ken Ereignis aus.
Gruß Hajo
hhmmm... schade eigentlich :-((
21.03.2009 23:41:22
Jörg
Ein bischen was geht immer...;-)
22.03.2009 08:53:34
ransi
HAllo
Scroll löst kein Ereigniss aus, das stimmt, aber dann man kann sich ja eins schreiben ;-)
Hier mal ein Ansatz:
(Mit der gaaaanz heißen Nadel gestrickt)
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit



Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Tabelle1" Then
        Call Aufruf
        Else:
        Call stoppen
    End If
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Dim Z As Long
Dim S As Integer
Dim hEvent


Private Declare Function SetTimer Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal nIDEvent As Long) As Long

Public Sub Aufruf()
    Z = ActiveWindow.VisibleRange.Rows(1).Row
    S = ActiveWindow.VisibleRange.Columns(1).Column
    EnableTimer 100 'Millisekunden
End Sub

Public Sub stoppen()
    DisableTimer
End Sub

Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long)
    If ActiveWindow.VisibleRange.Rows(1).Row <> Z Then
        Z = ActiveWindow.VisibleRange.Rows(1).Row
        Call vertikal_Scroll
    End If
    If ActiveWindow.VisibleRange.Columns(1).Column <> S Then
        S = ActiveWindow.VisibleRange.Columns(1).Column
        Call Horizontal_Scroll
    End If
End Sub


Public Function EnableTimer(ByVal msInterval As Long)
    If hEvent <> 0 Then Exit Function
    hEvent = SetTimer(0&, 0&, msInterval, AddressOf TimerProc)
End Function

Public Function DisableTimer()
    If hEvent = 0 Then Exit Function
    KillTimer 0&, hEvent
    hEvent = 0
End Function



Public Sub Horizontal_Scroll()
    MsgBox "Jetzt wird horizontal gescrollt"
End Sub

Public Sub vertikal_Scroll()
    MsgBox "Jetzt wird vertikal gescrollt"
End Sub

ransiHAllo
Hier mal ein Ansatz.
(Mit der gaaaanz heißen Nadel gestrickt )
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit



Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Tabelle1" Then
        Call Aufruf
        Else:
        Call stoppen
    End If
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Dim Z As Long
Dim S As Integer
Dim hEvent


Private Declare Function SetTimer Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal nIDEvent As Long) As Long

Public Sub Aufruf()
    Z = ActiveWindow.VisibleRange.Rows(1).Row
    S = ActiveWindow.VisibleRange.Columns(1).Column
    EnableTimer 100 'Millisekunden
End Sub

Public Sub stoppen()
    DisableTimer
End Sub

Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long)
    If ActiveWindow.VisibleRange.Rows(1).Row <> Z Then
        Z = ActiveWindow.VisibleRange.Rows(1).Row
        Call vertikal_Scroll
    End If
    If ActiveWindow.VisibleRange.Columns(1).Column <> S Then
        S = ActiveWindow.VisibleRange.Columns(1).Column
        Call Horizontal_Scroll
    End If
End Sub


Public Function EnableTimer(ByVal msInterval As Long)
    If hEvent <> 0 Then Exit Function
    hEvent = SetTimer(0&, 0&, msInterval, AddressOf TimerProc)
End Function

Public Function DisableTimer()
    If hEvent = 0 Then Exit Function
    KillTimer 0&, hEvent
    hEvent = 0
End Function



Public Sub Horizontal_Scroll()
    MsgBox "Jetzt wird horizontal gescrollt"
End Sub

Public Sub vertikal_Scroll()
    MsgBox "Jetzt wird vertikal gescrollt"
End Sub

ransi
Anzeige
Ein bischen was geht immer...;-)
22.03.2009 09:06:45
ransi
Hallo
Hab grade gesehen das ich den letzten Post vermurkst habe.
Hier mal die Beispieldatei:
https://www.herber.de/bbs/user/60553.xls
ransi
AW: Ein bischen was geht immer...;-)
22.03.2009 11:12:29
Jörg
Moin Ransi
also... bis ich den Code so richtig verstanden habe, wird wohl noch ein Weilchen vergehen :-)
Ich hatte gedacht, daß ich anstelle der MsgBoxen nun hineinstellen müßte zB
With Worksheets("Tabelle1").CheckBox1
.Left = 20
.Top = 30 usw
aber das geht nicht... An welcher Stelle muß denn stehen, daß Objekt xy bitte schön an Position soundso stehen soll?
Gruß Jörg
Anzeige
AW: PS
22.03.2009 11:15:54
Jörg
...übrigens kommt, während die Beispieldatei geöffnet ist, immer dann, wenn ich eine weitere Datei öffne, der Hinweis "Jetzt wird vertikal gescrollt" ;-))
Nur ein Grungerüst.
22.03.2009 11:43:50
ransi
HAllo Jörg

Ich hatte gedacht, daß ich anstelle der MsgBoxen nun hineinstellen müßte zB
aber das geht nicht... An welcher Stelle muß denn stehen, daß Objekt xy bitte schön an Position soundso stehen soll?


Ich schrieb extra:
ein Ansatz:
(Mit der gaaaanz heißen Nadel gestrickt)

Das sollte heißen:
Einfach so dahin geschrieben und kaum getestet.
Also keine Fehlerroutine oder sowas.
Ich schau mal ob ich das noch alles reingebaut kriege.


also... bis ich den Code so richtig verstanden habe, wird wohl noch ein Weilchen vergehen :-)


Der code startet einen Timer.
Alle 100 Millisekunden wird die oberste Rechte Zelle der VisibleRange abgefragt.
Hat sich die Zeilennummer oder die Spaltennummer geändert erscheint die Msgbox.
ransi

Anzeige
AW: Objekte fixieren
21.03.2009 23:43:59
Uduuh
Hallo,

in Excel nicht machbar sein soll, was auf jeder Website möglich ist...


Excel ist eben eine Tabellenkalkulation.
Gruß aus’m Pott
Udo

;
Anzeige
Anzeige

Infobox / Tutorial

Objekte in Excel fixieren: So geht's!


Schritt-für-Schritt-Anleitung

Um ein Excel-Objekt zu fixieren, kannst du einen VBA-Code verwenden, der die Position des Objekts während des Scrollens aktualisiert. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Füge ein neues Modul hinzu:

    • Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle "Einfügen" > "Modul".
  3. Kopiere den folgenden Code in das Modul:

    Option Explicit
    
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
       If Sh.Name = "Tabelle1" Then
           Call Aufruf
       Else
           Call stoppen
       End If
    End Sub
    
    Dim Z As Long
    Dim S As Integer
    Dim hEvent
    
    Private Declare Function SetTimer Lib "user32.dll" ( _
       ByVal hWnd As Long, _
       ByVal nIDEvent As Long, _
       ByVal uElapse As Long, _
       ByVal lpTimerFunc As Long) As Long
    
    Private Declare Function KillTimer Lib "user32.dll" ( _
       ByVal hWnd As Long, _
       ByVal nIDEvent As Long) As Long
    
    Public Sub Aufruf()
       Z = ActiveWindow.VisibleRange.Rows(1).Row
       S = ActiveWindow.VisibleRange.Columns(1).Column
       EnableTimer 100 'Millisekunden
    End Sub
    
    Public Sub stoppen()
       DisableTimer
    End Sub
    
    Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, _
       ByVal wParam As Long, ByVal lParam As Long)
       If ActiveWindow.VisibleRange.Rows(1).Row <> Z Then
           Z = ActiveWindow.VisibleRange.Rows(1).Row
           Call vertikal_Scroll
       End If
       If ActiveWindow.VisibleRange.Columns(1).Column <> S Then
           S = ActiveWindow.VisibleRange.Columns(1).Column
           Call Horizontal_Scroll
       End If
    End Sub
    
    Public Function EnableTimer(ByVal msInterval As Long)
       If hEvent <> 0 Then Exit Function
       hEvent = SetTimer(0&, 0&, msInterval, AddressOf TimerProc)
    End Function
    
    Public Function DisableTimer()
       If hEvent = 0 Then Exit Function
       KillTimer 0&, hEvent
       hEvent = 0
    End Function
    
    Public Sub Horizontal_Scroll()
       ' Hier kannst du den Code zum Fixieren des Objekts einfügen
    End Sub
    
    Public Sub vertikal_Scroll()
       ' Hier kannst du den Code zum Fixieren des Objekts einfügen
    End Sub
  4. Ändere die Position des Objekts:

    • An den Stellen, wo die MsgBox-Befehle stehen, kannst du deine Objekte wie folgt fixieren:
      With Worksheets("Tabelle1").CheckBox1
      .Left = 20
      .Top = 30
      End With
  5. Speichere die Datei und teste den Code.


Häufige Fehler und Lösungen

  • Fehler: "Jetzt wird horizontal gescrollt" erscheint ständig:

    • Lösung: Stelle sicher, dass der Code nicht in einer Endlosschleife läuft, indem du die Timer-Funktion richtig stoppst.
  • Objekte werden nicht fixiert:

    • Überprüfe, ob du den Code an der richtigen Stelle eingefügt hast und dass die Objektnamen korrekt sind.

Alternative Methoden

Falls du keine VBA-Lösungen verwenden möchtest, kannst du auch die Funktion "Fenster fixieren" in Excel nutzen. Damit kannst du bestimmte Zeilen oder Spalten fixieren, um den Überblick zu behalten, während du durch die Tabelle scrollst.

  1. Markiere die Zeile oder Spalte, die du fixieren möchtest.
  2. Gehe zu Ansicht > Fenster fixieren und wähle die entsprechende Option.

Praktische Beispiele

Hier ist ein Beispiel, um ein Kontrollkästchen in Excel zu fixieren:

With Worksheets("Tabelle1").CheckBox1
    .Left = ActiveWindow.VisibleRange.Columns(1).Width + 10
    .Top = ActiveWindow.VisibleRange.Rows(1).Top
End With

Dieses Beispiel positioniert das Kontrollkästchen immer rechts von der ersten sichtbaren Spalte.


Tipps für Profis

  • Experimentiere mit verschiedenen Timer-Intervallen, um die Performance zu optimieren.
  • Nutze die With-Anweisung, um redundanten Code zu vermeiden und die Lesbarkeit zu erhöhen.
  • Teste deinen Code regelmäßig, um Fehler schnell zu identifizieren.

FAQ: Häufige Fragen

1. Kann ich Objekte auch ohne VBA fixieren? Ja, du kannst die Funktion "Fenster fixieren" nutzen, um Zeilen oder Spalten sichtbar zu halten.

2. Welche Excel-Versionen unterstützen diese Funktion? Die beschriebenen Methoden sind in Excel 2010 und späteren Versionen verfügbar.

3. Was tun, wenn der Timer nicht funktioniert? Überprüfe, ob die Timer-Funktion korrekt deklariert und aufgerufen wird. Stelle sicher, dass keine anderen VBA-Prozesse den Timer stören.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige