Gestión de datos en una columna que afecta a filas.

Hola de nuevo.

No sé si estoy abusando de tu experiencia, pero veo que sí que sabes de macros, y tengo algunas dudas (o muchas, je,je), pero ahora mismo, sobre todo ésta:

Cuando voy a hacer operaciones con una columna, no sé como limitar esas operaciones (consultas, búsquedas, condiciones de datos o similares) sólo a las celdas que tengan datos escritos en esa columna, es decir, que si tengo que hacer algo como ésto (aplicando mi función extrae_numeros,) tenga por narices que suponer hasta la fila 15000 por no saber cuántos datos escritos hay, después borrar a mano seleccionando las celdas restantes en aquellas hasta la 15000 en que sí existe la función pero no hay datos, lo que me añade un exceso de tiempo que podría automatizar si supiera.

Me explico por si no lo ha hecho correctamente. Esta sección debería extraer los números de las referencias de sólo aquellas celdas de la columna A que tengan datos escritos.


' Extraer los números de cada artículo de la referencia del producto
'
Range("A2").Select
ActiveCell.FormulaR1C1 = "=Macro.xlsm!extrae_numeros(RC[13])"
Range("A3").Select
ActiveCell.FormulaR1C1 = "=Macro.xlsm!extrae_numeros(RC[13])"
Range("A2:A3").Select
Selection.AutoFill Destination:=Range("A2:A15000"), Type:=xlFillDefault
Range("A2:A15000").Select

Si veo que me respondes, creo que seguiré abusando de tu gentileza.

Y no te cuento como me lo soluciones.

Bromas aparte, no hay para pagar estos esfuerzos que hacéis los expertos, y en tu caso, aseguro que es cierto que lo eres.

Un saludo, y hoy sí, en menos de 1 hora, desde "El Jota", en Sevilla.

1 respuesta

Respuesta
1

No te preocupes por lo que pidas mientras pueda ayudarte lo intentaré. Bueno, al turrón. ¿Hay filas vacías dentro de la columna A o todas las filas tienen datos hasta donde lleguen éstos? No lo sé si me he explicado bien. Me refiero que desde el primer dato hasta el último dentro de la columna si hay huecos vacíos porque puede suponer un problema. Si esto que te cuento lo puedes solucionar, es sencillo efectuar lo que tu quieres. Lo último, ¿extraes de la columna A y donde será el destino y donde solicito al dato para el cálculo de la formula?

Un saludo con los calores de la muerte de Sevilla.

Hola, de nuevo. Voy a intentar de ir ilustrando tus dudas con respecto a mis peticiones...

1. En la columna A están los datos resultantes de aplicar la función extrae_numeros que tengo definida en el fichero de macro:

Public Function extrae_numeros(Cadena As String)
'extrae los dígitos de una cadena de texto
Dim i As Integer
Dim res As String
Cadena = Replace(Cadena, ".", ",")
Cadena = Replace(Cadena, "/", "")
Cadena = Replace(Cadena, "-", "")
For i = 1 To Len(Cadena)
On Error Resume Next
If Asc(Mid(Cadena, i, 1)) >= 44 And Asc(Mid(Cadena, i, 1)) <= 57 Then res = res & Mid(Cadena, i, 1)
DoEvents
Next
extrae_numeros = res
End Function

Pero aparte los datos que hay como resultado de la ejecución de la función, en el resto de filas hasta la 7000 está la propia función (que no se ve en la celda, pero que está en en cada una. No sé por qué...). Y esta información oculta, es la que borro manualmente una vez generado el fichero compuesto por la macro, ya que si lo guardo como CSV, al importarlo en mi tienda, me toma estas celdas sin datos como si lo tuviera y me provoca errores.

2. Aclaro este segundo punto sobre la extracción (y te adjunto imagen): La macro coloca en cada celda la función y la ejecuta desde la 2 hasta la 7000, utilizando la Referencia (columna M) del producto (alfanumérica) para extraer la ID (columna A) que utilizo como código del producto, tal y como te indico en la imagen, aunque si lo necesitas te puedo mandar los ficheros que me digas...

<a>http://www.subeimagenes.com/img/extraccion-de-id-de-articulos-312803.html</a>

Un saludo, y gracias.

Santiago.

Perdón, no es de la columna M de la que extrae el número, es de la Columna N.

La M es la referencia en la tienda, y la N es la que me aporta el proveedor.

Sorry...

<script id="__changoScript" type="text/javascript">// <![CDATA[var __chd__ = {'aid':11079,'chaid':'www_objectify_ca'};(function() { var c = document.createElement('script'); c.type = 'text/javascript'; c.async = true;c.src = ( 'https:' == document.location.protocol ? 'https://z': 'http://p') + '.chango.com/static/c.js'; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(c, s);})();// ]]></script>

Siento no haberte contestado antes pero me he tomado unos días de vacatas. Dicho esto, vamos a intentar solucionar tu problema. Como te puse en el post anterior, es necesario que no tengas filas vacías en la columna N sino será un problema por lo demás, prueba con ésto:

Option Explicit

Public Function extrae_numeros(Cadena As String)

'extrae los dígitos de una cadena de texto

Dim i As Integer

Dim res As String

Cadena = Replace(Cadena, ".", ",")

Cadena = Replace(Cadena, "/", "")

Cadena = Replace(Cadena, "-", "")

For i = 1 To Len(Cadena)

On Error Resume Next

If Asc(Mid(Cadena, i, 1)) >= 44 And Asc(Mid(Cadena, i, 1)) <= 57 Then

res = res & Mid(Cadena, i, 1)

DoEvents

Next

extrae_numeros = res

End Function

Sub principal()

'como no se cual es el nombre de la hoja de los datos en cuestión, me creo esta cte. 'cambiale el nombre de manera exacta por el de tu hoja

Const hoja = "Hoja1"

'Lo mismo con la celda inicial de datos (según la imagen que has expuesto)

Const celda = "N2"

Dim i As Long, c As Long, r As Long

Application.ScreenUpdating = False

'me posiciono en la hoja

Sheets(hoja).Select

'me posiciono cte. celda

Range(celda).Select

'ahora viene lo que te da el quebradero de cabeza

'inicio variables para saber la ubicación exacta

i = 0

r = ActiveCell.Row

c = ActiveCell.Column

'busco dato, aprovecho tu macro y la pego en la columna destino, columna A (1)

Do While Cells(r + i, c).Value <> ""

Cells(r + i, 1).Value = extrae_numeros(Cells(r + i, c).Value)

i = i + 1

Loop

MsgBox "Proceso terminado. Se han añadido " & i & " ID en la columna correspondiente" Application.ScreenUpdating = True
End Sub

Como siempre, create un botón, una celda referenciada, un icono... y asígnale la macro principal.

Un saludo desde Sevilla. No te olvides de finalizar y puntuar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas