AW: Gute Variante...
21.07.2007 10:39:40
Ramses
Hallo Franz
"...By the way: Target und Selection sind beim Start der Worksheet-Ereignismakros identisch...."
Da hast du natürlich recht und ich einen Denkfehler. Meine Überlegung war hier vielmehr die Zeilenhöhe der zuerst ausgewählten Zelle zu übernehmen.
Ich habe den Code wie von dir beschrieben in das Klassenmodul "Diese Arbeitsmappe" kopiert, incl. der Private Deklarationen. Das SheetSelectionChanger-Ereignis tritt nicht ein, und der Sheet-Wechsel haut nicht hin.
Beim SheetDeactivate, Workbook-Deactivate erhalte ich den Fehler
Run Time Error: 9
Object Variable oder With Variable not Set
Und das stimmt ja auch
Nochmals zur Erläuterung, vielleicht habe ich hier einen riesigen Denkfehler, aber das macht in meinen Augen keinen Sinn
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
'Wenn LastRow is NICHT NOTHING
'also "lastRow" HAT EINEN Wert
If Not lastRow Is Nothing Then
'Zuweisen der Zeilenhöhe an die Variable "lastRow"
lastRow.RowHeight = lastHeight
' ... aber hier wird die Variable ja wieder geleert !!
' ... wozu also zuerst die Zuweisung ?
Set lastRow = Nothing
End If
End Sub
Aber was passiert, wenn "lastRow = Nothing" ?
Hier muss auf jeden Fall noch ein Worksheet-Activate, und auch noch ein Workbook-Activate Ereignis rein, der die Variable "lastRow" nochmals mit dem Wert der ausgewählten Zelle auf dem neu gewählten Tabellenblatt füllt, und diese auch gleich vergrössert darstellt.
Hilf mir mal auf die Sprünge bei dieser Anweisung, die krieg ich trotz mehrmaligem durchlesen nicht auf die Reihe:
If Target.Cells.Count = Sh.Columns.Count Then
End if
in deinem "...Workbook_SheetSelectionChange..." Ereignis.
Alle nachfolgenden Anweisungen
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
If lastRow.Address = Selection.Address Then
Set lastRow = Nothing
GoTo weiter
End If
End If
Set lastRow = Selection
lastHeight = lastRow.RowHeight
lastRow.RowHeight = 2 * lastHeight
treten NUR ein, wenn die Anzahl der Zellen in der Auswahl (Target/Selection) gleich der Anzahl Spalten in der Tabelle ist ?
Das kriege ich nicht auf die Reihe wozu das gut sein soll.
Das würde doch bedeuten, dass ich eine Auswahl haben muss von mindestens 16*16 Zellen um auf die abgefragten 256 Spalten zu kommen?
Aber NUR hier, innerhalb der IF-Schleife kriegt "lastRow" einen neuen Wert, der dann zumindest im Sheet-Selection-Ereignis verwendet werden kann. Das muss von meinem Verständnis, und dann funktioniert zumindest das Sheet-Selection-Change-Ereignis bei mir, so heissen:
Select Case Sh.Name
Case "" 'Liste Blätter in denen Funktion nicht aktiv sein soll (Beispiel: "Tab1", "Tab4")
Case Else
If Target.Cells.Count = Sh.Columns.Count Then
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
If lastRow.Address = Selection.Address Then
Set lastRow = Nothing
GoTo weiter
End If
End If
End If
'Ausserhalb der IF-Abfrage
Set lastRow = Selection
lastHeight = lastRow.RowHeight
lastRow.RowHeight = 2 * lastHeight
End Select
Ausserdem taucht hier das Problem dann auf, dass bei Auswahl einer anderen Tabelle, ABER OHNE Auswahl einer anderen Zelle auf dieser Tabelle, die Variable "lastRow" ja immer noch leer ist.
Daher wird das SheetSelection Ereignis erst bei der ZWEITEN Auswahl einer Zelle auf der Tabelle ausgeführt.
1. Aktivierung der neuen Tabelle
> Nichts passiert, die aktive !!! Zelle bleibt gleich gross wie sonst auf
> Daher sollte ein Worksheet-Activate-Ereignis noch rein, der die aktive Zelle bei der Auswahl eines Sheet verändert.
2. Auswahl einer anderen Zelle auf der Tabelle >
Jetzt wird erst die Variable "lastRow" neu gefüllt und die Zeilenhöhe angepasst
Gruss Rainer