OBTENER SUMA DE UN RANGO QUE CONTIENE ERRORES

Hola a todos!:

Últimamente recibo muchos correos preguntando por pequeños problemas cotidianos cuando usamos Excel, uno muy recurrente es el de obtener una suma de un rango que contiene errores.

Por ejemplo:

obtener suma de un rango que contiene errores

Como podéis observar, en el rango tenemos un error y por lo tanto el resultado de la función suma devuelve nos devuelve error.

Para poder solucionar este problema podemos recurrir a la función SI.ERROR y combinarla con SUMA y ejecutarla matricialmente. Esta sería la fórmula:

{=SUMA(SI.ERROR(B2:B20;""))}

Este es el resultado:

obtener suma de un rango que contiene errores1

Os recuerdo que las matrices se introducen: seleccionando la fórmula y luego presionando CTRL + MAYUS + ENTRAR.

Y eso es todo, un truco sencillo que nos puede ayudar en nuestros reportes, sobre todo cuando los datos que nos llegan contiene errores.

Descarga el archivo de ejemplo pulsando en: OBTENER SUMA DE UN RANGO QUE CONTIENE ERRORES

¿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

FUNCIONES MAX.SI.CONJUNTO Y MIN.SI.CONJUNTO

Hola a todos!.

Feliz año!, os deseo para este 2019 lo mejor.

Con el nuevo Excel 2019 y también con la suscripción de office 365. Se han publicado una serie de funciones que tienen como objetivo facilitarnos nuestro trabajo.

En este post quiero detenerme en estas dos funciones, MAX.SI.CONJUNTO y MIN.SI.CONJUNTO. Realmente no dejan de ser un concepto muy parecido a las conocidas funciones SUMAR.SI.CONJUNTO o CONTAR.SI.CONJUNTO, solo que lo que buscamos es obtener el valor máximo o mínimo de un rango en función de varias condiciones.

Veamos un ejemplo:

funciones max.si.conjunto y min.si.conjunto

Imaginad que tenéis estas cantidades y necesitáis obtener el máximo en los casos en los que se cumpla una determinada condición (para este ejemplo, que los parámetros 1 y 2 sean igual a 1).

Pues bien, si realizamos un filtro veremos esto:

funciones max.si.conjunto y min.si.conjunto_1

Efectivamente, el valor máximo es 14754 y el mínimo es 2676. Esto mismo es lo que obtendremos si aplicamos la fórmula, así:

funciones max.si.conjunto y min.si.conjunto_2

Como podéis observar, los resultados son correctos y podríamos seguir utilizando nuevas condiciones.

Si alguna de las condiciones es texto, debemos expresarlo entre comillas dobles, y también podremos utilizar los signos de mayor o menor como criterios.

Creo que son fórmulas muy interesantes que facilitan nuestras tareas sin necesidad de recurrir a código o a funciones matriciales.

Descarga el archivo de ejemplo pulsando en: FUNCIONES MAX.SI.CONJUNTO Y MIN.SI.CONJUNTO

¿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

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