Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1856to1860
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

VBA code- Anpassen der Spaltenbreite

VBA code- Anpassen der Spaltenbreite
23.11.2021 15:14:09
Hannes
Hallo zusammen,
Ich habe mir mit folgender Formel das zusammengebastelt, was ich brauche. Dabei sollen die Zellen nach Auswahl größer werden, damit das Drop Down Menü voll angezeigt wird (Größe der Spalte dann wie zu erkennen bei 20) und daraufhin soll sich die Spaltenbreite an den Inhalt anpassen (Je nachdem was dann aus dem drop down menü ausgewählt wird). Wie in dem Code zu erkennen bezieht sich das Makro nur auf Spalte eins (Spalte A). Leider verzweifle ich daran den Code so umzuschreiben, dass er auf alle Spalten in meiner Arbeitsmappe angewendet wird. Ich würde mich freuen, wenn mir da einer weiterhelfen könnte. Ich hoffe ich konnte mein Problem einigermaßen schildern... ein misslungener versuch ist zum beispiel mit range zu arbeiten, da ich dort immer aufgrund falscher schreibweise fehlermeldungen bekommen hab.
Mein Code ist wie folgt:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Column = 1 Then
Target.Columns.ColumnWidth = 20
Else
Columns(1).EntireColumn.AutoFit
End If
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Hm... dann neu ...
23.11.2021 15:28:08
Pierre
Hallo Hannes,
wenngleich du noch einen anderen Thread am Laufen hattest...
Versuch mal diesen Code im Modul des Tabellenblattes:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer                                                        'Schleifenzähler
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column     'Spalte A bis zur letzten genutzten
If Cells(1, i).Value  "" Then                                     'wenn etwas in Zeile 1 eingetragen wird, dann
Columns(i).ColumnWidth = Cells(1, i).Value                      'Wert aus Zeile 1 als Spaltenbreite verwenden
ElseIf Cells(1, i).Value = "" Or Cells(1, i).Value > "200" Then     'wenn nichts oder eine zu hohe Zahl eingetragen wird,
Columns(i).ColumnWidth = 10.71                                  'dann Standardbreite
End If
Next i                                                                  'nächste Zeile
End Sub

Anzeige
schon wieder was vergessen:
23.11.2021 15:32:17
Pierre
meinen Code zusätzlich zu dem, den du bereits von Rudi hattest.
Wenn beide zusammen laufen, dann passiert eigentlich das, was du wolltest.
Bei Klick in (z. B.) A1 wird die Spalte auf 20Punkt "gedehnt", wenn du einen Wert aus dem Dropdown auswählst, wird diese Breite genommen.
Klickst du dann in eine andere Spalte, bleibt A1 auf dem ausgewählten Wert, bis du dann wieder in A1 klicken würdest. Für diesen Klick würde die Breite wieder geändert auf 20. Danach wie gehabt auf die Breite, die du aus der Liste wählst, usw.
Gruß Pierre
Änderung (sorry, ich lese manchmal nicht richtig)
23.11.2021 15:38:48
Pierre

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer                                                        'Schleifenzähler
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column     'Spalte A bis zur letzten genutzten
If Cells(1, i).Value  "" Then                                     'wenn etwas in Zeile 1 eingetragen wird, dann
Columns(i).EntireColumn.AutoFit                                 'Wert aus Zeile 1 als Spaltenbreite verwenden
ElseIf Cells(1, i).Value = "" Or Cells(1, i).Value > "200" Then     'wenn nichts oder eine zu hohe Zahl eingetragen wird,
Columns(i).ColumnWidth = 10.71                                  'dann Standardbreite
End If
Next i                                                                  'nächste Zeile
End Sub
So aber...das andere reagiert auf Zahlen, die in Zeile 1 stehen.
Anzeige
AW: Änderung (sorry, ich lese manchmal nicht richtig)
23.11.2021 16:13:57
Hannes
Hallo Piere,
Ich danke Vielmals, es KLAPPT!! Allerdings habe ich jetzt extrem lange Ladezeiten :/ ..... Ich denke, dass es dafür keine Lösung geben wird oder? Kann man den Code evtl irgendwie vereinfachen oder etwas in excel umstellen?
folgender Code macht genau das was ich will:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
Select Case Target.Column
Case 1 To 80
Target.ColumnWidth = 20
Case Else
Range(Columns(1), Columns(80)).EntireColumn.AutoFit
End Select
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer                                                        'Schleifenzähler
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column     'Spalte A bis zur letzten genutzten
If Cells(1, i).Value  "" Then                                     'wenn etwas in Zeile 1 eingetragen wird, dann
Columns(i).EntireColumn.AutoFit                                 'Wert aus Zeile 1 als Spaltenbreite verwenden
ElseIf Cells(1, i).Value = "" Or Cells(1, i).Value > "200" Then     'wenn nichts oder eine zu hohe Zahl eingetragen wird,
Columns(i).EntireColumn.AutoFit
End If
Next i                                                                  'nächste Zeile
End Sub

Anzeige
bitteschön ... und:
23.11.2021 16:21:15
Pierre
Hallo Hannes,
ich hatte versucht, beide Codes zu verknüpfen, was mir aber nicht gelungen ist.
Allgemein kann man teilweise die Geschwindigkeit erhöhen, indem man "Application.Screenupdating = False" ganz an den Anfang setzt (Direkt unter dem "Private Sub").
Da aber unbedingt vor "End Sub" wieder "Application.Screenupdating = True" schreiben.
Genauso mit Application.Calculation = xlCalculationManual (glaube ich)...
Bei allen diesen Dingen aber unbedingt darauf achten, dass diese Änderung zum Schluss wieder rückgängig gemacht wird.
Kannst ja mal danach googlen, da findest du jede Menge ;-)
Ansonsten KÖNNTE es schneller gehen, da müsste aber wohl jemand anderes ran.
Ich komme jedenfalls heute nicht mehr dazu.
Gruß Pierre
Anzeige
AW: bitteschön ... und:
24.11.2021 08:48:56
Hannes
Hallo Piere,
Ich danke vielmals für deine Bemühungen.
Ich muss allerdings nochmal ein Frage stellen, da mir bei der Bearbeitung der der Tabelle aufgefallen ist, dass ab Spalte 25 keine automatische Anpassung der Breite mehr erfolgt. Ich kann da keinen Fehler finden der dafür verantwortlich ist.
Gruß Hannes
AW: bitteschön ... und:
24.11.2021 11:54:10
Pierre
Hallo Hannes,
bei mir funktioniert alles, kann ich so also nicht nachvollziehen...
Kannst du bitte deine Mappe mal hochladen, in der es nicht geht? Daten anonymisieren.
Gruß Pierre
AW: bitteschön ... und:
24.11.2021 13:31:14
Hannes
Hallo Pierre,
ich hoffe das mit dem Upload hat geklappt.
Nach Anonymiseiren, klappt es komischerweise nur noch in der ersten Spalte.
Kann man den Code eigentlich auch so umschreiben, dass sich nach verlassen der einer Zelle die Spaltenbreite automatisch anpasst, oder ist es nur möglich, nachdem man eine Eingabe getätigt hat(so wie es jetzt ist)?
Gruß Hannes
Anzeige
AW: bitteschön ... und:
24.11.2021 14:13:27
Pierre
Hallo Hannes,
habe in der Zwischenzeit den Code angepasst.
Du musst mal alles löschen, was du aktuell als Code verwendest und stattdessen den folgenden einfügen:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.ColumnWidth = 20
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
For i = 1 To Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
If Cells(1, i).Value  "" Then
Columns(i).EntireColumn.AutoFit
ElseIf Cells(1, i).Value = "" Then
Columns(i).ColumnWidth = 10.71
End If
Next i
End Sub
Die Breite auf 20 zu stellen muss mit SelectionChange gemacht werden, die anderen Anpassungen mit Change.
-------------
zu deinem anderen Problem...es könnte sein, dass Spalte 25 (also Y) deine letzte beschriebene Spalte ist und deswegen der Code ab Spalte Z nicht mehr richtig funktioniert.
Aber ohne Mappe könnte ich da nur raten.
Ne Idee (nicht unbedingt schön, aber würde gehen): Deine Datenliste, die für das Dropdown herhalten soll, in die nächste Spalte rechts von der, die du zuletzt tatsächlich nutzen möchstest, bzw. in der das Makro tatsächlich laufen soll. (Also Makro soll z. B. bis Spalte Z funktionieren, dann Datenliste in Spalte AA packen).
Die Spalte mit der Datenliste könntest du ja ausblenden.
Gruß Pierre
Anzeige
kleine Anpassung
24.11.2021 14:24:49
Pierre
Statt:

ElseIf Cells(1, i).Value = "" Then
Columns(i).ColumnWidth = 10.71
reicht das hier:

Else: Columns(i).ColumnWidth = 10.71

147 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige