Saltar al contenido

Convertir texto a numeros (eficientemente)


Gerson Pineda

Recommended Posts

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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)

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

Invitado Cacho R

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]

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

  • 2 weeks later...

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

Invitado Cacho R
... 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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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

Enlace a comentario
Compartir con otras webs

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.

Enlace a comentario
Compartir con otras webs

Archivado

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

  • 96 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola, Mejor que subas un archivo que contenga esas fórmulas, indicando qué resultados esperas conseguir. Así ayudas a quien quiera ayudarte; no le obligas a que reproduzca ese modelo, y de paso podrá ver cuál es el objetivo buscado con esa/s fórmula/s. Saludos,
    • Buenas noches quisiera hacer esta formula auto incremental    =SI(INDIRECTO("'Casos de Prueba'!I1")="Resultados Ciclo 1"; SI(CONTAR.SI(INDIRECTO("'Casos de Prueba'!I:I"); "OK")=0; 0; CONTAR.SI(INDIRECTO("'Casos de Prueba'!I:I"); "OK")); 0)      para que cada vez que copiase y pegase la celda con la formula  se incrementara la letra en este caso la I pasara a J ,como el numero perteneciente a Resultados Ciclo pasando en este caso del 1 al 2.   Tengo también esta formula =CONCATENAR("CP";TEXTO(MAX((SI((ESNUMERO(HALLAR("CP";A$1:A1)))*(A$1:A1<>"");VALOR(EXTRAE(A$1:A1;3;3));0))+1);"000")&" - "&B2) quisiera que no tuviera los 3 ceros si no que fuera por ejemplo CP1 y se fuera incrementando. Gracias un saludo.
    • Con el diseño así como lo tiene en su libro, una fórmula de BUSCARV con COINCIDIR debería ser de utilidad =C5*BUSCARV($C$1,Tabla1[#Todo],COINCIDIR($D5,Tabla1[#Encabezados],0)) Es con lo que participaría en su consulta. Lo que resta es definir que hacer si no encuentra la OT porque así como esta le devolvería error en ese caso, o si tiene condiciones que haya podido omitir también le afectarían el resultado.
    • He cambiado mi macro a este: Sub repetir() Set a = Sheets(ActiveSheet.Name) uf = a.Range("C" & Rows.Count).End(xlUp).Row 'ultima fila con datos ActiveCell.Select ActiveCell.Offset(1, 0).Select   'Application.OnTime Now + TimeValue("00:00:10"), "repetir", , True End If End Sub   Lo que no se es como detenerlo al llegar a la ultima fila con datos de la columna C. Muchas gracias
    • Buenas tardes a todos. Tengo un problema que preciso de vuestra ayuda.  Tengo que controlar los gastos de la oficina que trabajo y he de repartir unos gastos a % según una OT y unos tipos de gastos. Envío un archivo adjunto. Lo que necesito es que lo que aparece en la columna en amarillo lo haga automáticamente, teniendo en cuenta los datos de la tabla a la derecha. Por ejemplo, el primer gasto tiene una cuota de 1477 euros y teniendo en cuenta que es un gasto de tipo Común y que la OT es la 12810234, le corresponde un gasto de 605,57 euros ya que según la tabla de la derecha su % a imputar es de un 41%. ¿alguien me puede ayudar con la formula? He de añadir muchas más líneas y más hojas con el resto de OT y en el futuro cambiar más datos, así que necesito automatizarlo con una formula Excel. Gracias. Control de gastos.xlsx
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.