OBTENER DATOS DE OTRO ARCHIVO CON ADO E IMPORTAR VARIAS CONSULTAS EN TABLAS

Hola a todos!:

En esta web hay varios post dedicados a ADO y sus ventajas a la hora de obtener información a través de consultas. En el ejercicio de hoy os propongo lo siguiente:

Pulsando un botón de comando en nuestra hoja procederemos a seleccionar un archivo, previamente indicaremos ciertos criterios en cada consulta y lanzaremos nuestro proceso. A continuación obtendremos la información y la importaremos a nuestra hoja.

Veamos el proceso con vídeo:

Efectivamente en una carpeta tenemos el siguiente archivo:

obtener datos de otro archivo con ado e importar varias consultas en tablas

En este archivo tenemos la siguiente información:

obtener datos de otro archivo con ado e importar varias consultas en tablas_1

Y queremos importarnos tres consultas de esta base de datos:

1: Empleados con ID > que 9 y queremos Nombre Completo e ID.
2: Empleados que solo sean Mujeres y traemos ID, Nombre Completo y Estudios.
3: Empleados cuyos estudios son Licenciados y nos traemos ID, Nombre Completo y Edad.

Estas consultas se realizarán en SQL desde nuestro código. Lo primero que debemos hacer es seleccionar el archivo BASE_DATOS para obtener la información.

Eso lo realizaremos con el siguiente código:

narchivos = Application.GetOpenFilename(filefilter:="Excel (*.xls*),*.xls", _
Title:="SELECCIONAR ARCHIVO", MultiSelect:=False)
If narchivos = False Then Exit Sub

Seleccionamos archivo:

obtener datos de otro archivo con ado e importar varias consultas en tablas_2

Una vez que lo tenemos seleccionado, ya podemos pasar las consultas, serían estas:

obSQL = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO] FROM [Hoja1$] WHERE [Hoja1$].[ID]> 9"
obSQL1 = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO], [Hoja1$].[ESTUDIOS] FROM [Hoja1$] WHERE [Hoja1$].[SEXO]= 'MUJER'"
obSQL2 = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO], [Hoja1$].[EDAD] FROM [Hoja1$] WHERE [Hoja1$].[ESTUDIOS]= 'LICENCIADOS'"

Ahora debemos utilizar el resto de la macro

'Iniciamos un loop que recorra todas las consultas (las incluimos en un array)
For Each consulta In Array(obSQL, obSQL1, obSQL2)
'Iniciamos la conexión con la base de datos
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Connectionstring = "DATA SOURCE=" & narchivos
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Grabamos los datos
Set Dataread = New ADODB.Recordset
With Dataread
.Source = consulta
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
With Sheets("Hoja1")
Do Until Dataread.EOF
Dataread.MoveFirst
'Pasamos datos a la hoja
.Cells(2, d).CopyFromRecordset Dataread
'Incluimos encabezados
For i = 0 To Dataread.Fields.Count - 1
If IsDate(Dataread.Fields(i).Name) Then
Titulos = CDate(Dataread.Fields(i).Name)
Else
Titulos = Dataread.Fields(i).Name
End If
.Cells(1, d + i) = Titulos
Next i
Loop
'Convertimos cada consulta en una tabla
fin = .Cells(Rows.Count, d).End(xlUp).Row
Range(.Cells(1, d), .Cells(fin, d + i - 1)).Select
Set objTable = ActiveSheet.ListObjects.Add(xlSrcRange, Selection, xlYes)
objTable.Name = "Tabla" & x
End With
d = d + i + 1
x = x + 1
Next consulta
'Liberamos variables
Dataread.Close: Set Dataread = Nothing
cnn.Close: Set cnn = Nothing

El resultado de nuestro proceso es el siguiente:

OBTENER DATOS DE OTRO ARCHIVO CON ADO E IMPORTAR VARIAS CONSULTAS EN TABLAS_3.jpg

Como podéis observar, hemos ejecutado las tres consultas en el mismo módulo utilizando una instrucción for – each en una matriz que va generando las consultas una a una. Cada vez que recibimos los datos, los importamos y de damos formato tabla.

Esto último es importante, dado que si vinculamos gráficos o tablas dinámicas a esta información, no tenemos que escribir código adicional si aumenta  el rango de datos, siempre haremos referencia a la tabla (que además hemos renombrado).

Trabajando con ADO resulta mucho más sencillo obtener la información, y con nuestro código podemos transformarla hasta obtener lo que necesitamos. Por ello, y aunque ya lo indico siempre que trabajamos con ADO, debéis activar las referencias en vuestro editor de de VBA:

OBTENER DATOS DE OTRO ARCHIVO CON ADO E IMPORTAR VARIAS CONSULTAS EN TABLAS_4.jpg

En resumen, la idea es no sobrecargar nuestra hoja de Excel de datos que no necesitamos, simplemente, seleccionamos el archivo fuente e importamos la información de interés previamente seleccionada con consultas.

Para finalizar, os dejo la macro completa:

Option Explicit
Sub CONSULTAS_SQL_ADO()
'Definimos variables
Dim Dataread As ADODB.Recordset, cnn As ADODB.Connection, Titulos As String, objTable As Variant
Dim d As Double, x As Double, i As Double, fin As Double, narchivos As Variant
Dim consulta As Variant, obSQL As String, obSQL1 As String, obSQL2 As String
Dim Table As Variant
'Seleccionamos archivos
Application.ScreenUpdating = False
narchivos = Application.GetOpenFilename(filefilter:="Excel (*.xls*),*.xls", _
Title:="SELECCIONAR ARCHIVO", MultiSelect:=False)
If narchivos = False Then Exit Sub
'Eliminamos tablas insertadas en consultas anteriores
For Each Table In ActiveSheet.ListObjects
Table.Delete
Next Table
'Definimos consultas
obSQL = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO] FROM [Hoja1$] WHERE [Hoja1$].[ID]> 9"
obSQL1 = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO], [Hoja1$].[ESTUDIOS] FROM [Hoja1$] WHERE [Hoja1$].[SEXO]= 'MUJER'"
obSQL2 = " SELECT [Hoja1$].[ID], [Hoja1$].[NOMBRE COMPLETO], [Hoja1$].[EDAD] FROM [Hoja1$] WHERE [Hoja1$].[ESTUDIOS]= 'LICENCIADOS'"
d = 1
x = 1
'Iniciamos un loop que recorra todas las consultas (las incluimos en un array)
For Each consulta In Array(obSQL, obSQL1, obSQL2)
'Iniciamos la conexión con la base de datos
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Connectionstring = "DATA SOURCE=" & narchivos
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Grabamos los datos
Set Dataread = New ADODB.Recordset
With Dataread
.Source = consulta
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
With Sheets("Hoja1")
Do Until Dataread.EOF
Dataread.MoveFirst
'Pasamos datos a la hoja
.Cells(2, d).CopyFromRecordset Dataread
'Incluimos encabezados
For i = 0 To Dataread.Fields.Count - 1
If IsDate(Dataread.Fields(i).Name) Then
Titulos = CDate(Dataread.Fields(i).Name)
Else
Titulos = Dataread.Fields(i).Name
End If
.Cells(1, d + i) = Titulos
Next i
Loop
'Convertimos cada consulta en una tabla
fin = .Cells(Rows.Count, d).End(xlUp).Row
Range(.Cells(1, d), .Cells(fin, d + i - 1)).Select
Set objTable = ActiveSheet.ListObjects.Add(xlSrcRange, Selection, xlYes)
objTable.Name = "Tabla" & x
End With
d = d + i + 1
x = x + 1
Next consulta
'Liberamos variables
Dataread.Close: Set Dataread = Nothing
cnn.Close: Set cnn = Nothing
End Sub

Y con esto tenemos ya creado nuestro proceso de información para la generación de cualquier tipo de informe o reporte.

Espero que os haya resultado de interés.

Descarga el archivo de ejemplo pulsando en: OBTENER DATOS DE OTRO ARCHIVO CON ADO E IMPORTAR VARIAS CONSULTAS EN TABLAS

Y también el archivo de la base de datos para que realicéis la prueba: BASE DATOS

¿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

ORDENAR COLUMNAS DE FORMA ASCENDENTE O DESCENDENTE SI SON PARES O IMPARES

Hola a todos!:

Hace unos días me pedían que modificase una macro publicada hace unos años en esta web para hacer lo siguiente:

Que ordenase los datos contenidos en varios columnas de forma ascendente o descendente en función de si la columna era par o impar. Sobre este punto he de puntualizar que las columnas deben ser contiguas (no deben existir columnas en blanco).

Tenemos los siguiente datos:

ordenar columnas de forma ascendente o descendente si son pares o impares

Lo que pretendemos es que cuando la columna sea par los datos se ordenarán de forma descendente y si son impares, ascendente.

Para ello utilizaremos la siguiente rutina, utilizando un loop for-next para recorrer todas las columnas y obtener así su número.

Sub OrdenarColumnas()
Dim i As Double
'Definimos cuantas columnas debemos ordenar contando las que tienen contenido
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
If Application.WorksheetFunction.IsEven(i) Then
'Verificamos si la columna es par o impar
Range(Cells(1, i), Cells(1, i).End(xlDown)).Select
'Si la columna es par, ordenamos descendente
Selection.AutoFilter
Range(Cells(1, i), Cells(1, i).End(xlDown)).Sort Key1:=Cells(1, i), Order1:=xlDescending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Else
Range(Cells(1, i), Cells(1, i).End(xlDown)).Select
'Si la columna es impar, ordenamos ascendente
Selection.AutoFilter
Range(Cells(1, i), Cells(1, i).End(xlDown)).Sort Key1:=Cells(1, i), Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End If
Next
End Sub

Una vez aplicada la macro, tenemos el resultado que estamos buscando. Como podéis observar, hemos introducido una condición y utilizado la función IsEven para evaluar si el contenido de la variable “i” es par y si no lo es, será impar.

Pulsa en el botón ordenar y se ejecutará la macro:

ordenar columnas de forma ascendente o descendente si son pares o impares2

Y este fue la respuesta a la consulta realizada : )

Descarga el archivo de ejemplo pulsando en: ORDENAR COLUMNAS DE FORMA ASCENDENTE O DESCENDENTE SI SON PARES O IMPARES

¿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

ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)

Hola a todos! Qué tal estáis?, espero que muy bien.

Hace unos días un lector me hacía la siguiente consulta en relación a este post: ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB – FORMULARIO, necesitaba realizar el mismo ejercicio pero utilizando la propiedad “Name” en lugar del ID. (podéis visitar el post para ver el código de referencia).

Pues bien, en realidad los cambios que hay que hacer en la macro son pocos. En el ejercicio, mediante VBA enviamos al formulario de búsqueda de Excel Signum una palabra y desde el código ejecutamos la búsqueda y mostramos el resultado. Para hacerlo con la propiedad Name, debemos identificar los elementos a incluir en nuestra macro:

ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)

Como estamos trabajando con Name, tendremos que detectar los elementos necesarios para nuestro código, en este caso: name=”s” para indicar el contenido en buscador y “submit” para hacer click o ejecutar la búsqueda.

Así quedaría el código:

Sub CARGAR_DATOS_WEB_ByName()
Dim IE As Object
Dim document As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el name que hace referencia al cuadro de búsqueda
Set document = IE.document
With document
.getElementsByName("s")(0).Value = "ACCESS"
End With
'también buscamos "name" correspondiente al botón para buscar el valor
With document
.getElementsByName("submit")(0).Click
End With
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub

Como podéis observar identificamos el name (s) para indicar que el valor de la búsqueda sea “ACCESS”

.getElementsByName("s")(0).Value = "ACCESS"

y ejecutamos la búsqueda haciendo referencia al botón “Buscar”

.getElementsByName("submit")(0).Click

Este es el resultado:

ENVIAR DATOS DESDE EXCEL A UNA PAGINA WEB (CLASSNAME, NAME)1

Efectivamente, desde Internet Explorer se mostrará el resultado de la búsqueda con la palabra “ACCESS” en Excel Signum.

Pero aprovechando que estamos tratando las propiedades ID y Name, podemos también realizar el mismo código con ClassName.

Sub CARGAR_DATOS_WEB_ByClassName()
Dim IE As Object
Dim document As Object
Application.ScreenUpdating = False
'Creamos objeto internet explorer
Set IE = CreateObject("InternetExplorer.Application")
'abrimos web
IE.navigate "https://excelsignum.com/"
'esperamos a que se carguen todos los elementos
Do Until IE.ReadyState = 4
DoEvents
Loop
'si necesitamos más tiempo lo podemos configurar aquí
Application.Wait (Now + TimeValue("0:00:01"))
'localizamos el ClassName que hace referencia al cuadro de búsqueda
Set document = IE.document
With document
.getElementsByClassName("field")(0).Value = "ACCESS"
End With
'también buscamos "ClassName" correspondiente al botón para buscar el valor
With document
.getElementsByClassName("submit")(0).Click
End With
'hacemos visible la web.
IE.Visible = True
Set IE = Nothing
Application.ScreenUpdating = True
End Sub

El resultado es exactamente el mismo que con el código anterior. Y de esta forma ya podéis realizar el mismo ejercicio con el ID, el Name y el ClassName.

Obviamente existen otras formas de realizar estas programación, y es utilizando otros objetos en lugar en I.E. no obstante, eso lo iremos viendo en próximas publicaciones.

Espero que os resulta de interés : )

¿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

LIMPIAR CONTENIDO DE CONTROLES DE FORMULARIO EN HOJA EXCEL O EN USERFORM

Hola a todos!.

Hoy me gustaría dejaros un par de códigos para borrar el contenido de los controles de formulario, tanto aquellos que se insertan en la hoja excel como aquellos que insertamos en nuestros userform o formularios en el editor de VBA.

Voy a comenzar con los controles insertados en una hoja (controles ActiveX), por ejemplo una en la que tengamos varios: Textbox, ComboBox, ListBox y CheckBox. Para que podamos automatizar el proceso de forma óptima debemos utilizar la instrucción Select Case:

Sub LIMPIAR_CONTROLES()
With ActiveSheet
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In .OLEObjects
Select Case TypeName(Control.Object)
Case "TextBox"
Control.Object.Text = vbNullString
Case "ComboBox"
Control.Object.Clear
Case "ListBox"
Control.Object.Clear
Case "CheckBox"
Control.Object.Value = False
End Select
Next Control
End With
End Sub

Dado que estamos trabajando con controles ActiveX debemos tratar en nuestro código con los objetos OLEObject, que son los que nos van a permitir interactuar con nuestra hoja. A continuación solo tendremos que especificar el tipo de objeto y la forma en la que debemos limpiarlo o vaciarlo en el Select – Case.

Con los Formularios o Userforms resulta más sencillo, dado que haremos referencia a la colección Controls. El resultado del código es similar al anterior:

Private Sub CommandButton1_Click()
'Por cada objeto que indiquemos en el select case, borramos contenido
For Each Control In Me.Controls
Select Case TypeName(Control)
Case "TextBox"
Control.Text = vbNullString
Case "ComboBox"
Control.Clear
Case "ListBox"
Control.Clear
Case "CheckBox"
Control.Value = False
End Select
Next Control
End Sub

Como podéis ver, ambas estructuras son idénticas (salvo por la forma de hacer referencia a los controles de formulario).

Dado que se trata de fragmentos de código bastante específicos y sencillos, considero que no requieren un archivo de ejemplo. Os invito a que los probéis en vuestros proyectos : )

¿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

BUCLES ANIDADOS. GENERAR SERIES NUMÉRICAS

Hola a todos:

En algunas ocasiones necesitamos generar series numéricas para nuestros proyectos. Dependiendo de las necesidades la complejidad de estos algoritmos suele ser alta, sin embargo podemos hacer un pequeño ejercicio a modo de ejemplo con el que se pueda comprender la idea.

Una forma de hacerlo es programando varios loops como bucles anidados, lo que nos proporcionará la técnica adecuada para la generación de números. Veamos una secuencia sencilla y cómo la podemos programar, imaginad que tenemos que generar la siguiente progresión:

1|1
1|2
1|3
1|4
1|5
1|6
1|7
1|8
1|9
1|10
2|1
2|2
2|3
2|4
2|5
2|6
2|7
2|8
2|9
2|10
3|1
3|2
3|3
3|4
3|5
3|6
3|7
3|8
3|9
3|10
4|1
4|2
4|3
4|4
4|5
4|6
4|7
4|8
4|9
4|10
5|1
5|2
5|3
5|4
5|5
5|6
5|7
5|8
5|9
5|10

Como podéis observar, cada 10 bucles aumentamos en +1 la fila de la izquierda. Lo hacemos hasta llegar a 5 (podríamos hacerlo hasta cualquier otro número y complicando hasta varias filas el resultado).

Para realizar esto, utilizaremos la siguiente rutina:

Sub GENERA_NUM()
'Declaramos variables
Dim i As Integer, j As Integer, n As Integer
Dim x As Integer, nNum As Variant
With Sheets(1)
.Cells(1, 1) = "DATOS"
'Iniciamos primer bucle, 1 a 5
'Mientras es 1 generamos segundo loop hasta 10
'cuando finaliza, pasamos a 2 y volvemos a generar loop hasta 10
For i = 1 To 5: For j = 1 To 10
'Creamos un contador
x = Application.CountA(.Range("A:A")) + 1
nNum = i & "|" & j
'Mostramos datos en la hoja1
.Cells(x, 1) = nNum
Next: Next
End With
End Sub

Como podéis observar, anidamos las dos rutinas de modo que se sincronizan para generar la información:

BUCLES ANIDADOS. GENERAR SERIES NUMERICAS

Este tipo de procedimientos se suele utilizar para la generación de programas de descifrado de contraseñas, seguridad, etc. Aunque en este caso lo estamos utilizando para crear una serie numérica.

Lo realmente importante es conocer la utilidad de los bucles anidados y cómo programarlos. Esta es una forma y aunque hay más, por hoy creo que es suficiente.

Os dejo el archivo para el “trasteo” : )

Descarga el archivo de ejemplo pulsando en: BUCLES ANIDADOS. GENERAR SERIES NUMÉRICAS

¿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

AÑADIR UN NÚMERO ESPECÍFICO DE HOJAS A VARIOS ARCHIVOS CON VBA

Hola a todos:

Hace unos días me enviaron una consulta en la que me preguntaban la forma de realizar un proceso en el que pudiese seleccionar varios archivos y crear en ellos tantas pestañas como sean especificadas.

Bien, esta es una consulta relativamente sencilla, evidentemente requiere programación pero con la información de algunos post publicados en esta web se puede resolver perfectamente.

Probaremos con un libro que contiene 2 hojas:

AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS CON VBA

Y queremos que tenga 5 hojas (contando con las que ya tenemos). Pues bien, para hacer este trabajo utilizaremos la siguiente macro:

Sub AÑADIR_HOJAS()
'Declaramos variables
Dim nArchivo As Variant, i As Long
Dim nHoja As Long, n As Long
Dim iHoja As Long
'Indicamos el número de hojas que queremos crear en nuestro libro
iHoja = Sheets("Hoja1").Cells(1, 2)
'Seleccionamos los archivos
Application.ScreenUpdating = False
nArchivo = Application.GetOpenFilename(FileFilter:="Excel (*.xls*),*.xls", _
Title:="SELECCIONAR ARCHIVOS", MultiSelect:=True)
'Si no seleccionamos nada salimos del proceso
If Not IsArray(nArchivo) Then
Exit Sub
Else
'Recorremos y abrimos cada archivo
For i = LBound(nArchivo) To UBound(nArchivo)
Workbooks.Open Filename:=(nArchivo(i))
'Contamos el número de hoja
nHoja = ActiveWorkbook.Worksheets.Count
'Seleccionamos la última hoja
Worksheets(nHoja).Select
'Añadimos hojas hasta completar las 5 que hemos indicado
For n = 1 To (iHoja - nHoja)
ActiveWorkbook.Sheets.Add after:=ActiveSheet
Next n
'Desactivamos advertencias y avisos y guardamos el archivo
Application.DisplayAlerts = False
ActiveWorkbook.Close SaveChanges:=True
Next i
End If
End Sub

Cuando ejecutamos el código, nos solicitará seleccionar uno o varios archivos y marcaremos en nuestra hoja el número de hojas a crear en los archivos que hemos seleccionado.

Luego, tras un loop que recorre cada libro y cuenta el número de hojas, pasaremos un segundo bucle que creará a partir de las hojas que ya tenemos el resto de hojas que deseamos generar. Este es el resultado:

AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS CON VBA1

Y esta ha sido la respuesta a la consulta : )

Descarga el archivo de ejemplo pulsando en: AÑADIR UN NUMERO ESPECIFICO DE HOJAS A VARIOS ARCHIVOS 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

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

Hola a todos!

El post de hoy será muy breve, es una pequeña explicación de cómo podemos utilizar un inputbox para modificar e interactuar con nuestros datos.

Vamos con el ejemplo, imaginad que tenemos una serie de fechas en una columna de nuestra hoja excel:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

Ahora vamos a programar un inputbox que nos permitirá seleccionar una fecha y, para este ejemplo, que si alguna de las fechas indicadas es mayor que la fecha que hemos indicado, coloree de verde esa celda.

El código que vamos a usar es el siguiente:

Sub EJEMPLO_INPUTBOX()
'Declaramos las variables
Dim Mensaje As String, Titulo As String, Formato As String
Dim MiFecha As Date, i As Long, fin As Long
'Indicamos el mensaje a mostrar
Mensaje = "INTRODUCE LA FECHA DE REFERENCIA." + Chr(13) + Chr(13) + "EL FORMATO DEBE SER: DIA/MES/AÑO"
'Indicamos el título del inputbox
Titulo = "ATENCION"
'Indicamos el contenido del cuadro de texto
Formato = "00/00/0000"
'Pasamos todos los datos al inputbox y formateamos el contenido a fecha
MiFecha = CDate(inputbox(Mensaje, Titulo, Formato))
'Con un loop recorremos los datos
With Sheets("Hoja1")
fin = Application.CountA(.Range("A:A"))
For i = 2 To fin
'Si las fechas de la hoja son mayores que la que he indicado en el inputbox
'entonces coloreamos la celda de color verde
If .Cells(i, 1) > MiFecha Then .Cells(i, 1).Interior.Color = vbGreen
Next i
End With
End Sub

Al ejecutarlo, mostraremos inicialmente el formato de fecha que queremos que se indique:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS1

Una vez que introducimos la fecha, por ejemplo el 23/05/2018:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS2

Y pulsamos aceptar, ya tenemos el resultado que esperamos:

UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS3

Y ya lo tenemos!. Por supuesto, en la macro podéis programar otros controles para controlar errores que puedan saltar si el formato de la fecha no es válido o no seleccionamos una fecha. Con simple “On error goto” lo podríamos hacer perfectamente.

Y eso es todo, espero que os sea de utilidad.

Descarga el archivo de ejemplo pulsando en: UTILIZAR UN INPUTBOX CON VBA PARA MODIFICAR DATOS

¿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