MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES

Hola a todos:

Esta semana recibí una consulta sobre matrices (arrays) multidimensionales. En concreto sobre las matrices de 2 dimensiones, dado que la necesidad era para datos establecidos en una hoja Excel y los elementos o las dimensiones eran las filas y las columnas. La consulta era para saber cómo rellenar la matriz desde Excel.

Sobre matrices os dejo enlaces en microsoft y que creo que os pueden interesar interesantes:

Voy a ser breve con este ejemplo, porque lo que voy a realizar es el ejemplo de rellenar una matriz y pasar los datos de nuevo a Excel a otra hoja.

Vamos con el ejemplo:

MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES

La idea es leer todos estos datos, pasarlos a una matriz (MiArray) y pasarlos a la hoja2 de nuestros archivo de ejemplo. Esto lo vamos a realizar con el siguiente código:

Option Explicit
Sub ARRAY_MULTIDIMENSIONAL()
'Declaramos variables
Dim i As Long, j As Long, final As Long, fin As Long
Dim n As Long, x As Long
With Sheets(1)
'Capturamos límite de fila y columna
final = Application.CountA(Sheets(1).Range("1:1"))
fin = Application.CountA(Sheets(1).Range("A:A"))
'Redimensionamos nuestra matriz
ReDim MiArray(1 To fin, 1 To final)
'Rellenamos matriz
For i = 1 To fin
For j = 1 To final
MiArray(i, j) = Sheets(1).Cells(i, j)
Next j
Next i
End With
'Pasamos los datos de la matriz a la hoja2
For n = 1 To fin
For x = 1 To final
Sheets(2).Select
Sheets(2).Cells(n, x) = MiArray(n, x)
Next x
Next n
End Sub

El resultado es el esperado, los datos de la hoja1 pasan a la hoja2. Obviamente, este ejercicio es muy sencillo, pero es útil para saber cómo funciona y se comportan las matrices.

Si necesitamos modificar el contenido de lo que estamos pasando a la matriz, podemos utilizar condicionales o cualquier otra estructura para indicar mediante una regla qué datos deseamos modificar o leer.

Y esto ha sido todo, es un post corto, pero que aclara perfectamente cómo utilizar este tipo de matrices, cómo llenarlas, cómo leerlas y como “moverlas”.

Descarga el archivo de ejemplo pulsando en: MATRICES MULTIDIMENSIONALES EN VBA. EJEMPLO PRÁCTICO CON DOS DIMENSIONES

¿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

ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

Hola a todos:

Estos días he estado trabajando con matrices y con cadenas (Strings) de contenido numérico para realizar una ordenación de sus componentes.

Teniendo en cuenta que no se puede utilizar el método “Range.Sort”, básicamente porque no trabajamos con un rango, y que tampoco se posible crear un objeto arrayList para utilizar el método Sort, dado que la ordenación cuando trabajamos con números no se adecúa al estándar habitual, dado que ordena de la siguiente forma forma: 1, 10, 2, 3 …

Entonces el único método posible para realizar la ordenación de forma correcta y sin márgenes de error, es el que se explica con el Algoritmo de Ordenación de Burbuja. Os dejo en link a la Wikipedia para que lo podéis comprender mejor.

En teoría se trata de ir comparando el número (n) si es mayor al siguiente (n+1), en caso de serlo, se intercambia el lugar de ambos en la cadena, en caso de no serlo, se evalúa el siguiente y así hasta finalizar. He tomado el gif de la wikipedia para ilustrar gráficamente el comportamiento:

Ejemplo

Esta programación ya la he usado en varias ocasiones y me pareció interesante mostrar cómo se hace en VBA. Veamos un ejemplo:

ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

Lo que queremos obtener es la ordenación de todos estos números y de paso, obtener el número menor y el mayor. Para realizar esto, vamos a utilizar la siguiente macro:

Sub Ordenar_String()
'Declaramos variables
Dim Rng As Range, fin As Long, celda As Variant
Dim Scadena As String, Valor As Variant, i, MiCadena As String
Dim miArray As Variant, Control As Boolean, BetaString As Double
Dim Valores As Variant, n, Max As String, Min As String
Dim Mensaje As Variant, Listado As Variant
'Seleccionamos rango con datos
Set Rng = Selection
'Componemos cadena si la celda tiene datos y es un número
For Each celda In Rng
If celda <> vbNullString And IsNumeric(celda) Then
MiCadena = MiCadena & " " & celda.Value
End If
Next celda
Scadena = Trim(MiCadena)
'Si la selección está vacía, salimos del procedimiento
If Scadena = vbNullString Then Exit Sub
'Pasamos la cadena a un array
Valor = Split(Scadena, " ")
ReDim miArray(0 To UBound(Valor))
For i = 0 To UBound(Valor)
miArray(i) = CDbl(Valor(i))
Next i
'Iniciamos loop y bucles para realizar
'algoritmo de burbuja
Do
Control = True
For i = 0 To UBound(miArray) - 1
If miArray(i) > miArray(i + 1) Then
Control = False
BetaString = miArray(i)
miArray(i) = miArray(i + 1)
miArray(i + 1) = BetaString
End If
Next i
Loop While Not (Control)
'Una vez que tenemos el array ordenado,
'Extraemos el valor mínimo y el máximo
Valores = Split(Join(miArray, " "), " ")
For n = LBound(Valores) To UBound(Valores)
If n = LBound(Valores) Then Min = Valores(n)
If n = UBound(Valores) Then Max = Valores(n)
Next n
'Mostramos el máximo y el mínimo y mostramos todos los números ordenados.
Mensaje = MsgBox("El valor mínimo es: " & Min & " y el valor máximo es: " & Max, vbYesNo, "¿Quieres el detalle, pulsa en Si?")
If Mensaje = vbYes Then Listado = MsgBox(Join(miArray, " "), vbInformation, "LISTADO DE NÚMEROS")
End Sub

Si estudiáis bien el código, la parte fundamental, (el algoritmo), es este:

Do
Control = True
For i = 0 To UBound(miArray) - 1
If miArray(i) > miArray(i + 1) Then
Control = False
BetaString = miArray(i)
miArray(i) = miArray(i + 1)
miArray(i + 1) = BetaString
End If
Next i
Loop While Not (Control)

Es aquí donde realizamos la tarea de comprar todos los números y ordenarlos de la forma que os describí anteriormente.

El resultado es el siguiente:

ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA_1

Y este es el resultado, he programado la macro para que muestre la cadena ordenada en un msgbox, pero con un sencillo loop lo podéis pasar a la hoja activa.

Y eso es todo, ahora ya sabéis cómo programar un algoritmo de ordenación, en este caso el de Burbuja. Y como siempre, os dejo el ejemplo.

Descarga el archivo de ejemplo pulsando en: ALGORITMO DE ORDENACIÓN DE BURBUJA EN VBA

¿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

MOSTRAR PROPIEDADES DE ARCHIVOS SELECCIONADOS

Hola a todos!.

Espero que estéis bien!, hoy os voy a dejar una macro que creé para responder a una consulta.

Se trata de mostrar las propiedades que tiene uno o varios archivos en una hoja, es decir, listarlos y mostrar los datos. Esto ya lo realicé en una ocasión con este post: LISTAR LAS PROPIEDADES DE TODOS LOS ARCHIVOS DE UNA CARPETA Y SUBCARPETAS

Pero a diferencia del post anterior, lo que necesita el lector es que pueda seleccionar los archivos y no la carpeta con todo su contenido. Esto es algo bastante razonable, así que le mostré una posible solución.

Imaginad que queremos listar estos archivos, pero no todo el contenido de la carpeta, solo los archivos de Excel:

MOSTRAR PROPIEDADES DE ARCHIVOS SELECCIONADOS

Pues con este código lo vamos a lograr:

Sub LISTAR_ARCHIVOS()
'Definimos variables
Dim i As Long, j As Long, FSO As Object
Dim nArchivo As String, dir_Archivo As Variant
'Creamos ventana de diálogo para seleccionar los archivos que queremos listar
dir_Archivo = Application.GetOpenFilename(Title:="SELECCIONA ARCHIVOS", MultiSelect:=True)
'Si no seleccionamos archivos, salimos del proceso
If Not IsArray(dir_Archivo) Then
Exit Sub
End If
With ActiveSheet
'Iniciamos un for con para identificar los archivos seleccionados
'Creamos FileSystemObject para obtener propiedades de cada archivo seleccionado
Set FSO = CreateObject("Scripting.FileSystemObject")
For j = LBound(dir_Archivo) To UBound(dir_Archivo)
i = Application.CountA(Range("A:A")) + 1
nArchivo = dir_Archivo(j)
'pasamos el link de cada archivo seleccionado a la hoja
.Cells(i, 1).Select
.Hyperlinks.Add Anchor:=Selection, Address:=nArchivo, TextToDisplay:=nArchivo
'Pasamos propiedades de cada archivo a la hoja
.Cells(i, 2) = FSO.GetFile(nArchivo).DateCreated
.Cells(i, 3) = FSO.GetFile(nArchivo).DateLastAccessed
.Cells(i, 4) = FSO.GetFile(nArchivo).DateLastModified
.Cells(i, 5) = FSO.GetFile(nArchivo).Type
.Cells(i, 6) = FSO.GetFile(nArchivo).Size
Next j
End With
End Sub

Después de seleccionar los archivos, el resultado es el siguiente:

MOSTRAR PROPIEDADES DE ARCHIVOS SELECCIONADOS_1

Como podéis observar, tenemos los archivos seleccionados, con su hipervínculo al lugar del equipo en el que los tenemos y algunas de sus propiedades, tamaño, fecha creación, modificación, etc.

Y eso es todo, espero que os resulte interesante y lo podáis utilizar en vuestros proyectos.

Descarga el archivo de ejemplo pulsando en: MOSTRAR PROPIEDADES DE ARCHIVOS SELECCIONADOS

¿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

PROGRAMAR HIPERVÍNCULOS EN VBA. EJEMPLO PRÁCTICO CON GOOGLE MAPS

Hola a todos:

Hoy os voy a mostrar una forma de programar hipervínculos que estoy seguro os parecerá interesante. La idea es la de crear un proceso dinámico y automático y no solo conformarnos con invocar el método Hyperlink.

Por ejemplo, se me ocurre que si escribo una serie de lugares en mi hoja Excel y decido crear una ruta de viaje, si seleccionase esas celdas podría mostrar esa información en un navegador (el que tenga definido como predeterminado) con google maps.

Vamos a ver un ejemplo:

PROGRAMAR HIPERVÍNCULOS EN VBA. EJEMPLO PRÁCTICO CON GOOGLE MAPS

Estas son las rutas de viaje que me he propuesto y con las que casi voy a dar la vuelta a España, gran viaje!!

Para poder hacerlo y llevarlo a cabo os mostraré el código que voy a utilizar:

Sub MAPA()
'Declaramos las variables
Dim Matriz As Object, Palabra As Variant, Area As Object
Dim alfaDato As Variant, iPalabra As String
'Creamos colección arraylist para ir agregando los elementos de la matriz
Set Matriz = CreateObject("System.Collections.ArrayList")
'Trabajamos con la hoja activa
With ActiveSheet
Set Area = Application.Intersect(Selection, .UsedRange)
'Controlamos que existan datos seleccionados
On Error GoTo Control
'Por cada objeto/palabra del rango seleccionado
For Each Palabra In Area
'Añadimos cada palabra a la matriz con un loop
Matriz.Add Palabra
Next Palabra
'Pasamos los datos a una cadena de texto
For Each alfaDato In Matriz
iPalabra = iPalabra & "/" & alfaDato
Next alfaDato
OrdenarAlfa = Trim(iPalabra)
'Abrimos explorador y mostramos la ruta
Url = "https://www.google.com/maps/dir" & OrdenarAlfa
ActiveWorkbook.FollowHyperlink Url, NewWindow:=False
'mostramos mensaje de error
Control: If Err.Number = "424" Then
MsgBox ("EL RANGO O LAS CELDAS SELECCIONADAS NO CONTIENEN DATOS"), vbExclamation, "SIN DATOS SELECCIONADOS"
End If
'Limpiamos variable de objeto
Set Matriz = Nothing
Set Area = Nothing
End With
End Sub

Como podéis ver, además del método Workbook.FollowHyperlink tambíen he introducido la creación de una cadena y una matriz con los datos seleccionados.

Este método os puede servir para muchos trabajos de programación en Excel y otros lenguajes.

El resultado es este, unas 34 horas de viaje y unos cuantos sitios que visitar : )

PROGRAMAR HIPERVÍNCULOS EN VBA. EJEMPLO PRÁCTICO CON GOOGLE MAPS_1

Este ejercicio es meramente orientativo y para que aprendáis cómo podemos utilizar y programar los hipervínculos en Excel.

Y eso es todo, ¿os parece interesante?.

Descarga el archivo de ejemplo pulsando en: PROGRAMAR HIPERVÍNCULOS EN VBA. EJEMPLO PRÁCTICO CON GOOGLE MAPS

¿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

COLOCAR ENCABEZADOS CON VBA IGUALANDO UN RANGO A UN ARRAY

Hola a todos!:

Estos días estoy más liado de lo normal!, de repente se ha vuelto todo muchas … Intenso!. En fin, hay temporadas más tranquilas y otras con más trabajo, así es la vida.

Pero no por eso voy a dejar de publicar el post semanal de Excel y VBA, verdad?. Esta temporada estoy subiendo muchos vídeos de ejemplo de mis post a LinkedIn para que los usuarios de la red vean cómo funciona realmente un procedimiento o una fórmula.

Hoy quiero compartir una de tantas formas que existen para crear y colocar encabezados en nuestros informes. Desde la igualación de celdas a un valor a un proceso  mediante un loop o igualando un rango a un array.

Este último ejemplo es el que vamos a ver hoy, y es muy sencillo: Imaginad que queréis mostrar siempre este encabezado en la hoja que se esté activa:

COLOCAR ENCABEZADOS CON VBA IGUALANDO UN RANGO A UN ARRAY

Para conseguirlo, lo vamos a hacer con 5 líneas de código:

Sub ENCABEZADOS()
With Range("A1:F1")
.Value = Array("NOMBRE", "APELLIDOS", "EDAD", "ESTUDIOS", "TELÉFONO", "DIRECCIÓN")
.Font.Bold = True
.Font.Color = vbRed
End With
End Sub

Como podéis ver,  no hemos usado una sola variable, simplemente hemos definido el rango y lo igualamos al Array que hemos creado con los nombres que queremos usar como encabezados, la coma es el separador entre los distintos elementos del array.

Para colorear las letras, usamos la propiedad font.color y usando una constante para darle color rojo.

Para dar formato negrita, pasamos propiedad Bold como true.

Ya se que es un post cortito, pero para los que no conocéis este método, estoy seguro que os seré de utilidad en algún momento.

Descarga el archivo de ejemplo pulsando en: COLOCAR ENCABEZADOS CON VBA IGUALANDO UN RANGO A UN ARRAY

¿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

GENERAR PALETA DE COLORES CON VBA

Hola a todos:

El post de hoy es sobre la paleta de colores que usa Excel y como podemos listar esos colores utilizando VBA.

Para empezar, me gustaría decir que este tema está muy publicado en internet, en particular hay una macro que se encuentra en muchas webs sobre esta temática, ¡¡la misma macro!! lo que indica la nula creatividad de algunos autores a la hora de realizar los post y copiar el código directamente sin molestarse en cambiar ni una línea. Yo plantearé otra forma.

Os mostraré un procedimiento que listará todos los colores de esa paleta, del 1 al 56, el cero no lo tendremos en cuenta, dado que es idéntico al 2 (blanco).

Lo haremos en horizontal y cada 6 celdas, de forma que se verá como una paleta de colores y no una fila hacia abajo …

Lo haremos con este código:

Option Explicit
Sub PALETA_COLOR()
'Definimos variables
Dim CONT As Integer, COL As Integer
Dim i As Integer
'Inicializamos proceso
CONT = 1
COL = 1
'Creamos loop para colorear celda con cada color index
'Cada 6 celdas seguimos el loop en la columna siguiente
For i = 1 To 56
If CONT <= 5 Then
Cells(CONT, COL).Interior.ColorIndex = i
Cells(CONT, COL + 1).Value = "Color: " & i
CONT = CONT + 1
Else
Cells(CONT, COL).Interior.ColorIndex = i
Cells(CONT, COL + 1).Value = "Color: " & i
CONT = 1
COL = COL + 2
End If
Next i
End Sub

La ejecución del código se realiza con un botón de comando y también he añadido otra sencilla macro para limpiar el rango:

Sub LIMP()
Dim CELDA As Variant
'Limpiamos datos en rango
With ActiveSheet
For Each CELDA In .Range("A1:T6")
CELDA.Clear
Next CELDA
End With
End Sub

Este es el resultado de ejecutar nuestro código:

GENERAR PALETA DE COLORES CON VBA

Si quisiéramos seguir con el loop en la columna siguiente cada 15 celdas, por ejemplo, solo tendríamos que cambiar el número en esta línea de código:

If CONT <= 5 Then

a

If CONT <= 14 Then

Como véis es una macro muy sencilla y visual, y también podéis comprobar como se pueden exponer temas muy tratados en las webs especializadas sobre vba y excel y ser un poco original a la par de evitar el copiar códigos ajenos : ).

Descarga el archivo de ejemplo pulsando en: GENERAR PALETA DE COLORES CON VBA

¿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

CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

Hola a todos:

Hoy me gustaría tratar otra vez el tema de las cadenas alfanuméricas sin duplicados, es decir con caracteres únicos, no repetidos.

Esto es un tema que ya he publicado varias veces en esta web, en concreto hoy voy a tratar sobre este post: GENERAR CADENA DE CARACTERES ALFANUMÉRICOS ALEATORIOS SIN DUPLICADOS

A nivel teórico no vamos a crear nada nuevo, pero sí a nivel práctico, dado que vamos a pasar el proceso que en el post os mostraba con una macro (y su botón de ejecución) a ser realizado con una función.

Podéis consultar la macro accediendo al post que os he dejado y aquí os voy a dejar el mismo código pero modificado para ser una función:

Option Explicit
Function CADENA_UNICOS(ByVal LARGO As Long, MIN As Long, MAX As Long)
'Declaramos variables
Dim oDic As Object
Dim Micelda As String, matrix1 As Variant, matrix2 As Variant
Dim sCadena As String, i As Long, unicos As String
Dim j As Long, nNum As Double
Dim nLetU As String, nLetL As String, nItem As Variant, nCombo As Integer
With Sheets("Hoja1")
'Creamos objeto diccionario
Set oDic = CreateObject("scripting.dictionary")
'Ejecutamos loop hasta el total de números y letras que queremos obtener
Do Until j = LARGO
'generamos aleatorios entre lo que indiquemos
nNum = Application.WorksheetFunction.RandBetween(MIN, MAX)
'generamos aleatorio de letras mayúsculas
nLetU = Chr((Application.WorksheetFunction.RandBetween(65, 90)))
'generamos aleatorio de letras minúsculas
nLetL = LCase(Chr((Application.WorksheetFunction.RandBetween(65, 90))))
'determinamos aleatoriamente qué elemento seleccionamos para pasar a la cadena
nCombo = Application.WorksheetFunction.RandBetween(1, 3)
If nCombo = 1 Then
nItem = nNum
ElseIf nCombo = 2 Then
nItem = nLetU
ElseIf nCombo = 3 Then
nItem = nLetL
End If
'componemos string con los números y letras que vamos generando
Micelda = Micelda & " " & nItem
matrix1 = Split(Micelda, " ")
'Eliminamos números y letras repetidos
For i = 0 To UBound(matrix1)
If Not oDic.Exists(matrix1(i)) Then oDic.Add matrix1(i), matrix1(i)
Next i
'Creamos una nueva cadena sin duplicados y seguimos el loop
unicos = Join(oDic.Keys, " ")
sCadena = Trim(unicos)
matrix2 = Split(sCadena, " ")
'contamos los números y letras aleatorios únicos que vamos generando
j = UBound(matrix2) + 1
Loop
'Pasamos los datos a la función
CADENA_UNICOS = sCadena
End With
'Vaciamos variable de objeto
Set oDic = Nothing
End Function

Es prácticamente igual a la macro, pero hay que tener en cuenta los parámetros, que ahora los vamos a seleccionar directamente desde la función.

Sus parámetros son (sin comillas):

LARGO: es la longitud que deseamos dar a nuestra cadena.
MIN y MAX: se trata del rango mínimo y máximo con el que se generará la función aleatorio.entre.

En este caso, queremos un largo de 10 caracteres (no cuentan los blancos),  y números entre el 1 y el 9:

CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

Y de esta forma tenemos el resultado de la función en una celda y según lo especificado.

Un dato importante, si el número que indicamos en el argumento “LARGO” es mucho mayor a MAX, es posible que la función no responda, dado que se puede producir que estemos buscando una cadena de números aleatorios más alta de los que podemos generar según los parámetros.

Por ejemplo, si estuviésemos trabajando solo con una cadena numérica y especificásemos un largo de 10 y usar números de 1 a 9, la aplicación se bloqueará en un bucle sin fin. En esta macro, esto no se produce con esa claridad, dado que introducimos letras, y por lo tanto no se puede realizar un control. Por ello, tratad de indicar el argumento MAX mayor que LARGO.

Los números o caracteres aleatorios están separados por un espacio, que no se cuenta pero sirve como separador.

Como siempre, os dejo el ejemplo:

Descarga el archivo de ejemplo pulsando en: CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

¿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