excel vba excel-vba formatting

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