EJERCICIO PRÁCTICO CON LA FUNCIÓN SPLIT Y EL MÉTODO FIND

Hola a todos:

A lo largo de las semanas me van llegando consultas de los lectores, muchas de ellas requieren bastante trabajo de programación y en otros casos requieren un trabajo previo de análisis funcional. Como no puedo realizar un post con un ejercicio de este tipo, dado que sería muy extenso, creo que lo más interesante es realizar un ejemplo con algunas de las funciones utilizadas en esas consultas.

Por ejemplo, hoy quiero hablar sobre las funcionalidades de la función “Split” y su combinación con el método find.

Imaginamos un ejemplo práctico:

EJERCICIO PRÁCTICO CON LA FUNCIÓN SPLIT Y EL MÉTODO FIND

Lo que debemos hacer es confeccionar una función que nos permita obtener las sumas de los importes que se encuentran en la columna B y que coincidan entre la columna A y la celda D2. Como podéis observar en la celda D2 los números se encuentran delimitados por una “,”.

Para poder construir nuestro código debemos utilizar una función que nos permita extraer cada uno de los elementos de la celda D2, para ello tendremos que utilizar la función Split.

Para localizar esos elementos en la columna A, utilizaremos el método Find.

Podríamos realizar una macro directamente que funcionase con un botón de ejecución, pero para este ejemplo lo más práctico es una UDF (Función Definida por el Usuario).

Esta es la función que vamos a utilizar y que como siempre iremos comentando:

Option Explicit
Function SumaV(ByVal Target As Range)
'Declaramos variables
Dim Num As Variant, nCampo As Variant, sItem As Variant
Dim Numero As Double, Total As Double, nCol As String
Dim Celda As Range
'En la hoja activa
With ActiveSheet
'Recorremos celdas del rango seleccionado
For Each Celda In Target
'por cada dato delimitado buscamos en la columna1
For Each Num In Split(Celda, ",")
Set nCampo = .Range("A:A")
Set sItem = nCampo.Find(Num)
'Buscamos celda con el número buscado
nCol = sItem.Address
'Seleccionamos el valor de la siguiente columna
Numero = .Range(nCol).Offset(0, 1)
Total = Total + Numero
'Pasamos el valor al resultado
SumaV = Format(Total, "#,##0")
Next Num
Next Celda
End With
End Function

Lo primero que debemos tener en cuenta es que la función tendrá que seleccionar un rango (no solo una celda), por ello tenemos que utilizar una primera instrucción For Each que recorra el rango seleccionado, o lo que es lo mismo, las celdas seleccionadas.

For Each Celda In Target

Donde “Target” es el rango que seleccionemos.

Lo siguiente será realizar otra instrucción For Each por cada elemento delimitado en cada celda. Aquí es donde utilizaremos la función Split embebida en el ciclo:

For Each Num In Split(Celda, ",")

Es obvio que si estamos utilizando otro delimitador, como un punto y coma o una barra vertical, debemos modificarlo en el código.

Una vez que tenemos el item seleccionado, ahora debemos buscarlo en la columna A, para ello utilizaremos el métido Find (podríamos programar un buscar V o un For).

Set nCampo = .Range("A:A")
Set sItem = nCampo.Find(Num)
'Buscamos celda con el número buscado
nCol = sItem.Address

Con esto tendremos la celda de la columna A en la que hemos encontrado coincidencia. Pero necesitamos la cifra que debemos sumar, para ello vamos a utilizar la función Offset:

Numero = .Range(nCol).Offset(0, 1)

El resto ya es ir cerrando las dos instrucciones y proceder a sumar cada coincidencia.

El resultado es el siguiente:

EJERCICIO PRÁCTICO CON LA FUNCIÓN SPLIT Y EL MÉTODO FIND_1

Como habéis podido comprobar, la suma que realiza la función es la correcta.

Podríamos hacerlo con un rango de celdas y su resultado sería el correcto.

Descarga el archivo de ejemplo pulsando en: EJERCICIO PRÁCTICO CON LA FUNCIÓN SPLIT Y EL MÉTODO FIND

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

EXTRAER DATOS DE UNA SELECCIÓN SEGÚN UN CRITERIO

Hola a todos!.

Hoy voy a escribir un post como respuesta a una consulta que me enviaron hace unos días. Aunque utilizando los diferentes post de esta web se podría confeccionar el código, el lector me comentaba que se veía incapaz de realizar esta tarea, de modo que le comenté que escribiría un post explicando cómo hacer su petición.

La consulta planteada trata sobre la posibilidad de una vez seleccionada un área o rango de celdas, poder extraer esta información según un criterio determinado y pasar dichos datos a una columna determinada. En su ejemplo, me pedía que trabajase con números y un criterio numérico.

Vamos con un ejemplo. Imaginad que tenemos dos columnas con números, y queremos pasar a la tercera columna todos aquellos que sean inferiores a 30:

EXTRAER DATOS DE UNA SELECCION SEGUN UN CRITERIO

Pues bien, para poder realizar esta tarea, nos bastará con pegar este código en un módulo estándar de nuestros editor de VBA:

Sub EXTRAER_DATOS()
'Declaramos variables
Dim celda As Object
Dim j As Long, nCol As Long, n as Long
Dim miCelda As String, matriz As Variant
'Recorremos celdas y seleccionamos dato segun condicion
For Each celda In Selection
If celda < 30 Then miCelda = miCelda & " " & celda
Next celda
'Pasamos los datos a un matriz
matriz = Split(miCelda, " ")
'Contamos elementos
n = UBound(matriz) + 1
'Si no hay datos, mostramos mensajes y salimos del proceso
If n = 0 Then
MsgBox ("NO EXISTEN DATOS SEGÚN LOS CRITERIOS QUE HAS SELECCIONADO")
Exit Sub
End If
'Pasamos los datos a la columna 3
matriz = Split(miCelda, " ")
For j = 0 To UBound(matriz)
ActiveSheet.Cells(j + 1, 3) = matriz(j)
Next j
End Sub

Como podéis ver en el código, simplemente utilizando un loop for-each capturamos los datos seleccionados, luego solo tenemos que indicar aquellos que nos interesan (menor de 30) y pasarlos a un string para finalmente colocarlos en la columna 3.

Este es el resultado:

EXTRAER DATOS DE UNA SELECCION SEGUN UN CRITERIO_1

Y el resultado es el esperado. En la tercera columna tenemos la información que habíamos indicado en la macro.

Y con esto doy la pregunta por contestada : )

Descarga el archivo de ejemplo pulsando en: EXTRAER DATOS DE UNA SELECCIÓN SEGÚN UN CRITERIO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies