Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1288to1292
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: 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

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

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

Anzeige
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

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

Anzeige
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

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige