Saltar al contenido

Convertir texto a numeros (eficientemente)


Gerson Pineda

Recommended Posts

publicado

Hola

Existen varias formas de convertir numeros almacenados como texto a "numeros" (por cierto es un tema muy consultado), uno de los mas conocidos es usar un bucle en VBA, y precisamente lo que busco es evitar el famoso bucle (lo he probado con mas de 35000 celdas en la columna A y va rapido)

Sub convertiranumeros()

With Application
.ScreenUpdating = False
With Range("B1")
.Value = 1
.Copy
Range("A2:A" & _
Range("A" & Rows.Count).End(xlUp).Row).PasteSpecial _
Operation:=xlMultiply
.Value = ""
ActiveCell.Select
End With
.CutCopyMode = False
.ScreenUpdating = True
End With

End Sub[/PHP]

Espero sea de utilidad

Saludos desde Honduras

Convertir numeros a texto eficientemente.zip

publicado

Hola, esta excelente tu aporte, me permiti modificar un poco el codigo para que sirva en cualquier columna y fila, espero no tengas inconveniente.

Salu2.xlsx

Sub convertiranumeros()

On Error Resume Next

Set rn = Application.InputBox("Selecione celda...", Type:=8)

rn.Select

With Application

.ScreenUpdating = False

With Range("B1")

.Value = 1

.Copy

Range(Selection, Selection.End(xlDown)).PasteSpecial operation:=xlMultiply

.Value = ""

ActiveCell.Select

End With

.CutCopyMode = False

.ScreenUpdating = True

End With

End Sub

publicado

Hola potter

Buena opcion, tambien se podria usar algo como esto:

Sub convertiranumeros2()

With Application
.ScreenUpdating = False
With ActiveCell
With ActiveCell.Offset(0, 1)
.Value = 1
.Copy
Range(ActiveCell.Offset(1), Selection.End(xlDown)).PasteSpecial _
Operation:=xlMultiply
.Value = ""
End With
ActiveCell.Select
End With
.CutCopyMode = False
.ScreenUpdating = True
End With
End Sub
[/PHP]

Lo unico que se debe hacer es colocarce en la cabezera del rango de numeros

Saludos desde Honduras

publicado
Que tal si solo ponen.


Selection.Value = Selection.Value
[/CODE]

Saludos

Lo has comprobado tu? lo intente con with selection y no paso nada, haber si nos mandas el codigo completo, o ya mis neuronas no dan mas jeje

Saludos

publicado
Lo has comprobado tu? lo intente con with selection y no paso nada, haber si nos mandas el codigo completo, o ya mis neuronas no dan mas jeje

Saludos

Utilizando el ejemplo de tu 1er. post quedaria asi.

Sub Convertiranumeros()
Dim rSel As Range
Set rSel = Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row)
rSel.Value = rSel.Value
Set rSel = Nothing
End Sub[/CODE]

Otra opción.

[CODE]Sub Convertiranumeros()
With Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row)
.Value = .Value
End With
End Sub[/CODE]

Saludos

publicado

Interesante me gusta tu opción tambien solo que le cambiaria el offset a cero

Range(ActiveCell.Offset(0), Selection.End(xlDown)).PasteSpecial _

Operation:=xlMultiply

por si no tiene encabezado la columna y empezar desde los valores.

Lo de salilepaty lo intente pero igual no me funciono, he visto ese codigo pero cuando realizar operaciones y quieres que solo te quede el valor en la celda; no la formula.

Salud.xlsx

publicado

sailepaty

Cre que te has confundido, lo que trato de hacer es que numeros "almacenados como texto" se conviertan a numeros comunes dentro de Excel, para luego poder trabajarlos bajo calculos

Saludos sr Elias sera que mereces unas buenas vacaciones jeje, al igual que Macro (antes Antoni)

publicado
Que tal Gerson, ya probaste alguna de las dos opciones con tus datos?

Saludos

Efectivamente ya probe, pero sin exito alguno, talvez si lo haces tu porfavor, sobre mi archivo

Saludos

publicado

Hola, por que no funcionan tus macros si pego los datos de la columna G en A solo, me funcionan al abrir el archivo de los contrario no, lo mismo pasa si los copio a otra hoja del mismo libro.

que le pasa, no entiendo !!!

Salu2.xlsx

Invitado Cacho R
publicado

Hola! Amigos

En realidad, lo que sugiere sailepaty no es que no esté funcionando: ¡es que no se nota! (jajaja).

Para notarlo simplemente falta un cambio de formato:


[g1].CurrentRegion.Copy [a2]
With [a2].Resize(WorksheetFunction.CountA([a:a]) - 1)
.NumberFormat = "0"
.Value = .Value
End With[/PHP]

Saludos, Cacho R.[color=blue]

--- Mensaje unido automáticamente ---

[/color][size=3][font=comic sans ms]Sorry: olvidé un comentario...

El ejemplo que ha preparado sailepaty tiene una "pequeña" diferencia con lo inicial de Gerson.

En efecto: mientras que en éste, las celdas de la columna A tienen un formato "Texto", en en el ejemplo de sailepaty las celdas ya tienen un formato general.

Saludos, Cacho R.[/font][/size]

publicado

No habia ni reparado en el formato de las celdas hasta ahora que lo menciona Cacho, así que para que se vea el cambio.

Sub SailePaty_B()
With Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row)
.NumberFormat = "General"
.Value = .Value
End With
End Sub
[/CODE]

Saludos

publicado

Cacho, gracias por la aclaracion, sailepaty compendido y probado, !si funciona! y con la misma eficacia

Por lo que quedaria asi:

Sub Convertiranumeros()

With Application
.ScreenUpdating = False
With Range("B1")
.Value = 1
.Copy
With Range("A2:A" & _
Range("A" & Rows.Count).End(xlUp).Row)
.PasteSpecial Operation:=xlMultiply
.NumberFormat = "General"
End With
.Value = ""
ActiveCell.Select
End With
.CutCopyMode = False
.ScreenUpdating = True
End With
End Sub
[/PHP]

Eso si me gusta el metodo de sailepaty es mas sencillo, practico y con la misma eficacia, que pretendia con mi aporte

Saludos a los 3, es un placer compartir con ustedes

publicado

Chequen esta opcion (aportada en otro foro), creador Macro Antonio

Sub ConvierteNúmerosAlmacenadosComoTexto()
uf = Range("A" & Rows.Count).End(xlUp).Row
Range("Z1:Z" & uf).Value = Range("A1:A" & uf).Value
Range("A1:A" & uf).Value = Range("Z1:Z" & uf).Value
Range("Z1:Z" & uf).ClearContents
End Sub
[/PHP]

Saludos

  • 2 weeks later...
publicado

Buenas a todos:

Aún sigo aprendiendo a "leer" y programar con macros (VBA), por lo que no se mucho. Estuve tratando como el que puso Gerson, pero en esta parte .PasteSpecial Operation:=xlMultiply,lo sustitui por este .PasteSpecial Operation:=xlTransparent debido a que este último si me realiza los cambios a formato de número; creo que se debe a que los datos de donde los exporto es de uno generado en Crystal Report. No sé si tenga que ver esto, pero siempre que lo exporto a Excel pone una de las columnas como texto, y lo que quiero es trabajas con los números de esa columna en mención; por lo que encontre este tema y lo tome para trabajar pero no me relizaba los cambios hasta que indagando por ahí en Ayuda del Visual Basic, encontré esta constante (así es el termino como fué que aparecio). Solo quisiera saber que diferencia existe entre lo expuesto y el cambio que realice, porque lo que no he comprendido es el significado de estas en este lenguaje técnico y el porque no realizo los cambios expuestos primeramente.Gracias.

publicado

Hola Gaspatin

Lo que no entiendo es como VBA no nos da error al usar "Transparent" pues es usado normalmente para controles (como TextBox2.BackStyle = fmBackStyleTransparent y se pondra transparente) y que al ver la ayuda de PasteSpecial no aparece por ningun lado el dichoso "xlTransparent"

Si sigues con la duda de como poder resolverlo crea un tema al respecto}

Saludos desde Honduras

Invitado Cacho R
publicado
... Lo que no entiendo es como VBA no nos da error al usar "Transparent" ...

Hola! Amigos.

Mi estimado Gerson: "xlMultiply" es un parámetro prefijado dentro de VBA cuyo valor es "4". Por lo tanto las siguientes tres líneas son equivalentes:

.PasteSpecial Operation:=xlPasteSpecialOperationMultiply

.PasteSpecial Operation:=xlMultiply

.PasteSpecial Operation:=4

En el mismo sentido, el parámetro "xlTransparent" es otro parámetro con valor prefijado: "2", en este caso.

De modo que las cuatro siguientes líneas son equivalentes:

.PasteSpecial Operation:=xlTransparent

.PasteSpecial Operation:=xlPasteSpecialOperationAdd

.PasteSpecial Operation:=xlAdd

.PasteSpecial Operation:=2

Saludos, Cacho R. :D

publicado

Que tal Buenas noches:

Creo que me exedí un poco con la pregunta, uds disculpen la ignorancia al no poder comprenderlo del todo estos terminos, mas o menos entiendo a lo que se refiere Cacho, pero con esto me doy mas que sufiente por enterado del concepto por el momento; mi intención del cuestionamiento iba mas encamidado a que el termino o parametro Transparent que es lo que hace en la ceda a diferencia del Multiply, pero si no se puede en este tema no importa, es solo de conocimiento la pregunta. Gracias y Saludos.

publicado

Hola

Aprovecho para saludar a mis buenos amigos y masters.

Para ampliar un poco el contenido y esperando ayude a comprender como funciona, lo que sucede es que existen una serie de constantes de Enumeracion predefinidas con la finalidad de hacer más fácil la programación, (es decir para ayudar al programador, ya que es mas descriptivo por ejemplo usar la constante de enumeracion xlMultiply que solamente el número 4), al menos dentro del ámbito donde se estan usando.

Para ejemplificar desde vba como funciona aqui dejo un pequeño ejemplo:

'Se define la enumeracion
Public Enum EstadoDeAnimo
Triste = 1
Contento = 2
Enojado = 3
End Enum

'usamos como parametro una variable tipo EstadoDeAnimo
Function ReflejaEstadoAnimo(Estado As EstadoDeAnimo)
Select Case Estado
Case 1
ReflejaEstadoAnimo = "o o" & vbNewLine & " l " & vbNewLine & "~~~"
Case 2
ReflejaEstadoAnimo = "o o" & vbNewLine & " l " & vbNewLine & " l__l"
Case 3
ReflejaEstadoAnimo = "^ ^" & vbNewLine & " l " & vbNewLine & "----"
Case Else
ReflejaEstadoAnimo = "***"
End Select
End Function

''Funcionamiento del ejemplo
Sub test()
a = ReflejaEstadoAnimo(Contento)
MsgBox a
End Sub[/PHP]

Por ejemplo de ahi que sea equivalente usar la variable tipo constante de enumeracion Triste que es igual al número 1 en nuestro ejemplo.

Ademas el [color=#000080]intellisense[/color] nos ayuda más al mostrarnos los posibles valores que podemos usar en la funcion (acercandolo mas al lenguaje humano).

[ATTACH]24323.vB[/ATTACH]

Saludos

post-565-145877003357_thumb.jpg

publicado

Hola master Neverdelimon, que puedo decir mas descriptivo e ilustrativo no creo! sin duda cada dia aprendemos algo, y aunque no soy programador de profesion me gusta mucho hacerlo, y tus aportes siempre nos iluminan y enseñan, como otros que ya sabemos quienes son

Gracias por compartir tu conocimiento

Saludos

publicado

Que tal a todos:

Jejejeje me agrado mucho tu ejemplo Neverdelimon1 (con peras y manzanas como decimos por acá, refiriendose a un ejemplo simple), entiendo un poco mejor esto. Tampoco soy programador de profesión pero este tipo de foros me ha sacado esa parte que no sabía que tenía, espero no desesperar o molestar cuando hago este tipo de cuestionamientos, pero creo que es parte del interes que tengo por saber más.

Estuve trabajando en un proyecto personal y con lo aqui aprendido y visto en otros temas cree este que espero me pueda explicar y sobretodo le sirva a alguien mas lo que expongo. Saludos y gracias a los que de una u otra manera me ilustraron.


Sub RangoLimpio()
Application.ScreenUpdating = False
'Seleccionamos el rango a trabajar en este caso columna "G"
Cells(Rows.Count, "G").End(xlUp).Offset(0, 1).Select
'Selecciono una columna a la derecha donde pondré los datos
Range(Selection, Cells(2, 8)).Select
With Selection
'En "C" estan rangos en multiplos de 10 hasta que puede terminar en cualquiera
'es decir en 20,30,60,70 ó 100 y vuelve a comenzar otra fila desde 10 así sucesivamente.
'Con la siguiente formula me dice donde empieza 10
.FormulaR1C1 = "=IFERROR(IF(R[-1]C[-5]+10=RC[-5],"""",IF(RC[-5]=10,""x"")),"""")"
'Copia el rango para solo dejar datos y no formulas
.Copy
.PasteSpecial (xlPasteValues)
End With

Dim C As Variant
Dim Rng As Range
'Aqui "limpio" las celdas que quedaron vacias
Set Rng = Selection
For Each C In Rng.Cells
If C = "" Then C.Select
Selection.ClearContents
Next
Range("H1").Select
Application.ScreenUpdating = True
End Sub[/CODE]

Saludos a todos y mis agradecimientos.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.