Discussion:
Format per VBA umwandeln
(zu alt für eine Antwort)
Heinz Müller
2008-10-13 18:24:01 UTC
Permalink
Hi,

ich möchte das Format eines Zahlenbereiches per VBA umwandeln, von z.b 68,35
auf 68 (ohne Nachkomestellen)
Ok, das ist eher Runden, aber mir geht es um das Prinzip, da ich nicht alle
VBA-Befehle kenne.

Ich habe das hier ( Ausschnitt ):

For spalte = 1 To spaltemax

For zeile = 1 To zeilemax

.Cells(zeile, spalte).Value = .Cells(zeile,
spalte).Value_und_hier_kommt_eventuell_noch_etwas_hin

Next zeile

Next spalte

Ich weiß, es fuktioniert nicht, aber wie geht's richtig.

Danke!

Gruß
Heinz
Claus Busch
2008-10-13 18:37:01 UTC
Permalink
Hallo Heinz,
Post by Heinz Müller
ich möchte das Format eines Zahlenbereiches per VBA umwandeln, von z.b 68,35
auf 68 (ohne Nachkomestellen)
Ok, das ist eher Runden, aber mir geht es um das Prinzip, da ich nicht alle
VBA-Befehle kenne.
[Code ausgeschnitten]

probiers mal so:
Sub FormatUmwandeln()

Dim maxSpalte As Integer
Dim maxZeile As Long

maxSpalte = Cells(1, Columns.Count).End(xlToLeft).Column
maxZeile = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(maxZeile, maxSpalte)).NumberFormat = "#,##0"

End Sub

--
Mit freundlichen Grüssen
Claus Busch
@Web-Interface

Windows XP SP2; Vista Ultimate
Office 2000 SP3; Office2007 Ultimate
Heinz Müller
2008-10-13 18:56:25 UTC
Permalink
Post by Claus Busch
[Code ausgeschnitten]
Sub FormatUmwandeln()
Dim maxSpalte As Integer
Dim maxZeile As Long
maxSpalte = Cells(1, Columns.Count).End(xlToLeft).Column
maxZeile = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(maxZeile, maxSpalte)).NumberFormat = "#,##0"
End Sub
--
Mit freundlichen Grüssen
Claus Busch
@Web-Interface
Wie nicht anders zu erwarten war: Es funktioniert!!!

Noch eine Zusatzfrage:

Wo ist der Unterschied zwischen:

maxSpalte = Cells(1, Columns.Count).End(xlToLeft).Column

und

spaltemax = .UsedRange.Columns.Count

Also nicht der Variablenname sondern das rechts daneben ;-)


Danke!

Heinz
Claus Busch
2008-10-13 19:08:49 UTC
Permalink
Hallo Heinz,
Post by Claus Busch
maxSpalte = Cells(1, Columns.Count).End(xlToLeft).Column
und
spaltemax = .UsedRange.Columns.Count
mit UsedRange kannst du Probleme bekommen, wenn z.B. deine Tabelle schon
größer war und beim Löschen der Zellen nicht "Alles" gelöscht wurde und
z.B. noch Formate drin stecken. Dann ist der UsedRange größer als deine
Tabelle.


Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Heinz Müller
2008-10-14 16:29:56 UTC
Permalink
Post by Claus Busch
Hallo Heinz,
Post by Claus Busch
maxSpalte = Cells(1, Columns.Count).End(xlToLeft).Column
und
spaltemax = .UsedRange.Columns.Count
mit UsedRange kannst du Probleme bekommen, wenn z.B. deine Tabelle schon
größer war und beim Löschen der Zellen nicht "Alles" gelöscht wurde und
z.B. noch Formate drin stecken. Dann ist der UsedRange größer als deine
Tabelle.
Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Habe das jetzt mal getestet und ja es stimmt. Befinden sich Formate in an
sich leeren Zellen,
zählt meine Variante auch diese Zellen mit. Aber deine Variante, so meine
ich, hat folgendes Problem:

Wenn ich in Zeile A 7 Zellen, B 7 Zellen aber C 9 Zellen habe, so zählt
deine Variante nur die 7 Zellen.
Denke mal das liegt an der 1 hier drin: Cells(1, Columns.Count). Gibt es
dafür auch eine Lösung?

Heinz
Claus Busch
2008-10-14 16:46:17 UTC
Permalink
Hallo Heinz,
Post by Heinz Müller
Habe das jetzt mal getestet und ja es stimmt. Befinden sich Formate in an
sich leeren Zellen,
zählt meine Variante auch diese Zellen mit. Aber deine Variante, so meine
Wenn ich in Zeile A 7 Zellen, B 7 Zellen aber C 9 Zellen habe, so zählt
deine Variante nur die 7 Zellen.
Denke mal das liegt an der 1 hier drin: Cells(1, Columns.Count). Gibt es
dafür auch eine Lösung?
wenn die einzelnen Spalten der Tabelle ungleich lang sind, dann musst du
natürlich in der längsten Spalte nach der letzten Zeile suchen (hier nun
für Spalte C):
LRow = Cells(Rows.Count,3).End(xlup).Row
oder
LRow = Cells(Rows.Count,"C").End(xlup).Row
oder
LRow = Range("C" & Rows.Count).End(xlup).Row


Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Heinz Müller
2008-10-14 17:24:13 UTC
Permalink
Post by Claus Busch
Hallo Heinz,
Post by Heinz Müller
Habe das jetzt mal getestet und ja es stimmt. Befinden sich Formate in an
sich leeren Zellen,
zählt meine Variante auch diese Zellen mit. Aber deine Variante, so meine
Wenn ich in Zeile A 7 Zellen, B 7 Zellen aber C 9 Zellen habe, so zählt
deine Variante nur die 7 Zellen.
Denke mal das liegt an der 1 hier drin: Cells(1, Columns.Count). Gibt es
dafür auch eine Lösung?
wenn die einzelnen Spalten der Tabelle ungleich lang sind, dann musst du
natürlich in der längsten Spalte nach der letzten Zeile suchen (hier nun
LRow = Cells(Rows.Count,3).End(xlup).Row
oder
LRow = Cells(Rows.Count,"C").End(xlup).Row
oder
LRow = Range("C" & Rows.Count).End(xlup).Row
Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Ok, verstanden. Aber angenommen ich weiß gar nicht welche Spalte bzw. Zeile
am längsten ist.
Bei bis 20 Spalten bzw. Zeilen geht das ja noch. Das kann ich ja sichten.
Aber irgendwann hört das
auch auf. Was dann?

Gruß
Heinz
Claus Busch
2008-10-14 17:50:53 UTC
Permalink
Hallo Heinz,
Post by Heinz Müller
Ok, verstanden. Aber angenommen ich weiß gar nicht welche Spalte bzw. Zeile
am längsten ist.
Bei bis 20 Spalten bzw. Zeilen geht das ja noch. Das kann ich ja sichten.
Aber irgendwann hört das
auch auf. Was dann?
berechne die letzte Spalte und lasse dann eine Schleife über sämtliche
Spalten laufen.
Folgender Code markiert dir deinen benutzen Bereich, gewissermaßen den
UsedRange:
Sub MeinBereich()

Dim LCol As Integer
Dim i As Integer
Dim LRow As Long
Dim Erg() As Integer
Dim MyUsedRange As Range

LCol = Cells(1, Columns.Count).End(xlToLeft).Column
For i = 1 To LCol
ReDim Preserve Erg(i - 1)
Erg(i - 1) = Cells(Rows.Count, i).End(xlUp).Row
Next
LRow = WorksheetFunction.Max(Erg)
Set MyUsedRange = Cells(1, 1).Resize(LRow, LCol)
MyUsedRange.Select

End Sub


Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Heinz Müller
2008-10-14 18:34:53 UTC
Permalink
Post by Claus Busch
Hallo Heinz,
Post by Heinz Müller
Ok, verstanden. Aber angenommen ich weiß gar nicht welche Spalte bzw. Zeile
am längsten ist.
Bei bis 20 Spalten bzw. Zeilen geht das ja noch. Das kann ich ja sichten.
Aber irgendwann hört das
auch auf. Was dann?
berechne die letzte Spalte und lasse dann eine Schleife über sämtliche
Spalten laufen.
Folgender Code markiert dir deinen benutzen Bereich, gewissermaßen den
Sub MeinBereich()
Dim LCol As Integer
Dim i As Integer
Dim LRow As Long
Dim Erg() As Integer
Dim MyUsedRange As Range
LCol = Cells(1, Columns.Count).End(xlToLeft).Column
For i = 1 To LCol
ReDim Preserve Erg(i - 1)
Erg(i - 1) = Cells(Rows.Count, i).End(xlUp).Row
Next
LRow = WorksheetFunction.Max(Erg)
Set MyUsedRange = Cells(1, 1).Resize(LRow, LCol)
MyUsedRange.Select
End Sub
Mit freundlichen Grüssen
Claus Busch
--
Win XP Prof SP3 / Vista Ultimate
Office 2003 SP3 / 2007 Ultimate SP1
Claus,

gerade mal getestet. Die Anzahl der Zeilen werden korrekt ermittelt. Die
Anzahl Spalten leider nicht.
.
Ich habe inzwischen das hier gefunden:
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0342.shtml

Sind ein paar nette Sachen bei.

Gruß
Heinz
Heinz Müller
2008-10-14 18:56:55 UTC
Permalink
Hallo Claus,

habe mal etwas im WWW gewühlt und deinen Vorschalg und einen weiteren
zusammen geführt:

Sub Lastkurz()

Dim LastCol As Integer, LastRow As Long

'ermitteln der letzten benutzten Zeile
lastcellrow = Cells.Find("*", , , , xlByRows, xlPrevious).Row

Debug.Print lastcellrow

'ermitteln der letzten benutzten Spalte
lastcellcol = Cells.Find("*", , , , xlByColumns, xlPrevious).Column

Debug.Print lastcellcol

Set MyUsedRange = Cells(1, 1).Resize(lastcellrow, lastcellcol)
MyUsedRange.Select

End Sub

Sieht nun ganz gut aus.

Gruß
Heinz

Loading...