VBA: tekst naar nummer converteren

Ik heb kolommen met getallen die, om welke reden dan ook, zijn opgemaakt als tekst. Hierdoor kan ik geen rekenfuncties gebruiken, zoals de subtotaalfunctie. Wat is de beste manier om deze “tekstnummers” om te zetten in echte getallen?

Hier is een screenshot van het specifieke probleem:

Ik heb deze fragmenten zonder resultaat geprobeerd:

Columns(5).NumberFormat = "0"

en

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

Antwoord 1, autoriteit 100%

Gebruik de onderstaande functie (verander [E:E]in het juiste bereik voor uw behoeften) om dit probleem te omzeilen (of verander naar een ander formaat zoals “mm/dd/jjjj”) :

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

P.S. In mijn ervaring werkt deze VBA-oplossing AANZIENLIJK sneller op grote datasets en is het minder waarschijnlijk dat Excel crasht dan bij het gebruik van de ‘warning box’-methode.


Antwoord 2, autoriteit 34%

Dit kan worden gebruikt om alle numerieke waarden (zelfs die zijn opgemaakt als tekst) in een blad te vinden en ze naar enkelvoudig te converteren (CSng-functie).

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

Antwoord 3, autoriteit 31%

Ik had dit probleem eerder en dit was mijn oplossing.

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

Antwoord 4, autoriteit 11%

Dit converteert alle tekst in kolommen van een Excel-werkmap naar getallen.

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

Antwoord 5, autoriteit 3%

De oplossing die voor mij werkt is:

For Each xCell In Selection
  xCell.Value = CDec(xCell.Value)
Next xCell 

Antwoord 6, autoriteit 3%

Met het bovenstaande antwoord van aLearningLady kunt u uw selectiebereik dynamisch maken door te zoeken naar de laatste rij met gegevens erin in plaats van alleen de hele kolom te selecteren.

De onderstaande code werkte voor mij.

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

Antwoord 7, Autoriteit 3%

''Convert text to Number with ZERO Digits and Number convert ZERO Digits  
Sub ZERO_DIGIT()
 On Error Resume Next
 Dim rSelection As Range
 Set rSelection = rSelection
 rSelection.Select
 With Selection
  Selection.NumberFormat = "General"
  .Value = .Value
 End With
 rSelection.Select
  Selection.NumberFormat = "0"
 Set rSelection = Nothing
End Sub
''Convert text to Number with TWO Digits and Number convert TWO Digits  
Sub TWO_DIGIT()
 On Error Resume Next
 Dim rSelection As Range
 Set rSelection = rSelection
 rSelection.Select
 With Selection
  Selection.NumberFormat = "General"
  .Value = .Value
 End With
 rSelection.Select
  Selection.NumberFormat = "0.00"
 Set rSelection = Nothing
End Sub
''Convert text to Number with SIX Digits and Number convert SIX Digits  
Sub SIX_DIGIT()
 On Error Resume Next
 Dim rSelection As Range
 Set rSelection = rSelection
 rSelection.Select
 With Selection
  Selection.NumberFormat = "General"
  .Value = .Value
 End With
 rSelection.Select
  Selection.NumberFormat = "0.000000"
 Set rSelection = Nothing
End Sub

Antwoord 8

Voor grote datasets is een snellere oplossing vereist.

Gebruik van ‘tekst naar kolomken’ functionaliteit biedt een snelle oplossing.

Voorbeeld op basis van kolom F, startbereik op 25 naar 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

Other episodes