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

Anuncios

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

OBTENER VALOR DE UNA CELDA SEGÚN EL VALOR MÁXIMO DE UNA MATRIZ

Hola a todos!

El post de hoy surge como respuesta a una consulta de un lector, dice así:

Tengo el siguiente cuadro de inventario:
Columna A códigos que se repiten en varias oportunidades, podrían estar ordenados o no.
Columna B cantidad de unidades que trae una caja de ese producto.
Columna C cantidad de cajas del producto.
Necesitaría obtener el valor de B, pero del valor mas alto de C.
O sea:
A1 = 11809 ; B1 = 10 ; C1 = 2
A2 = 11809 ; B2 = 5 ; C2 = 5
A3 = 11809 ; B3 = 30 ; C3 = 1
El resultado debería ser igual a 11809 = 5

Este ejercicio se puede resolver con código o con fórmulas, para este caso la solución se la envié en forma de función, en realidad una combinación de varias.

obtener-valor-de-una-celda-segc3ban-el-valor-maximo-de-una-matriz

Pues bien, para obtener la solución vamos a comenzar con una fórmula matricial que nos va a permitir detectar el valor máximo de la columna C en función de un ID concreto, por ejemplo el 1321 y cuyo resultado será: 777. La fórmula utilizada es la siguiente (recordad que es matricial):

{=MAX(SI(A:A=F1;C:C))}

Ahora que ya conocemos el número más alto, debemos obtener la fila en la que se encuentra, que es la 6. Para ello vamos a utilizar la siguiente fórmula, COINCIDIR:

{=COINCIDIR(MAX(SI(A:A=F1;C:C));C:C;0)}

Una vez que tenemos este dado, debemos obtener las coordenadas de la celda a la izquierda (B6 o $B$6), para ello debemos añadir la función dirección en la que especificaremos que queremos la dirección de la celda 6 en la columna 2, es decir B6:

{=DIRECCION(COINCIDIR(MAX(SI(A:A=F1;C:C));C:C;0);2)}

Finalmente, debemos obtener el valor de esta celda (62), para ello solo nos queda una última función, INDIRECTO:

{=INDIRECTO(DIRECCION(COINCIDIR(MAX(SI(A:A=F1;C:C));C:C;0);2))}

 

El resultado final es el siguiente:

obtener-valor-de-una-celda-segc3ban-el-valor-maximo-de-una-matriz_1

Y finalmente lo hemos conseguido, el resultado es el que el lector ha indicado y funciona perfectamente. Hemos combinado 5 funciones para crear una que resuelve nuestra necesidad.

Recordad que para introducir las fórmulas matriciales debemos seleccionar la fórmula y presionar: CTRL + MAYUS + ENTRAR

Y esto es todo, espero que os sea de utilidad : )

Descarga el archivo de ejemplo pulsando en: OBTENER VALOR DE UNA CELDA SEGÚN EL VALOR MÁXIMO DE UNA MATRIZ 

¿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

USO COMBINADO DE LAS FUNCIONES SUMAPRODUCTO E IGUAL, DISCRIMINAR MAYÚSCULAS Y MINÚSCULAS.

Hola  a todos:

Hoy seguiré hablando sobre fórmulas, aunque muchas de las consultas que me envían son sobre programación, lo cierto es que también me llegan muchas dudas sobre fórmulas y cómo utilizarlas, por lo que creo que es interesante darle visibilidad para que todos nos podamos beneficiar : )

Esta es la consulta que me enviaban:

“Hola, tengo una consulta. El countif no diferencia entre mayusculas y minusculas. Si tengo el nombre “CASA” y en otra celda “casa” dirá que es duplicado pero yo necesito que lo diferencie. Alguna idea?

muchas gracias”

 

Pues bien, el tema de la discriminación de mayúsculas y minúsculas cuando usamos fórmulas suele ser bastante recurrente y en el caso que nos ocupa, el lector necesita contar y por lo tanto diferenciar las minúsculas y mayúsculas.

Para solucionar esto, tenemos varias posibilidades y aunque algunas de ellas requieren utilizar columnas auxiliares (algo que suelo utilizar solo cuando no queda más remedio), lo más eficiente es trabajar con una única celda.

Vamos con un ejemplo:

USO COMBINADO DE LAS FUNCIONES SUMAPRODUCTO E IGUAL

En la columna C debemos contar las veces que se repite “cultura y ocio” en minúscula. Pues bién para hacerlo utilizaremos la combinación de la función SUMAPRODUCTO e IGUAL:

=SUMAPRODUCTO(IGUAL($C$2:$C$64980;"cultura y ocio")*1)

También se podría omitir la multiplicación del 1 del final (necesario para pasar los datos a número de la función sumaproducto, utilizando el siguiente operador “–“:

=SUMAPRODUCTO(--IGUAL($C$2:$C$64980;"cultura y ocio"))

En ambos casos el resultado es de “3”

Y si necesitamos introducir otra condición, también lo podemos hacer. Por ejemplo las veces que se repite “cultura y ocio” y el sexo es MUJER:

=SUMAPRODUCTO(IGUAL($C$2:$C$64980;"cultura y ocio")*1;(IGUAL($E$2:$E$64980;"MUJER")*1))

O también:

=SUMAPRODUCTO(--IGUAL($C$2:$C$64980; "cultura y ocio");--(IGUAL($E$2:$E$64980;"MUJER")))

El resultado es 1 en los dos casos.

USO COMBINADO DE LAS FUNCIONES SUMAPRODUCTO E IGUAL1

Os dejo el ejercicio con las fórmulas utilizadas. Por cierto, para mostrarlas, he utilizado la función =formulatexto() que sirve para mostrar las fórmulas que contiene una celda.

Descarga el archivo de ejemplo pulsando en: USO COMBINADO DE LAS FUNCIONES SUMAPRODUCTO E IGUAL

¿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

USO COMBINADO DE LA FUNCIÓN INDICE Y COINCIDIR

Hola a todos!

Hoy toca formulación!, No todo van a ser macros y programación : )

Hace unos días me enviaron una consulta en la que solicitaban una fórmula para mostrar cierta información.

Os mostraré un ejemplo de sencillo de lo que se buscaba y las fórmulas que utilicé. Primero veamos los datos y que se necesita buscar:

USO COMBINADO DE LA FUNCIÓN INDICE Y COINCIDIR

Como podéis observar, necesitamos mostrar en la columna “B” la fecha que aparece en fila 3, pero en función de la coincidencia del importe que aparece en la columna A. Es decir, en la celda B6 debe aparecer la fecha: “2015”, en la B7: “2016” y así en adelante.

Para hacer esto (se puede hacer de varias formas), os propongo utilizar las funciones COINCIDIR e INDICE.

Con la primera podemos extraer el número de columna en la que se encuentra el dato buscado:

=COINCIDIR(A6;C6:J6;0)

El resultado sería “5”

Con la segunda, vamos a ser capaces de localizar la fecha, debemos analizar su sintaxis para comprenderlo mejor:

Indice (matriz, número de fila, número de columna).

Matriz: sería C3:J3
Fila: la 1
Columna: COINCIDIR(A6;C6:J6;0)

Ambas funciones combinadas darían lugar a esta fórmula:

=INDICE($C$3:$J$3;1;COINCIDIR(A6;C6:J6;0))

Y el resultado es el esperado:

USO COMBINADO DE LA FUNCIÓN INDICE Y COINCIDIR1

Como podéis observar es una función bastante sencilla pero muy eficiente utilizando ambas fórmulas.

Os dejo el archivo para lo probéis : )

Descarga el archivo de ejemplo pulsando en: USO COMBINADO DE LA FUNCIÓN INDICE Y COINCIDIR

¿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