J'ai des colonnes de chiffres qui, pour une raison quelconque, sont au format texte. Cela m'empêche d'utiliser des fonctions arithmétiques telles que la fonction de sous-total. Quel est le meilleur moyen de convertir ces "numéros de texte" en nombres vrais?
Voici une capture d'écran du problème spécifique:
J'ai essayé ces extraits en vain:
Columns(5).NumberFormat = "0"
et
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Utilisez la fonction ci-dessous (remplacez [E:E]
par la plage appropriée à vos besoins) pour contourner ce problème (ou utilisez un autre format tel que "mm/jj/aaaa"):
[E:E].Select
With Selection
.NumberFormat = "General"
.Value = .Value
End With
P.S. D'après mon expérience, cette solution VBA fonctionne considérablement plus rapidement sur des ensembles de données volumineux et est moins susceptible de provoquer un blocage d'Excel que l'utilisation de la méthode de la "boîte d'avertissement".
Ceci peut être utilisé pour trouver toutes les valeurs numériques (même celles formatées en texte) dans une feuille et les convertir en simple (fonction 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
J'ai eu ce problème plus tôt et c'était ma solution.
With Worksheets("Sheet1").Columns(5)
.NumberFormat = "0"
.Value = .Value
End With
Ceci convertit tout le texte des colonnes d'un classeur Excel en nombres.
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
La solution qui fonctionne pour moi est la suivante:
For Each xCell In Selection
xCell.Value = CDec(xCell.Value)
Next xCell
En utilisant la réponse de aLearningLady ci-dessus, vous pouvez dynamiser votre plage de sélection en recherchant la dernière ligne contenant des données au lieu de sélectionner simplement la colonne entière.
Le code ci-dessous a fonctionné pour moi.
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
Pour les grands ensembles de données, une solution plus rapide est requise.
L'utilisation de la fonctionnalité 'Text to Columns' fournit une solution rapide.
Exemple basé sur la colonne F, plage de départ de 25 à 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