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

VBA: Optimale Breite eines Bereiches

Forumthread: VBA: Optimale Breite eines Bereiches

VBA: Optimale Breite eines Bereiches
08.12.2012 13:46:24
WalterK
Hallo,
Wie kann ich die optimale Spaltenbreite in einem bestimmten Bereich einstellen?
Ich möchte in den Bereichen D120:H500 sowie K120:M500 und Z120:Z500 die optimale Spaltenbreite einstellen lassen, wobei zur Ermittlung der optimalen Spaltenbreite nur die Zellen in diesen Bereichen herangezogen werden sollen.
Besten Dank für die Hilfe und Servus, Walter

Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 14:24:15
Daniel
Hi
da würde ich die Zellinhalte an eine freie Stelle der Tabelle kopieren, oder mit der Auto-Funktion die Optimale Spaltenbreite ermitteln und dann die Spaltenbreiten von dort in den alten Bereich zurückkopieren.
das ist möglich mit der Funktion "Inhalte Einfügen - Werte"
als Marko siehts das dann so aus:
Sub spb()
Dim arr, a
Dim sp As Long, ze As Long
sp = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column + 2
arr = Array("D120:H500", "K120:M500", "Z120:Z500")
For Each a In arr
With Cells(Range(a).Row, sp)
Range(a).Copy
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
With .Resize(, Range(a).Columns.Count).EntireColumn
.AutoFit
.Copy
Cells(1, Range(a).Column).PasteSpecial xlPasteColumnWidths
.Delete
End With
End With
Next
End Sub
Gruß Daniel

Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 17:06:44
WalterK
Hallo Daniel,
Deine Version gefällt mir sehr gut.
Eine Frage hätte ich noch: Wenn ich den Code mehrmals im gleichen Blatt ausführe verschiebt sich der Bereich für die Zwischenlagerung immer weiter nach rechts.
Könnte man es so ändern, dass sich dieser Zwischenbereich immer einige Spalten nach der letzten benutzten Spalte befindet und dort bleibt.
Besten Dank jedenfalls für Deine Hilfe, Servus Walter

Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 17:20:06
Daniel
Hi
wenn deine Tabelle immer die gleichen Anzahl spalten hat und sich das nicht ändert, dann kannst du den Wert für die Spalte auch fix vergeben, dh einfach:
sp = 20
der Wert muss halt grösser sein als die letzte befüllte Spalte
Gruß Daniel

AW: VBA: Optimale Breite eines Bereiches
08.12.2012 17:42:02
WalterK
Hallo Daniel,
die Anzahl der Spalten kann sich laufend ändern, eine fixe Vorgabe ist daher nicht möglich.
Eine Möglichkeit wäre, jeweils die betreffende Spaltenanzahl von der maximalen Spaltenanzahl 256 (Anzahl der Spalten in Excel 2003) abzuziehen und diese Spalte dann als sp zu benutzen. Dafür müsste man mir allerdings behilflich sein, das kann ich selbst in VBA nicht umsetzen.
Besten Dank und Servus, Walter

Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 17:48:00
Daniel
Hi
sp = 256 - Range(a).Columns.Count
das muss dann allerdings innerhalb der For Each a in ... Schleife positioniert werden.
Gruß Daniel

Perfekt, besten Dank Daniel! Servus, Walter
08.12.2012 17:53:31
WalterK

AW: VBA: Optimale Breite eines Bereiches
08.12.2012 14:26:02
schauan
Hallo Walter,
vielleicht gibt es eine intelligente Lösung - ich würde z.B. D120:H500 in ein temporäres Blatt kopieren bzw. mit Tabelle2.xxx.Value = D120:H500.value übernehmen, dort mit autofit die optimale breite feststellen und diese dann zurück übertragen und am Ende das temporäe Blatt löschen.
Bislang kenne ich Autofit nur auf eine ganze Spalte bezogen, und da hilft auch nicht das Ausblenden nicht benötigter Bereiche :-(
Wenn man die Vorgehensweise von Excel beim Autofit nachstellt, könnte man das auch zellbezogen tun :-) Beim Autofit scheint Excel jede einzelne Zelle zu prüfen - man merkt's, wenn die Datenbereiche größer werden :-( Ich hab mal in einem Projekt, wo in einer bestimmten Zelle garantiert immer die größte Breite anzutreffen war, nur diese temporär gefittet (damals allerdings mit einer Textbox) und davon den Wert übernommen.
Eventuell kannst Du aber auch eine Breite vordefinieren, die alle Eventualitäten berücksichtigt. Würde sich vielleicht auch besser machen, als wenn sich die Breite nach Datenänderungen immer wieder ändert.
Aber wie gesagt, vielleicht gibt's eine intelligentere Lösung ...
Grüße, André

Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 14:39:32
Tino
Hallo,
Du könntest bei den anderen Zellen die Werte über die Formateinstellung ausblenden und
danach die Breite festlegen, danach die Formateinstellung zurücksetzen.
Voraussetzung ist im Beispiel unten, die einzelnen Spalten haben habe in der Spalte
keine unterschiedliche Formateinstellungen.
Sub Test()
Dim rng As Range, rngTmp As Range
Dim sFormat$, objTab As Worksheet

Set rng = Tabelle1.Range("D120:H500,K120:M500,Z120:Z500")
Set objTab = Sheets(rng.Parent.Name)
For Each rng In rng.Columns
    With rng
        Set rngTmp = objTab.Range(objTab.Cells(1, .Column), .Cells(1, 1).Offset(-1, 0))
        Set rngTmp = Union(objTab.Range(.Cells(.Rows.Count, 1).Offset(1, 0), objTab.Cells(objTab.Rows.Count, .Column)), rngTmp)
        sFormat = .Cells(.Rows.Count, 1).NumberFormat
        rngTmp.NumberFormat = ";;;"
        rngTmp.EntireColumn.AutoFit
        rngTmp.NumberFormat = sFormat
    End With
Next rng
Gruß Tino

Anzeige
AW: VBA: Optimale Breite eines Bereiches
08.12.2012 14:50:22
schauan
Hallo Tino,
super Lösung - es gibt ja doch was intelligentes ;-)
Grüßem André

AW: VBA: Optimale Breite eines Bereiches
08.12.2012 16:39:27
Daniel
kommt darauf an.
das Problem bei der Lösung von Tino ist, daß in den Zellen, die außerhalb des Bereichs liegen, nach dem Makrolauf alle Zahlen das gleiche Zahlenformat haben!
dh wenn ausserhalb des angebenen Bereichs noch Zahlen mit unteschiedlichen Zahlenformaten innerhalb einer Spalte stehen, dann gehts so nicht, bzw du musst nachträglich die Zahlenformate wieder herstellen.
Gruß Daniel

Anzeige
AW: VBA: Optimale Breite eines Bereiches
09.12.2012 12:08:23
schauan
Hallo zusammen,
vielleicht kann man auch beide Lösungen kombinieren...
Sub AutoFitZellen()
'Makro zur Festlegung der optimalen Spaltenbreite anhand eines 
'definierten Bereiches mit Hilfe eines temporaeren Blattes 
'Hinweis: 
'ggf. vorher calculation, events, alerts und screenupdating ruecksetzen! 
'Variablendeklarationen 
'Range 
Dim rng As Range, rngCol As Range, rngTmp As Range
'Worksheet 
Dim objTab As Worksheet
'String-Konstante (Name vom Originalblatt) 
Const strOrig As String = "Tabelle1"
  'Originalblatt ans Ende kopieren 
  Sheets(strOrig).Copy After:=Sheets(Sheets.Count)
  'Tabellenblatt dem Objekt zuweisen 
  Set objTab = Sheets(Sheets.Count)
  'zu bearbeitenden Bereich festlegen 
  Set rng = objTab.Range("D120:H500,K120:M500,Z120:Z500")
  'Schleife ueber jede Spalte im rng 
  For Each rngCol In rng.Columns
    'Mit dem Rng 
    With rngCol
        'Bereich ueber dem rng festlegen - 
        'Optimierungsbedarf: Pruefen, ob da auch was drueber ist 
        Set rngTmp = objTab.Range(objTab.Cells(1, .Column), .Cells(1, 1).Offset(-1, 0))
        'Bereich unter dem rng festlegen - 
        'Optimierungsbedarf: Pruefen, ob da auch was drunter ist 
        Set rngTmp = Union(objTab.Range(.Cells(.Rows.Count, 1).Offset(1, 0), objTab.Cells(objTab.Rows.Count, .Column)), rngTmp)
        'Format "nix anzeigen" setzen 
        rngTmp.NumberFormat = ";;;"
        'Spaltenbreite automatisch optimieren 
        rngTmp.EntireColumn.AutoFit
        'Spaltenbreite auf Originalblatt uebertragen 
        Sheets(strOrig).Columns(.Column).ColumnWidth = objTab.Columns(.Column).ColumnWidth
        'End With 
    'Ende Mit dem Rng 
    End With
  'Ende Schleife ueber jede Spalte im rng 
  Next
  'Blattobjekt zuruecksetzen 
  Set objTab = Nothing
  'Meldungen ausschalten 
  Application.DisplayAlerts = False
  'temporaeres Blatt loeschen 
  Sheets(Sheets.Count).Delete
  'Meldungen einschalten - waren die denn vorher ein? 
  Application.DisplayAlerts = True
End Sub

Hoffe geholfen zu haben
Grüße von André aus G in T (xls 97-2013)

Anzeige
AW: VBA: Optimale Breite eines Bereiches
09.12.2012 12:32:28
WalterK
Hallo André,
besten Dank auch für Deine Lösung, funktioniert einwandfrei.
Servus, Walter

Besten Dank an alle Helfer, Servus Walter
08.12.2012 15:18:10
WalterK
Anzeige

Infobox / Tutorial

Optimale Spaltenbreite in Excel mit VBA einstellen


Schritt-für-Schritt-Anleitung

Um die optimale Spaltenbreite in einem bestimmten Bereich mit VBA einzustellen, kannst du folgenden Code verwenden. Dieser Code passt die Spaltenbreite in den Bereichen D120:H500, K120:M500 und Z120:Z500 an:

Sub spb()
    Dim arr, a
    Dim sp As Long
    sp = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Column + 2
    arr = Array("D120:H500", "K120:M500", "Z120:Z500")

    For Each a In arr
        With Cells(Range(a).Row, sp)
            Range(a).Copy
            .PasteSpecial xlPasteValues
            .PasteSpecial xlPasteFormats
            With .Resize(, Range(a).Columns.Count).EntireColumn
                .AutoFit
                Copy
                Cells(1, Range(a).Column).PasteSpecial xlPasteColumnWidths
                .Delete
            End With
        End With
    Next
End Sub

Dieser VBA-Code verwendet die AutoFit-Funktion, um die optimale Breite der Spalten basierend auf dem Inhalt zu bestimmen.


Häufige Fehler und Lösungen

  • Problem: Der Zwischenbereich verschiebt sich bei mehrmaliger Ausführung des Makros.

    • Lösung: Setze die Spalte für den Zwischenbereich fest, indem du sp = 20 verwendest, wenn die Anzahl der Spalten konstant bleibt.
  • Problem: Die Formatierung der Zellen außerhalb des angepassten Bereichs wird verändert.

    • Lösung: Achte darauf, die ursprünglichen Formate nach dem Autofit wiederherzustellen.

Alternative Methoden

Eine andere Möglichkeit zur Ermittlung der optimalen Spaltenbreite ist das Kopieren der Zellinhalte in ein temporäres Blatt. Dort kannst du die AutoFit-Funktion verwenden und die Breiten dann zurück in das Originalblatt übertragen. Hier ein Beispiel:

Sub AutoFitZellen()
    Dim rng As Range, rngCol As Range, rngTmp As Range
    Dim objTab As Worksheet
    Const strOrig As String = "Tabelle1"

    Sheets(strOrig).Copy After:=Sheets(Sheets.Count)
    Set objTab = Sheets(Sheets.Count)
    Set rng = objTab.Range("D120:H500,K120:M500,Z120:Z500")

    For Each rngCol In rng.Columns
        With rngCol
            Set rngTmp = objTab.Range(objTab.Cells(1, .Column), .Cells(.Rows.Count, .Column))
            rngTmp.NumberFormat = ";;;""""" 
            rngTmp.EntireColumn.AutoFit
            Sheets(strOrig).Columns(.Column).ColumnWidth = objTab.Columns(.Column).ColumnWidth
        End With
    Next
    Application.DisplayAlerts = False
    Sheets(Sheets.Count).Delete
    Application.DisplayAlerts = True
End Sub

Praktische Beispiele

In der Praxis kannst du mit den oben genannten VBA-Skripten die automatische Spaltenbreite in Excel für verschiedene Bereiche anpassen. Diese Methoden sind besonders nützlich, wenn du regelmäßig Daten importierst und die Spaltenbreiten manuell anpassen musst.


Tipps für Profis

  • Nutze die Tastenkombination Alt + H + O + I für die automatische Spaltenbreite, wenn du nur ein paar Spalten anpassen möchtest.
  • Für größere Bereiche ist es effizienter, ein Makro zu verwenden, um die optimale Spaltenbreite für mehrere Spalten gleichzeitig einzustellen.
  • Experimentiere mit dem xlCellTypeLastCell, um dynamisch die letzte benutzte Spalte zu finden.

FAQ: Häufige Fragen

1. Wie kann ich die optimale Spaltenbreite für alle Spalten in einem Arbeitsblatt einstellen?
Du kannst die Tastenkombination Strg + A verwenden, um alle Zellen auszuwählen, und dann Alt + H + O + I drücken, um die Breite automatisch anzupassen.

2. Gibt es eine Möglichkeit, die Spaltenbreite für bestimmte Spalten nur temporär zu ändern?
Ja, du kannst die Spaltenbreite anpassen und anschließend die alte Breite speichern, um sie später wiederherzustellen.

3. Funktioniert dieses Makro in allen Excel-Versionen?
Das oben genannte VBA-Skript funktioniert in den meisten Excel-Versionen, einschließlich Excel 2003 bis 2016 und neueren Versionen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige