Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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
Anzeige
Ä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
Anzeige
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

;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Spaltenbreite in Excel automatisch anpassen mit VBA


Schritt-für-Schritt-Anleitung

Um die Spaltenbreite in Excel automatisch anzupassen, kannst du VBA (Visual Basic for Applications) verwenden. Folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Suche nach dem Arbeitsblatt, in dem du die Spaltenbreite anpassen möchtest.

  3. Füge den folgenden Code in das Modul des Arbeitsblatts ein:

    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
           Else
               Columns(i).ColumnWidth = 10.71
           End If
       Next i
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Teste den Code, indem du Werte in die erste Zeile eingibst. Die Spaltenbreite sollte sich automatisch entsprechend der Inhalte anpassen.


Häufige Fehler und Lösungen

  • Fehler: Spalte wird nicht angepasst
    Lösung: Stelle sicher, dass der Code im richtigen Modul eingefügt wurde. Der Code sollte im Modul des spezifischen Arbeitsblatts platziert werden.

  • Fehler: Lange Ladezeiten
    Lösung: Füge Application.ScreenUpdating = False am Anfang des Codes ein und Application.ScreenUpdating = True am Ende, um die Verarbeitungsgeschwindigkeit zu erhöhen.


Alternative Methoden

Wenn du keine VBA-Lösungen verwenden möchtest, kannst du auch die integrierten Excel-Funktionen nutzen:

  • Manuelle Anpassung: Wähle die Spalten aus, klicke mit der rechten Maustaste und wähle „Spaltenbreite anpassen“.
  • Shortcut für automatische Spaltenbreite: Drücke ALT + H, dann O, gefolgt von I, um die Spaltenbreite automatisch anpassen zu lassen.

Praktische Beispiele

  1. Automatische Anpassung für mehrere Spalten:

    Um die Breite mehrerer Spalten gleichzeitig anzupassen, kannst du den folgenden Code verwenden:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       Target.EntireColumn.AutoFit
    End Sub

    Dieser Code passt die Breite der Spalte an, wenn du die Zelle auswählst.

  2. VBA für Dropdown-Listen:

    Wenn du eine Dropdown-Liste verwendest und die Breite anpassen möchtest, kombiniere die vorherigen Codes:

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

Tipps für Profis

  • Verwende With-Anweisungen: Um den Code effizienter zu gestalten, kannst du With-Anweisungen nutzen, um wiederholte Objekte zu referenzieren.

  • Fehlerbehandlung: Füge Fehlerbehandlungsroutinen hinzu, um unerwartete Fehler zu erkennen und zu beheben.

  • Dokumentation: Kommentiere deinen Code gut, damit er für andere (oder dich selbst in der Zukunft) verständlich bleibt.


FAQ: Häufige Fragen

1. Wie kann ich die Spaltenbreite für alle Spalten in einem Arbeitsblatt anpassen?
Verwende den Code Columns.AutoFit innerhalb einer Schleife, um alle Spalten automatisch anzupassen.

2. Gibt es einen Shortcut, um die Spaltenbreite schnell anzupassen?
Ja, drücke ALT + H, dann O, gefolgt von I, um die Spaltenbreite automatisch anzupassen.

3. Kann ich die Spaltenbreite auch so anpassen, dass sie dem längsten Text in einer Zelle entspricht?
Ja, das wird durch den Befehl AutoFit in VBA erreicht, der die Breite basierend auf dem Inhalt anpasst.

4. Wie kann ich die Spaltenbreite in Excel VBA auf einen festen Wert setzen?
Verwende den Code Columns(i).ColumnWidth = 20, um die Spaltenbreite auf 20 festzulegen.

Durch das Implementieren der oben genannten Techniken kannst du die automatische Spaltenbreite in Excel effektiv verwalten und anpassen.

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