CONTAR PALABRAS EN EXCEL

Hola a todos!

Ayer un lector me pedía un fórmula para poder contar palabras en Excel. Supongo que era para delimitar en un informe la cantidad de palabras que un usuario podía escribir.

Lo cierto es que es muy común delimitar de alguna forma el espacio de escritura en los informes, aunque suele hacerse por caracteres escritos y no tanto por palabras, sin embargo también es posible hacerlo.

Para conseguirlo, y sin necesidad de acudir a la programación, tan solo necesitaremos usar la combinación de varias fórmulas:

=SI(LARGO(A2)=0;0;LARGO(ESPACIOS(A2))-LARGO(SUSTITUIR((A2);" ";""))+1)& " palabras"

Con esta función, donde combinamos las funciones LARGO y SUSTITUIR será muy sencillo. Contamos todos los caracteres en nuestra frase (incluidos los espacios en blanco) y le restamos los mismos caracteres pero sin esos espacios en blanco, la diferencia es el número de palabras. Usaremos un condicional para en caso de no existir palabras nos ponga un “0”.

El resultado de la fórmula es este:

CONTAR PALABRAS EN EXCEL

Descarga el archivo de ejemplo pulsando en: CONTAR PALABRAS EN EXCEL

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

Anuncios

PASAR INFORMACIÓN DE UN RANGO A UNA CELDA USANDO FÓRMULAS

Hola a todos!.

El post de hoy va a tratar sobre cómo podemos pasar el contenido de un rango a una celda usando solo fórmulas y sin recurrir a VBA.

En un post anterior os comentaba la forma de hacerlo con macros: PASAR INFORMACIÓN DE UN RANGO A UNA CELDA

Y también recordar que con las últimas actualizaciones de Excel (pero con una suscripción a Office 365) esto se puede realizar fácilmente con la función UnirCadenas.

Pero este post está pensado para esas situaciones de emergencia, cuando no tenemos tiempo ni para programar ni tampoco acceso a office 365 (por los motivos que sean).

Veamos un ejemplo, en la columna A tenemos un texto que está distribuido en diferentes celdas:

PASAR INFORMACION DE UN RANGO A UNA CELDA USANDO FORMULAS

La idea es pasar la información a una única celda y además dejarla colocada con la misma estructura en vertical añadiendo saltos de línea.

Necesitaremos una celda auxiliar para realizar nuestro trabajo, en la que vamos a usar la función concatenar y seleccionar el rango con los datos:

PASAR INFORMACION DE UN RANGO A UNA CELDA USANDO FORMULAS1

A continuación, seleccionamos la fórmula y pulsamos F9 en el teclado. El resultado es que se mostrarán los datos que se han añadido a la matriz de la función:

PASAR INFORMACION DE UN RANGO A UNA CELDA USANDO FORMULAS2

Ahora lo que tenemos que hacer es eliminar el igual = y los paréntesis { } y nos quedará una cadena de texto con la información lista para tratar con una última fórmula:

PASAR INFORMACION DE UN RANGO A UNA CELDA USANDO FORMULAS3

Efectivamente, con la última fórmula utilizamos una función anidada con “sustituir”:

=SUSTITUIR(SUSTITUIR(B9;CARACTER(34);" ");";";CARACTER(10))

En la fórmula inicial, sustituimos las comillas dobles CARACTER(34), por un espacio y en la segunda (la anidada), sustituimos el punto y coma por un salto de línea CARACTER(10).

El resultado es el que podéis ver, hemos pasado la información de un rango a una celda e incluso hemos dejado el mismo formato.

Aunque no sea un proceso limpio con una sola función o usando macros, estoy seguro que en algún momento os ayudará en alguna situación apurada (a mí me ha ayudado en más de una ocasión).

No dejaré archivo de prueba porque se trata de un proceso semiautomático.

Y eso es todo!, hasta el próximo post 🙂

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS

Hola a todos, ¿qué tal estáis?, ¡espero que bien!.

Hace unos días envié a un lector las instrucciones para ejecutar un procedimiento programado en Access usando el programador de tareas de windows. En el post de hoy mostraré la manera de poder hacer de una forma muy sencilla en Excel.

Antes de comenzar vamos a seleccionar una tarea que queramos que se ejecute todos los días y cuya ejecución se realice mediante una macro. Por ejemplo que todos los días a las siete de la mañana nuestro ordenador cierre Microsoft Word en nuestro equipo.

Para ello, tenemos en esta web una macro que sirve para cerrar programas, entre ellos, word: CERRAR UN PROGRAMA DESDE EXCEL CON VBA

Y vamos a añadir en el módulo de Thisworkbook:

Private Sub Workbook_Open()
Call Cierra_Programa
End Sub

A continuación os mostraré cómo acceder al programador de tareas, lo más fácil es usar el buscador de nuestra barra de herramientas o preguntar a “Cortana” por el programador de tareas:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS

Una vez que lo tenemos abierto, se nos mostrarán una serie de pantallas que iremos completando:

En la primera pantalla se nos presentan varias acciones a realizar, en nuestro ejemplo, elegiremos crear una tarea básica:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS2

A continuación, debemos nombrar nuestra tarea y añadir un breve descripción. Luego pulsamos en “Siguiente”:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS3

En la siguiente pantalla “Desencadenar”, vamos a indicar la periodicidad con la que queremos que se ejecute nuestra tarea y la hora:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS4

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS5

En el siguiente paso debemos marcar la opción “Iniciar un programa“:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS6

Y en la siguiente pantalla debemos seleccionar el archivo en el que hemos incluido la macro para cerrar word:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS7

Finalmente pulsamos en finalizar y se nos mostrará un resumen con los pasos realizados:

EJECUTAR UNA MACRO CON EL PROGRAMADOR DE TAREAS DE WINDOWS8

Ahora ya tenemos la tarea creada y, cuando lleguen las siete de la mañana, windows abrirá el archivo que hemos indicado y, como hemos incluido un macro en el evento workbook.open:

Private Sub Workbook_Open()
Call Cierra_Programa
End Sub

La macro se ejecutará en el instante Excel se abra. Os recomiendo que modifiquéis la seguridad de macros para evitar que las macros queden bloqueadas por el propio Excel.

Si en algún momento queréis prescindir de una tarea, solo tenéis que volver al programador, localizar la tarea y eliminarla.

Para este ejemplo, no voy dejar archivo, dado que es puramente teórico, os propongo que la práctica la realicéis vosotros según vuestras necesidades.

Importante: Para que funcione debéis dejar el ordenador encendido, no es necesario que Excel esté abierto, ese trabajo lo hará Windows por nosotros.

Y eso es todo, espero que os haya sido de utilidad.

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTÓRICOS

Hola a todos!.

Después de varios días sin publicar en la web, por fin tengo un poco de tiempo para escribir un breve post.

Muchas de las consultas que me envían las suelo resolver muy rápido cuando no son demasiado complejas o cuando son para resolver una parte específica de una rutina o una función. Hoy quiero publicar una de esas consultas, que aunque es sencilla y puede resultar obvia, hay que tener en cuenta que muchos lectores están empezando con Excel tanto en fórmulas como en macros, y siempre está bien detenerse en este tipo de ejercicios.

En este caso, un lector me enviaba una serie de fechas de un histórico pero que solo las fechas de inicio y me preguntaba la forma de obtener automáticamente la fecha final del periodo, esta es la información de partida:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS

Pues bien, este trabajo lo podemos hacer de una manera sencilla con una fórmula:

=SI(A2=A3;FECHA(AÑO(B3);MES(B3);DIA(B3)-1);"")

O incluso más sencillo todavía:

=SI(A2=A3;B3-1;"")

Y obtenemos el siguiente resultado:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS1

Como podéis ver, obtenemos la fecha fin y cuando llegamos a la última fecha del ID lo dejamos en blanco dado que la fecha debe quedar abierta.

La razón de utilizar la función fecha en la fórmula es para mostrar cómo podemos traducir esta función en lenguaje VBA. Es decir, en VBA no podemos usar directamente la función DATE dado que no permite introducir los argumentos de año, mes y día. Para poder trasladar la función fecha a VBA debemos usar DateSerial, aquí os dejo la macro:

Sub FECHAS()
'Declaramos variables
Dim i As Integer, Fin As Integer
Dim fecha As Date
'Trabajamos en la hoja2
With Sheets("Hoja2")
Fin = Application.CountA(.Range("A:A"))
'calculamos la fecha de cierre del registro actual
For i = 2 To Fin
fecha = .Cells(i + 1, 2)
If .Cells(i, 1) = .Cells(i + 1, 1) Then
.Cells(i, 3) = DateSerial(Year(fecha), Month(fecha), Day(fecha) - 1)
Else
.Cells(i, 3) = ""
End If
Next i
End With

End Sub

De esta forma podemos introducir las funciones Year, Month y Day con la variable “fecha”. Una vez ejecutada la macro, este es el resultado:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS2

Aunque a nivel VBA es una rutina sencilla, seguro que en algún momento os puede resultar útil, ya sea el uso de DateSerial o de la propia función fecha().

Aunque no lo comenté al principio, en este ejemplo es obvio que antes de aplicar la fórmula o ejecutar la macro, si los datos están desordenados, debemos ordenar primero por fecha y luego por ID.

Descarga el archivo de ejemplo pulsando en: TRABAJAR CON FECHAS PARA RECONSTRUIR HISTÓRICOS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

CONTAR REGISTROS ÚNICOS CON VARIOS CRITERIOS

Hola a todos:

Hoy voy a trabajar un poco con formulación clásica de Excel. En concreto vamos a contar registros únicos en función de varios criterios. Para ello he preparado una sencilla tabla con unos datos que nos van a servir de ejemplo:

CONTAR REGISTROS UNICOS CON VARIOS CRITERIOS

Imaginad que queremos contar los registros únicos de la columna C que dependan de “Dirección de Area 1 y que el criterio de la columna B sea mayor o igual a 1. Es decir:

CONTAR REGISTROS UNICOS CON VARIOS CRITERIOS1

Qué los registros únicos serán 3, las Subdirecciones Zona 1.1, 1.2 y 1.3

Para poder realizar esto con una fórmula vamos a utilizar la siguiente función matricial:

{=CONTAR(1/FRECUENCIA(SI(Hoja1!$A$2:$A$18="Dirección Area 1";SI(Hoja1!$B$2:$B$18>=1;COINCIDIR(Hoja1!$C$2:$C$18;Hoja1!$C$2:$C$18;0)));FILA($A$2:$A$18)-FILA(DESREF($A$2:$A$18;;;1;))+1))}

Como podéis ver, estamos usando varios fórmulas, CONTAR, FRECUENCIA, SI, COINCIDIR, FILA y DESREF.

El resultado es el siguiente:

CONTAR REGISTROS UNICOS CON VARIOS CRITERIOS2

Obviamente, la fórmula se puede modificar variando e incluyendo nuevos criterios, solo debéis realizar algunas pruebas.

Os recuerdo que las matrices se introducen: seleccionando la celda que contiene la fórmula, pulsando en F2 , seleccionamos la fórmula y luego presionamos CTRL + MAYUS + ENTRAR

Descarga el archivo de ejemplo pulsando en: CONTAR REGISTROS ÚNICOS CON VARIOS CRITERIOS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!

ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y VBA

Hola a todos, ¿qué tal estáis?, espero que muy bien.

En el post de hoy voy os mostraré un método para incorporar imágenes y texto en un correo que vamos a enviar desde Outlook pero utilizando VBA en Excel.

Este tema suele ser muy recurrente y no es la primera vez que me piden en la web una macro para realizar esta tarea.

En una hoja Excel utilizaré dos columnas, una para indicar el correo electrónico y otra para indicar el texto de correo que queremos enviar:

ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y VBA

Para enviar el correo utilizaremos la siguiente macro:

ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y VBA1

El código os lo dejo como imagen (el motivo es el campo HTMLBody que al tener caracteres en HTML se ejecutan en el post y hacen que no se vea correctamente). De todas formas, en el adjunto lo podéis copiar.

En esta macro generamos un correo por cada línea de datos que tengamos en la hoja “CORREO”. Para que la imagen sea visible y se pueda embeber o incrustar en el correo primero hacemos referencia al lugar en el que se encuentra del equipo, en este caso es el logo de Excel Signum:

imagen = "C:\Users\Segu\Documents\EXCEL SIGNUM\EXCELSIGNUM.jpg"

Una vez que la hemos seleccionado la adjuntamos al correo e indicamos que no sea visible como archivo adjunto:

.Attachments.Add imagen, 0

Ahora que ya la tenemos, componemos con Html la firma del correo:

ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y VBA2

En la firma he incluido un hipervínculo a mi web y hago referencia a la imagen que hemos adjuntado y ocultado para que se muestre en el cuerpo del correo. Para que quede como si fuese una firma lo ponemos al final e incorporamos unos cuantos saltos de línea “br” antes del texto que he incluido en la variable “texto”.

El resultado es el siguiente:

ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y VBA3

Como podéis observar, ya tenemos nuestra firma con imagen y texto (y un vínculo) en nuestro cuerpo de correo. Perfecto!.

Este método solo funcionará correctamente en outlook, dado que estamos trabajando en todo momento con el objeto Outlook.applicatacion.

Y eso es todo, espero que os resulte de interés y lo podáis usar en vuestras comunicaciones.

Descarga el archivo de ejemplo pulsando en: ENVIAR FIRMA CON IMAGEN Y TEXTO DESDE OUTLOOK USANDO EXCEL Y 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!!

OBTENER NÚMEROS ALEATORIOS SIN DUPLICADOS

Hola a todos!:

Esta semana he recibido varias consultas y como siempre, me gustaría compartir con vosotros alguna de ellas.

En concreto, me pedían una macro que pudiese generar números aleatorios entre un rango establecido y que fuesen únicos, sin duplicados.

Bien, sobre este tema hay varias macros que se pueden encontrar por la red (incluso usando solo fórmulas), pero he querido dedicarle un poco de tiempo y desarrollar un código distinto y que creo que es más sencillo de comprender.

Como el lector quería que a través de la hoja Excel pudiera indicar la cantidad de números a generar y también el tramo entre los que obtener los números, lo adapté a sus necesidades.

Utilizaremos la “Hoja1” e indicaremos los siguientes campos donde vamos a generar 5 números aleatorios y únicos entre el 1 el 50 (ambos inclusive):

OBTENER NUMEROS ALEATORIOS SIN DUPLICADOS

Ahora, para poder generar la información, debemos pegar este código en un módulo estándar de nuestros editor de VBA:

Option Explicit
Sub OBTENER_NUMEROS_ALEATORIOS_UNICOS()
'Declaramos variables
Dim oDic As Object, palabra As Variant
Dim Micelda As String, matrix1 As Variant, matrix2 As Variant
Dim sCadena As String, i As Integer, unicos As String
Dim j As Integer, nNum As Double, fin As Integer
With Sheets("Hoja1")
'eliminamos información generada en la consulta anterior.
fin = .Range("A2", .Range("A" & .Rows.Count).End(xlUp)).Rows.Count
.Range("A2:A" & 2 + fin).ClearContents
'Creamos objeto diccionario
Set oDic = CreateObject("scripting.dictionary")
'Ejecutamos loop hasta el total de números que queremos obtener
Do Until j = .Cells(2, 6)
'generamos aleatorios entre 1 y 50
nNum = Application.WorksheetFunction.RandBetween(.Cells(4, 6), .Cells(4, 7))
'componemos string con los números que vamos generando
Micelda = Micelda & " " & nNum
matrix1 = Split(Micelda, " ")
'Eliminamos números 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 aleatorios únicos que vamos generando
j = UBound(matrix2) + 1
Loop
'Pasamos los datos a la hoja1
matrix2 = Split(sCadena, " ")
For j = 0 To UBound(matrix2)
.Cells(j + 2, 1) = matrix2(j)
Next j
End With
'Vaciamos variable de objeto
Set oDic = Nothing
End Sub

El resultados que vamos a obtener es el siguiente:

OBTENER NUMEROS ALEATORIOS SIN DUPLICADOS1

La macro genera correctamente la cantidad de números que hemos indicado y entre el rango establecido. Básicamente, lo que hacemos es ir componiendo una cadena de texto con los números que se van generando aleatoriamente y a la vez con el objeto dictionary eliminando los duplicados hasta llegar a la cantidad especificada en la hoja Excel.

El loop se ejecutará tantas veces como sea necesario para llegar al valor que hemos indicado.

Esta aplicación resulta muy interesante y puede ser útil para multitud de tareas, desde un generador para obtener números de la lotería, primitiva, euromillones, etc hasta para tareas de encriptado.

Por cierto, si la usáis para jugar a loterías y os toca, acordaos de mi : )

Como siempre, os dejo la hoja con el ejemplo:

Descarga el archivo de ejemplo pulsando en: OBTENER NÚMEROS ALEATORIOS SIN DUPLICADOS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!