Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
888to892
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
888to892
888to892
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

zeilenhöhe per klick auf zeilenkopf verändern

zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 00:06:00
kekno
hallo!
ich möchte per mausklick auf den zeilenkopf(die zeilennummer, ums genau zu sagen) die zeilenhöhe vergrößern(verdoppeln). ein erneuter mausklick auf die zeilennummer soll den alten zustand wieder herstellen. die schrift braucht sich nicht zu verändern, wenn es aber einfach machbar ist...
ich finde es angenehmer, in breiten tabellen die zeile genau sehen zu können in der ich gerade wühle...
wer weiß rat? danke!

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zeilenhöhe ... Beispiel
20.07.2007 01:10:09
Matthias
Hallo
Beispiel:
ins Tabelleblatt1

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Rows.RowHeight = 12.75 'anpassen! (aktuelle Zeilenhöhe)
ActiveCell.Rows.RowHeight = ActiveCell.Rows.RowHeight * 2
End Sub


Beschreibung:
Egal, wo Du Dich in der tabelle bewegst, die Zeile der aktive Zelle wird doppelt so hoch.
Userbild

AW: zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 01:13:26
Ramses
Hallo
Wenn das nur in einer Tabelle funktionieren soll:
Rechte Maustaste auf den Tabellenreiter
Code anzeigen
und diese Code dort reinkopieren
Option Explicit

Dim oldRow As Long
Dim oldHeight As Double
'Erwartete Zeilenhöhe * 2.5
Const myRH As Double = 2.5

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If oldRow = 0 Then
        oldRow = Target.Row
        oldHeight = Target.RowHeight
        Rows(Target.Row).RowHeight = Rows(Target.Row).RowHeight * myRH
    End If
    If oldRow <> Target.Row Then
        Rows(oldRow).RowHeight = oldHeight
        oldRow = Target.Row
        oldHeight = Target.Height
        Rows(Target.Row).RowHeight = Rows(Target.Row).RowHeight * myRH
    End If
End Sub

Man kann es nur mit erheblichen Aufwand so programmieren, dass es in allen Tabellen universell gültig wäre, daher nur die lokale Version
Gruss Rainer

Anzeige
AW: zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 01:42:00
fcs
Hallo kekno,
dann will ich als weiterer Nachtschwärmer noch die Version für die gesamte Arbeitsmappe beisteuern.
Folgenden Code unter "DieseArbeitsmappe" einfügen.
Ich bin allerdings überfragt, ob man das Ganze auch so umsetzen könnte, dass es als AddIn oder in der Persönlichen Makroarbeitsmappe installiert wird und dann automatisch in jeder geöffneten Datei aktiv ist ohne dass das Makro in jeder Datei eingebaut sein muss.
Nicht getestet hab ich wie diese Funktionalität mit anderen Ereignis-Prozeduren harmoniert.
Gruß
Franz

'#### Verdoppelung der Höhe einer Zeile wenn Zeilenkopf im Tabellenblatt gewählt wird ####
'Zeilenhöhe wird zurückgesetzt, wenn _
* eine andere Zeile gewählt wird _
* die Zeile nochmals selektiert wird _
* das Blatt verlassen wird _
* die Arbeitsmappe gewechselt wird _
* die Datei geschlossen wird
Private lastRow As Range, lastHeight As Double
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
Set lastRow = Nothing
Me.Save 'Datei speicehrn, falls die Höhe einer Zeile noch gedoppelt war
End If
End Sub
Private Sub Workbook_Deactivate()
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
Set lastRow = Nothing
End If
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
Set lastRow = Nothing
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
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
Set lastRow = Selection
lastHeight = lastRow.RowHeight
lastRow.RowHeight = 2 * lastHeight
End If
End Select
weiter:
End Sub


Anzeige
AW: zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 01:54:45
Ramses
Hallo Franz
Ich habe nicht umsonst gesagt, dass die Prozedur für die gesamte Mappe sehr aufwändig ist :-)
Kopier mal den Code in eine leere Mappe

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Cells(1, 1).Interior.ColorIndex = 3
MsgBox "alt"
End Sub


wechsle von einer Tabelle in die andere und achte darauf WELCHE Zelle nun rot wird.
Dann weisst du was ich meine, mit aufwändiger Programmierung. :-)
Gruss Rainer

AW: zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 04:09:36
fcs
Hallo Rainer,
diese kleine Variante färbt dann die Zelle A1 im deactivierten Blatt rot:

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Sh.Cells(1, 1).Interior.ColorIndex = 3
MsgBox "alt"
End Sub


Soviel zum Stichwort aufwändige Programmierung :-).
Das Problem bei Kekno's Wunsch war ja, dass die geänderte Zeilenhöhe auch mit Sicherheit vor dem Speichern wieder rückgängig gemacht wird. Auch dann wenn der Anwender nicht gleich wieder die Zeilenhöhe zurücksetzt. Das erforderte dann entsprechende zusätzliche Prüfroutinen.
Das war aber weniger ein Problem des Programmieraufwands als vielmehr rauszufinden bei welchen Aktivitäten die Zeilenhöhe zurückgesetzt werden muss.
Gruß
Franz

Anzeige
Gute Variante...
20.07.2007 11:05:42
Ramses
Hallo Franz
Dein Code funktioniert nicht ganz korrekt,... zumindest bei mir:
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
Die nächste Anweisung tritt NIE ein, wenn nicht die obere IF-Abfrage wahr ist.
Das wäre jedoch zwingend erforderlich, da sonst "lastRow" immer "Nothing" ist bei einem Sheet-Wechsel
Set lastRow = Selection
lastHeight = lastRow.RowHeight
lastRow.RowHeight = 2 * lastHeight
End If
Set lastRow = Selection
würde ich jedoch nicht nehmen, sondern "Target", da sich Selection auf die gesamte Auswahl bezieht und nicht auf die aktive Zelle. Dann wird der gesamte Markierungsbereich in der Zeilenhöhe verdopptelt und nicht nur die aktive Zelle/Zeile
Das zweite Problem tritt hier auf

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If Not lastRow Is Nothing Then
lastRow.RowHeight = lastHeight
Set lastRow = Nothing
End If
End Sub


Beim "Deactivate-Ereignis" leerst du die Variable "lastRow", aber diese wird nicht neu initialisiert mit einem "Activate"-Ereignis, demzufolge ist beim "Workbook_SheetSelectionChange" die Variable wieder "Nothing" und es kommt zu einem erneuten Fehler, da "LastRow" neu abgefragt wird aber nicht gefüllt ist.
Das passiert erst wenn du die "If-Abfrage" im "Workbook_SheetSelectionChange" Code änderst.
An das Sheet-Object habe ich nicht gedacht :-)
Dann müsste das dann jedoch so lauten


Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
If Not lastRow Is Nothing Then
With Sh.Cells(lastRow.Row, 1)
.RowHeight = lastHeight
End With
Set lastRow = Nothing
End If
End Sub


Gruss Rainer

Anzeige
AW: Gute Variante...
21.07.2007 08:54:00
fcs
Hallo Rainer,
keine Ahnung warum es bei dir nicht funktioniert. Bei mir unter EXCEL 97 läuft es perfekt .
Hast du evtl. die Variablen-Deklaration vor den Prozeduren vergessen mit zu kopieren?
Private lastRow As Range, lastHeight As Double
lastRow repräsentiert immer den Zellbereich der letzten Zeile also ein Objekt, nicht die Nummer der Zeile.
Wenn die Deklaration fehlt, dann interpretiert VBA lastRow als Typ Variant und da gibt es dann Probleme mit der Prüfung
If Not lastRow is Nothing then
da nur Objekt-Variablen den Wert/Zustand 'Nothing' haben können.
By the way: Target und Selection sind beim Start der Worksheet-Ereignismakros identisch.
Target ist nicht gleich der aktiven Zelle hierfür gibt es ja ActiveCell.
Probiere mal in einem leeren Blatt folgende Prozedur und selektiere verschiedene Zellbereiche

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
MsgBox "Target-Adresse: " & Target.Address & "  |  Selection-Adresse: " & Selection.Address
Target.Value = "Test"
End Sub


Deswegen ist es manchmal erforderlich Target zu überprüfen, ob es wirklich nur eine Zelle umfasst, oder auch alle Zellen von Target abzuarbeiten, wenn beim Change-Ereignis auch das Eintragen von Werten per Kopieren von mehreren Zellen oder Ziehen mit der Maus korrekt erfasst werden soll.
Gruß
Franz

Anzeige
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

Anzeige
AW: Gute Variante...
21.07.2007 11:57:45
fcs
Hallo Rainer,
schau noch einmal in Kekno's ürsprüngliche Frage:
Die Änderung der Zeilenhöhe soll dann erfolgen/zurückgesetzt werden, wenn links im Tabellenblatt auf den Zeilenkopf (die Nummer) der Zeile geklickt wird, also die gesamte Zeile markiert/selektiert wird.
Diesen Zustand prüfe ich mit

Case Else
If Target.Cells.Count = Sh.Columns.Count Then


bzw. wie du korrekter Weise anmerkst prüfe ich ob die Zahl der Zellen in Target gleich der Anzahl Spalten im Blatt ist.
Folgende Anpassung beseitigt auch diesen kleinen Bug.


Case Else
If Target.Cells.Count = Sh.Columns.Count And Target.Rows.Count = 1 Then
'oder auch
Case Else
If Target.Cells.Count = Target.EntireRow.Cells.Count And Target.Rows.Count = 1 Then


Ich hoffe damit sind alle Unklarheiten beseitigt.
Evtl. gibt es ja auch noch eine elegantere Möglichkeit in VBA auszuwerten, dass exakt eine Tabellenzeile Selektiert/markiert ist.
Gruß
Franz

Anzeige
AW: Gute Variante...
21.07.2007 12:25:15
Ramses
Hallo Franz
Das mit dem Klick auf den Zeilenkopf habe ich dann wohl nicht richtig gelesen.
Ich hatte das so interpretiert, dass bei Auswahl einer Zelle !! die Zeilenhöhe verändert wird zur Vedeutlichung, und bei Klick auf den Zeilenkopf das ganze wieder zurückgesetzt wird.
OK, danke für die Aufklärung, war aber trotzdem interessant und lehrreich :-)
Gruss Rainer

AW: zeilenhöhe per klick auf zeilenkopf verändern
20.07.2007 01:49:13
kekno
vielen dank an alle, die sich die mühe gemacht haben!
ich bin begeistert über die zugegangenen lösungsvarianten. ich werde alles durchtesten, sobald ich ein wenig weniger müde bin. gruß an alle nachtschwärmer!
kekno
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige