web-dev-qa-db-fra.com

VBA: Convertir le texte en nombre

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:  Error

J'ai essayé ces extraits en vain:

Columns(5).NumberFormat = "0"

et

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

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". 

23
aLearningLady

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
6
Jones

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
4
BerticusMaximus

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
3
ConertVBA

La solution qui fonctionne pour moi est la suivante:

For Each xCell In Selection

  xCell.Value = CDec(xCell.Value)

Next xCell 
1
Camilo Vargas

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
0
Mikey

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
0
Louis