it-swarm.com.de

VBA: Konvertieren Sie Text in Zahl

Ich habe Spalten mit Zahlen, die aus irgendeinem Grund als Text formatiert sind. Dies hindert mich daran, arithmetische Funktionen wie die Zwischensummenfunktion zu verwenden. Was ist der beste Weg, um diese "Textnummern" in echte Zahlen umzuwandeln?

Hier ist ein Screenshot des spezifischen Problems:  Error

Ich habe diese Schnipsel ohne Erfolg ausprobiert:

Columns(5).NumberFormat = "0"

und

 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
9
aLearningLady

Verwenden Sie die folgende Funktion (Ändern von [E:E] in den für Ihre Bedürfnisse geeigneten Bereich), um dieses Problem zu umgehen (oder in ein anderes Format wie "mm/tt/jjjj"): 

[E:E].Select
With Selection
    .NumberFormat = "General"
    .Value = .Value
End With

P.S. Nach meiner Erfahrung arbeitet diese VBA-Lösung bei großen Datensätzen SIGNIFICANT schneller und es ist unwahrscheinlicher, dass Excel abstürzt, als mit der "Warnfeld" -Methode. 

23
aLearningLady

Hiermit können alle numerischen Werte (auch als Text formatierte Werte) in einem Arbeitsblatt gesucht und in einzelne Werte konvertiert werden (Funktion CSng).

For Each r In Sheets("Sheet1").UsedRange.SpecialCells(xlCellTypeConstants)
    If IsNumeric(r) Then
       r.Value = CSng(r.Value)
       r.NumberFormat = "0.00"
    End If
Next
6
Jones

Ich hatte dieses Problem früher und dies war meine Lösung.

With Worksheets("Sheet1").Columns(5)
    .NumberFormat = "0"
    .Value = .Value
End With
4
BerticusMaximus

Dadurch wird der gesamte Text in Spalten einer Excel-Arbeitsmappe in Zahlen konvertiert.

Sub ConvertTextToNumbers()
Dim wBook As Workbook
Dim LastRow As Long, LastCol As Long
Dim Rangetemp As Range

'Enter here the path of your workbook
Set wBook = Workbooks.Open("yourWorkbook")
LastRow = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastCol = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

For c = 1 To LastCol
Set Rangetemp = Cells(c).EntireColumn
Rangetemp.TextToColumns DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 1), TrailingMinusNumbers:=True
Next c
End Sub
3
ConertVBA

Die Lösung, die für mich funktioniert, ist:

For Each xCell In Selection

  xCell.Value = CDec(xCell.Value)

Next xCell 
1
Camilo Vargas

Wenn Sie die Antwort von aLearningLady verwenden, können Sie den Auswahlbereich dynamisieren, indem Sie nach der letzten Zeile mit Daten suchen und nicht nur die gesamte Spalte auswählen.

Der folgende Code hat für mich funktioniert.

Dim lastrow as Integer

lastrow = Cells(Rows.Count, 2).End(xlUp).Row

Range("C2:C" & lastrow).Select
With Selection
    .NumberFormat = "General"
    .Value = .Value
End With
0
Mikey

Für große Datensätze ist eine schnellere Lösung erforderlich.

Die Verwendung der 'Text to Columns'-Funktion bietet eine schnelle Lösung.

Beispiel basierend auf Spalte F, Startbereich bei 25 bis LastRow 

Sub ConvTxt2Nr()

Dim SelectR As Range
Dim sht As Worksheet
Dim LastRow As Long

Set sht = ThisWorkbook.Sheets("DumpDB")

LastRow = sht.Cells(sht.Rows.Count, "F").End(xlUp).Row

Set SelectR = ThisWorkbook.Sheets("DumpDB").Range("F25:F" & LastRow)

SelectR.TextToColumns Destination:=Range("F25"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 1), TrailingMinusNumbers:=True

End Sub
0
Louis