Anzeige
Archiv - Navigation
1068to1072
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

drei Fenster synchronisieren -minimiert

drei Fenster synchronisieren -minimiert
10.04.2009 09:51:59
Werner

VBA-Level: befriedigend
Hallo Freunde,
habe ein Workbook in drei Fenstern geöffnet, und zwar so, dass im ersten Fenster der linke
Teil der Tabelle, im zweiten der mittlere und im dritten der rechte erscheint.
Nun will ich erreichen, dass die drei Fenster miteinander synchronisiert werden, und zwar so, dass,
wenn ich in einem der Fenster nach unten scrolle, in den beiden anderen um die gleiche Anzahl von Datensätzen nach unten gescrollt wird. Gleiches gilt für das Nach-oben-Scrollen. Alle drei Fenster
sollen also immer die gleichen Zeilen in gleicher Position zum oberen Fensterrand anzeigen.
Dabei soll immer nur ein einziges Fenster geöffnet, die beiden anderen sollen minimiert sein.
Excel 2007 hat zwar einen Menupunkt für synchrones Scrollen, doch müssen dabei mindestens zwei
Fenster sichtbar sein. Zwei Fenster minimiert und nur eines offen geht dabei offenbar nicht.
Was tun? Dank für Rat! Werner R.

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: drei Fenster synchronisieren -minimiert
10.04.2009 12:41:42
Tino
Hallo,
versuche es mal hiermit.
Mit StartAllScoll wird das Beispiel gestartet und mit StopAllScoll wieder beendet.
Normal würde ich dies nun über Oben und Close steuern,
zum Testen kannst Du aber auch erst mal zwei Buttons verwenden.
Public myTimer As Date

Sub StartAllScoll()
    Call ScollAlle
    myTimer = Now + TimeSerial(0, 0, 1)
    Application.OnTime myTimer, "'" & ThisWorkbook.Name & "'!Modul1.StartAllScoll"
End Sub

Sub StopAllScoll()
On Error Resume Next
 Application.OnTime myTimer, "Start", , False
End Sub

Sub ScollAlle()
Dim obDatei As Window

    For Each obDatei In Windows
     If TypeName(obDatei.ActiveSheet) = "Worksheet" Then
      obDatei.SmallScroll ActiveWindow.VisibleRange(1).Row - obDatei.VisibleRange(1).Row
     End If
    Next obDatei

End Sub


Gruß Tino

Anzeige
Zwischenmitteilung
10.04.2009 13:44:02
Werner
Hallo Tino,
bin froh, diesen Code auch am Feiertag erhalten zu haben. Hat dir sicherlich einige Mühe gemacht, für die ich mich herzlich bedanke!
Um diesen Code zu verstehen, werde ich ihn erst mal studieren. Da er für mich etwas
schwierig ist, erbitte ich Bedenkzeit bis morgen. Bis dahin habe ich auch ihn implementiert und gebe
dir dann Rückmeldung, wie es geklappt hat.
Beste Grüße und Frohe Ostern! Werner R.
noch eine
10.04.2009 15:39:40
Tino
Hallo,
damit Du noch mehr zum Probieren hast, habe ich noch eine Version erstellt.
Diese arbeitet mit Millisekunden und daher sieht das Scrollen etwas synchroner aus.
Public LTimer As Long

Public Declare Function SetTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
 
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long) As Long

Sub StartAllScoll()
LTimer = SetTimer(0, 0, 100, AddressOf ScollAlle)
End Sub

Sub StopAllScoll()
On Error Resume Next
KillTimer 0, LTimer
End Sub

Sub ScollAlle()
Dim obDatei As Window

On Error Resume Next 'bei Fehler Excelabsturtz, ist Notwendig 

 DoEvents
    For Each obDatei In Windows
     If TypeName(obDatei.ActiveSheet) = "Worksheet" Then
      obDatei.SmallScroll ActiveWindow.VisibleRange(1).Row - obDatei.VisibleRange(1).Row
     End If
    Next obDatei

    
End Sub


Gruß Tino

Anzeige
Klappt zum grossen Teil!
11.04.2009 04:52:59
Werner
Hallo Tino,
deinen ersten Code habe ich jetzt getestet. Die Unterroutine ScollAlle() läuft sehr gut. Aus ihr habe
ich insbesondere die Funktionsweise der mir zuvor unbekannt gewesenen Eigenschaft "VisibleRange" gelernt.
Die Hauptroutine habe ich vom Worksheet_Activate-Ereignis des Worksheets mit den drei Fenstern aus aufgerufen. Da sie eine Rekursion enthält, ruft sie sich jedoch immer von neuem auf, so dass der
Cursor nur als Sanduhr erscheint und man weder Daten eingeben noch scrollen kann.
Dann habe ich die Makros "StartAllScoll" und "StopAllScoll" jedoch einfach weggelassen und den Makro
"ScollAlle" direkt vom Worksheet_Activate-Ereignis aus aufgerufen. Wenn ich in Fenster 1 nach unten
scrolle und dann auf den nächsten Worksheet-Tab rechts und von dort wieder zum Worksheet mit
den Fenstern zurück wechsele, klappt das Scrollen: In den beiden anderen Fenstern erscheint der
Text dann genauso wie im ersten. Damit ist mein Problem aber auch schon zu 90% gelöst. Es geht eben
nur noch nicht ganz automatisch.
Jetzt probiere ich noch deinen zweiten Code aus und gebe dir dann Nachricht.
Beste Grüße! Werner R.
Anzeige
Das ist es!
11.04.2009 05:42:22
Werner
Hallo Tino,
bitte zunächst um Entschuldigung, dass mein voriger Beitrag dreimal erschienen ist. Manchmal weiß man
nicht, ob ein Beitrag angekommen ist, wie in diesem Fall: Da zweimal nichts angezeigt wurde, habe ich
dann eben noch einmal abgesandt, mit dem Effekt, dass jetzt alles mehrfach übertragen wurde. Sorry!
Dein zweiter Code löst das Problem nun wirklich! Die Synchronisierung klappt hundertprozentig, man
merkt gar nicht, dass überhaupt ein Programm mit Rekursion dauernd im Hintergrund läuft. Bei den
fremdartigen Deklarationen handelt es sich sicherlich um API-Funktionen.
Der Code funktioniert sogar, wenn ich auf das Worksheet zwischendurch eigene VBA-Programme
anwende, während er läuft. Ich habe ihn wieder so platziert, dass er vom Worksheet_Activate-
Ereignis des Worksheets mit den drei Fenstern aufgerufen wird.
Besten Dank für diese nicht ganz alltägliche Lösung!! Ich werde versuchen, diesen Code auch mit meinem jüngsten Vorschlag (siehe https://www.herber.de/forum/messages/1067855.html) zu kombinieren. Erstaunlich, was mit Excel so alles möglich ist. Grüße Werner R.
Anzeige
Noch ein kleines Problem...
11.04.2009 09:23:27
Werner
Hallo Tino,
nun hatte ich doch noch ein kleines Problem mit deinem zweiten Code: Wenn eine Zelle in der Tabelle
markiert ist und ich dann eine andere Zelle markiere, bleibt die erste Markierung bestehen.
Nach einigem Nachdenken bin ich dann wieder auf die Subroutine "ScollAlle" in deinem ersten Code
zurückgekommen und habe diese in einen eigenen kleinen Makro eingebaut, mit dem nicht nur das
Fenster gewechselt, sondern die Fenster auch synchronisiert werden:

Public Sub FensterWechseln12() 'wechselt von Fenster 1 zu Fenster 2 und zurück
Call ScollAlle
If ActiveWindow.WindowNumber = 2 Then
Windows("MeineDatei.xls":1).Activate
ElseIf ActiveWindow.WindowNumber = 1 Then
Windows("MeineDatei.xls:2").Activate
End If
End Sub

Mit einem analogen Code kann zwischen Fenster 1 und Fenster 3 hin- und hergewechselt werden.  _
Wie
du bemerkst, wird nicht nur das Fenster gewechselt, sondern - dank deiner Subroutine -  _
gleichzeitig
auch automatisch synchronisiert. Diese Makrokombination - die Makros zum Fensterwechseln habe  _
ich
mir auf Kurztastenkombinationen gelegt - erspart den Einsatz von "OnTime", d.h. es wird nicht
während der ganzen Zeit, die man am Computer verbringt, immer alle Zehntelsekunde ein Programm
aktiviert.
Wenn außer den drei Fenster allerdings noch weitere Fenster geöffnet sind, könnten die  _
Fensternummern
nicht mehr stimmen. Für diesen Fall müsste obiger Makro angepasst werden, wie, das habe ich
leider noch nicht herausgefunden.
Beste Grüße!  Werner R.

Anzeige
AW: Noch ein kleines Problem...
11.04.2009 10:02:35
Tino
Hallo,
dies liegt wohl daran, dass die Grafik Leistung bei so kurzen Intervallen überfordert ist und mit der Aktualisierung nicht mehr nach kommt.
Man könnte als Abhilfe z. Bsp. alle 3 Sekunden eine Bildschirmaktualisieung durchführen dies verhindert diesen Effekt.
Nachteil ist nur, andere Makros die zur Laufzeit die Aktualisierung ausschalten sind nutzlos.
Ein weiterer Nachteil, alle drei Sekunden zuckt der Bildschirm (Excel) kurz.
Public LTimer As Long
        
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
 
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long) As Long

Sub StartAllScoll()
LTimer = SetTimer(0, 0, 100, AddressOf ScollAlle)
End Sub

Sub StopAllScoll()
On Error Resume Next
KillTimer 0, LTimer
End Sub

Sub ScollAlle()
Dim obDatei As Window
Static i As Integer
On Error Resume Next 'bei Fehler Excelabsturtz, ist Notwendig 
i = IIf(i = 30, 0, i + 1)
    For Each obDatei In Windows
     If TypeName(obDatei.ActiveSheet) = "Worksheet" Then
      obDatei.SmallScroll ActiveWindow.VisibleRange(1).Row - obDatei.VisibleRange(1).Row
      DoEvents
     End If
    Next obDatei
If i = 30 Then Application.ScreenUpdating = True
End Sub


Aber unterm Strich würde ich dennoch sagen, dass Excel für einen solchen Dauerbeschuss nicht geeignet ist.
Man sollte sich also wirklich überlegen ob es Notwendig ist.
Gruß Tino

Anzeige
Alles OK!
11.04.2009 10:43:34
Werner
Hallo Tino,
stimme mit dir überein. Man kann Excel nicht zu viel zumuten. Jedenfalls komme ich mit der von mir
oben beschriebenen Anordnung gut zurecht. Der einzige Nachteil ist, dass ich den Makro jeweils
manuell über die Kurztasten aktivieren muss, dafür entfällt das Bildschirmflimmern (das besonders
im Editor sichtbar ist). Zudem habe ich einen etwas langsamen Computer.
Kurzum, ich sehe das Problem so als gelöst an. Nochmals besten Dank, Grüße! Werner R.
AW: Noch ein kleines Problem...
11.04.2009 10:12:30
Tino
Hallo,
oder man baut dies als SelectionChange Ereignis mit ein, am besten in alle drei Dateien, dann ist dass zucken des Bildschirms nicht so auffällig.
kommt als Code in DieseArbeitsmappe
Option Explicit 
 
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
 Application.ScreenUpdating = True 
End Sub 

Modul Modul1

Option Explicit 
 
Public LTimer As Long 
         
Public Declare Function SetTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long 
  
Public Declare Function KillTimer Lib "user32" (ByVal hWnd As _
Long, ByVal nIDEvent As Long) As Long 
 
Sub StartAllScoll() 
LTimer = SetTimer(0, 0, 100, AddressOf ScollAlle) 
End Sub 
 
Sub StopAllScoll() 
On Error Resume Next 
KillTimer 0, LTimer 
End Sub 
 
Sub ScollAlle() 
Dim obDatei As Window 
 
On Error Resume Next 'bei Fehler Excelabsturtz, ist Notwendig 
 
    For Each obDatei In Windows 
     If TypeName(obDatei.ActiveSheet) = "Worksheet" Then 
      obDatei.SmallScroll ActiveWindow.VisibleRange(1).Row - obDatei.VisibleRange(1).Row 
      DoEvents 
     End If 
    Next obDatei 
 
End Sub 
 


Gruß Tino

Anzeige
AW: Zwischenmitteilung
11.04.2009 04:55:19
Werner
Hallo Tino,
deinen ersten Code habe ich jetzt getestet. Die Unterroutine ScollAlle() läuft sehr gut. Aus ihr habe
ich insbesondere die Funktionsweise der mir zuvor unbekannt gewesenen Eigenschaft "VisibleRange" gelernt.
Die Hauptroutine habe ich vom Worksheet_Activate-Ereignis des Worksheets mit den drei Fenstern aus aufgerufen. Da sie eine Rekursion enthält, ruft sie sich jedoch immer von neuem auf, so dass der
Cursor nur als Sanduhr erscheint und man weder Daten eingeben noch scrollen kann.
Dann habe ich die Makros "StartAllScoll" und "StopAllScoll" jedoch einfach weggelassen und den Makro
"ScollAlle" direkt vom Worksheet_Activate-Ereignis aus aufgerufen. Wenn ich in Fenster 1 nach unten
scrolle und dann auf den nächsten Worksheet-Tab rechts und von dort wieder zum Worksheet mit
den Fenstern zurück wechsele, klappt das Scrollen: In den beiden anderen Fenstern erscheint der
Text dann genauso wie im ersten. Damit ist mein Problem aber auch schon zu 90% gelöst. Es geht eben
nur noch nicht ganz automatisch.
Jetzt probiere ich noch deinen zweiten Code aus und gebe dir dann Nachricht.
Beste Grüße! Werner R.
Anzeige
AW: Zwischenmitteilung
11.04.2009 04:56:35
Werner
Hallo Tino,
deinen ersten Code habe ich jetzt getestet. Die Unterroutine ScollAlle() läuft sehr gut. Aus ihr habe
ich insbesondere die Funktionsweise der mir zuvor unbekannt gewesenen Eigenschaft "VisibleRange" gelernt.
Die Hauptroutine habe ich vom Worksheet_Activate-Ereignis des Worksheets mit den drei Fenstern aus aufgerufen. Da sie eine Rekursion enthält, ruft sie sich jedoch immer von neuem auf, so dass der
Cursor nur als Sanduhr erscheint und man weder Daten eingeben noch scrollen kann.
Dann habe ich die Makros "StartAllScoll" und "StopAllScoll" jedoch einfach weggelassen und den Makro
"ScollAlle" direkt vom Worksheet_Activate-Ereignis aus aufgerufen. Wenn ich in Fenster 1 nach unten
scrolle und dann auf den nächsten Worksheet-Tab rechts und von dort wieder zum Worksheet mit
den Fenstern zurück wechsele, klappt das Scrollen: In den beiden anderen Fenstern erscheint der
Text dann genauso wie im ersten. Damit ist mein Problem aber auch schon zu 90% gelöst. Es geht eben
nur noch nicht ganz automatisch.
Jetzt probiere ich noch deinen zweiten Code aus und gebe dir dann Nachricht.
Beste Grüße! Werner R.
Anzeige
Hier mal ein Beispiel.
11.04.2009 10:38:42
Tino
Hallo,
habe hier mal ein Beispiel aufgebaut, dieses startet automatisch beim öffnen der Datei ScollAlle.xls
Also auspacken und die Datei ScollAlle.xls mit aktivierten Makros öffnen.
https://www.herber.de/bbs/user/61143.zip
Gruß Tino
Habe es ausprobiert, OK!
11.04.2009 11:03:26
Werner
Hallo Tino,
OK, so ist der Einsatz von OnTime viel angenehmer. Man sieht alle drei Fenster gleichzeitig auf dem
Bildschirm und das Zucken ist nur noch im Editor selbst sichtbar. So kann man die Synchronisierung
noch augenfälliger beobachten.
Nun, ich glaube, wird sind damit beim Thema Synchronisierung einen deutlichen Schritt weiter. Verbleibe
mit besten Grüßen! Werner R.
AW: Habe es ausprobiert, OK!
11.04.2009 11:19:43
Tino
Hallo,
also wenn Du im Editor arbeitest sollte keine Makros laufen.
Entweder ist Dein Projekt fertig und Du musst nichts mehr anpassen oder Du bist nicht fertig, dann beim Bearbeiten keine Makros laufen lassen.
Gruß Tino
Klar!
11.04.2009 12:03:39
Werner
Hallo Tino,
stimmt natürlich. Ich habe dies nur als Beispiel dafür gebracht, dass man sieht, wie aktiv "OnTime" ist,
selbst wenn man auf den Worksheets nichts merkt. Werner R.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige