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