excel - VBA: convertir texto a número
excel-vba formatting (7)
Tengo columnas de números que, por cualquier razón, están formateadas como texto. Esto me impide usar funciones aritméticas como la función subtotal. ¿Cuál es la mejor manera de convertir estos "números de texto" en números verdaderos?
Aquí hay una captura de pantalla del problema específico:
He intentado estos fragmentos en vano:
Columns(5).NumberFormat = "0"
y
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Esto convierte todo el texto en columnas de un libro de Excel en números.
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
Esto se puede utilizar para encontrar todos los valores numéricos (incluso aquellos formateados como texto) en una hoja y convertirlos a simples (función 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
La solución que para mí funciona es:
For Each xCell In Selection
xCell.Value = CDec(xCell.Value)
Next xCell
Para grandes conjuntos de datos se requiere una solución más rápida.
Hacer uso de la funcionalidad ''Texto a columnas'' proporciona una solución rápida.
Ejemplo basado en la columna F, rango inicial en 25 hasta 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
Tuve este problema antes y esta fue mi solución.
With Worksheets("Sheet1").Columns(5)
.NumberFormat = "0"
.Value = .Value
End With
Usando la respuesta anterior de aLearningLady, puede hacer que su rango de selección sea dinámico al buscar la última fila con datos en lugar de simplemente seleccionar la columna completa.
El siguiente código funcionó para mí.
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
Use la siguiente función (cambiar
[E:E]
al rango apropiado para sus necesidades) para evitar este problema (o cambiar a cualquier otro formato como "mm / dd / aaaa"):
[E:E].Select
With Selection
.NumberFormat = "General"
.Value = .Value
End With
PD: En mi experiencia, esta solución de VBA funciona SIGNIFICATIVAMENTE más rápido en grandes conjuntos de datos y es menos probable que bloquee Excel que con el método del ''cuadro de advertencia''.