FUNCIÓN UNIR CADENAS EN EXCEL

Hola a todos!.

Con la versión office 365 y en concreto en Excel, Microsoft publicó en su momento algunas funciones nuevas que no se encuentran en otras versiones de Excel. Una de ellas es la función UnirCadenas. 

Esta función nos permite seleccionar un rango de celdas y pasar el contenido a una celda en modo cadena de texto. Su sintaxis es la siguiente:

UNIRCADENAS(delimitador, ignorar_vacío, Texto1, [Texto2],…)

Donde el delimitador puede ser un espacio en blanco, una coma, etc, y pudiendo evitar las celdas vacías en la composición de nuestro string.

El ejemplo sería este:

FUNCIÓN UNIR CADENAS EN EXCEL

Es decir, pasamos el rango de A2:A15 a una celda utilizando la fórmula. Sencillo, verdad?, así es.

Pero como siempre me gusta pensar en aquellos que no tienen el office 365 (por el motivo que sea), siempre podremos hacer lo mismo pero con VBA y construyendo nuestra propia función. Os la dejo aquí y luego explico:

Public Function UNECADENA(Delimitador As String, ignorar_vacio As Boolean, ByVal miRango As Range) As Variant
'Definimos variables
Dim celda As Range
Dim nCadena As String, sCadena As String
'Recorremos el rango y componemos string incluyendo el delimitador seleccionado e indicando si queremos incluir celdas vacías.
For Each celda In miRango
If ignorar_vacio = True And celda <> "" Then sCadena = sCadena & Delimitador & celda.Value
If ignorar_vacio = False Then sCadena = sCadena & Delimitador & celda.Value
Next
nCadena = Trim(Mid(sCadena, Len(Delimitador) + 1, Len(sCadena)))
UNECADENA = nCadena
End Function

Con esta UDF que acabo de programar podremos realizar el mismo trabajo que con la función UNIRCADENAS. La he denominado UNECADENA y funciona con la misma sintaxis que la función original:

Introducimos un delimitador, indicamos verdadero si queremos evitar las celdas vacías o falso si queremos que se tengan en cuenta y por último seleccionar el rango.

Aquí tenéis una prueba realizada con las dos funciones, utilizando el espacio como delimitador y teniendo en cuenta celdas vacías:

FUNCIÓN UNIR CADENAS EN EXCEL1

Y efectivamente, obtenemos el mismo resultado : )

Como habéis podido ver, mediante VBA hemos creado nuestra propia función para poder unir cadenas de forma sencilla.

Nota: He dejado la función Unircadenas en la hoja, si tenéis office 365 la veréis sin problema, pero si tenéis otra versión no se mostrará. En cualquier caso, la UDF que he creado la veréis en cualquier versión : )

Descarga el archivo de ejemplo pulsando en: FUNCIÓN UNIR CADENAS 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!!

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

EXTRAER PENÚLTIMA PALABRA EN UN TEXTO

Hola a todos!!

¿Qué tal estáis?. Espero que bien!. Hace tiempo que no escribo nada, pero llevo unas semanas con bastante lío y tengo poco tiempo para escribir nuevas entradas, porque además algunas consultas que me están llegando son bastante complejas y no se pueden trasladar al blog.

Pero hoy voy a responder a una bastante sencilla y que me ha permitido crear una función específica (en realidad dos funciones) para resolver el problema.

La consulta es: “Hola, me puedes decir cómo extraer la penúltima palabra de una celda excel? Gracias

Aunque es posible resolver esta cuestión recurriendo a una fórmula matricial, en mi opinión lo más eficiente es utilizar VBA y componer nuestra propia función personalizada. Vemos el ejemplo que voy a utilizar con un texto del que vamos a extraer la penúltima palabra.

El texto es un poema de Manoel Antonio, poeta gallego y uno de mis preferidos (y además era de Rianxo, muy cerca de Noia, mi pueblo natal). Está en su gallego original, se titula “Intencións”

EXTRAER PENÚLTIMA PALABRA EN UN TEXTO

Pues bien, para extraer la penúltima palabra vamos a recurrir a este código:

Function EXTRAE_PALABRA_DERECHA(ByVal Micelda, n As Integer)
'Declaramos variables
Dim sCadena As String, i As Integer, sCelda As String
Dim sCont As Integer, fin As Integer
'Añadimos espacio al inicio de la cadena de texto
sCelda = Space(1) & Micelda
fin = Len(sCelda)
'Recorremos cada caracter, si no es un espacio acumulamos hasta crear una palabra.
For i = fin To 1 Step -1
If (Mid(sCelda, i, 1)) <> " " Then
sCadena = sCadena & Mid(sCelda, i, 1)
'Si aparece un espacio, contamos (significa inicio de otra palabra)
Else
sCont = sCont + 1
'Si el contador es igual a "n" (la posición que queremos extraer) mostramos la palabra.
'Si no lo es vaciamos la variable
If sCont <> n Then sCadena = vbNullString
If sCont = n Then
EXTRAE_PALABRA_DERECHA = StrReverse(sCadena)
Exit Function
End If
End If
Next
End Function

El resultado es el siguiente:

EXTRAER PENÚLTIMA PALABRA EN UN TEXTO1

Como podéis observar solo tenéis que pegar el código en un módulo estándar y llamar a la función EXTRAE_PALABRA_DERECHA (podéis ponerle el nombre que más os guste modificando el código).

Los argumentos son =EXTRAE_PALABRA_DERECHA (Texto, letra a extraer desde la derecha), como empezamos por el final del texto, la penúltima letra será la 2, y la última la 1, y la antepenúltima la 3 …

Si queréis invertir la función y hacer lo mismo pero desde la izquierda, por ejemplo para extraer la segunda palabra, tendríamos que modificar sensiblemente el código:

Function EXTRAE_PALABRA_IZQUIERDA(ByVal Micelda, n As Integer)
Dim sCadena As String, i As Integer, sCelda As String
Dim sCont As Integer, fin As Integer
sCelda = Micelda & Space(1)
fin = Len(sCelda)
For i = 1 To fin Step 1
If (Mid(sCelda, i, 1)) <> " " Then
sCadena = sCadena & Mid(sCelda, i, 1)
Else
sCont = sCont + 1
If sCont <> n Then sCadena = vbNullString
If sCont = n Then
EXTRAE_PALABRA_IZQUIERDA = sCadena
Exit Function
End If
End If
Next
End Function

De esta forma, este sería el resultado de aplicar =EXTRAE_PALABRA_IZQUIERDA (A2;2)

EXTRAER PENÚLTIMA PALABRA EN UN TEXTO2

En el caso de las comas y otros caracteres, se podría implementar un control en el código para no tenerlas en cuenta, pero lo podéis solucionar con un sencillo reemplazar.

¿Os ha gustado?, seguro que sí y seguro que os resultará de mucha utilidad, porque os va a permitir poder extraer la palabra que queráis independientemente de la longitud del texto, (por la derecha o por la izquierda).

Descarga el archivo de ejemplo pulsando en: EXTRAER PENÚLTIMA PALABRA EN UN TEXTO

¿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

MÉTODO FIND COMBINADO CON INSTRUCCIÓN SELECT CASE O FUNCIÓN REPLACE. ENCONTRAR Y REEMPLAZAR

Hola a todos!

Como todos sabéis Excel es mucho más fórmulas y celdas, Excel nos permite programar prácticamente todo lo que nos propongamos. Y aunque en muchas ocasiones escuchéis o leáis que Excel no es adecuado para realizar tareas relacionadas con las bases de datos o tratamientos automatizados de información, lo cierto es que sospecho que las personas que realizan esos comentarios no conocen el poder de Excel, de otra forma su opinión sería distinta.

El tema del post de hoy viene relacionado precisamente con el tratamiento de bases de datos. Es muy habitual que cuando importamos una base de datos, ya sea desde un archivo TXT, CSV, .accdb o cualquier otro, algunos de los campos que nos aparecen vienen resumidos con códigos o abreviaturas, el motivo suele ser que el largo de los campos de registro en el programa que captura la información solo permiten una cierta cantidad de caracteres y es necesario abreviar o utilizar códigos.

Un ejemplo clásico es, por ejemplo abreviar cuando se describe el campo de género (Mujer=M o F y Hombre=H o M o V), o (Casado=C, Soltero=S). Pues bien, para “decodificar” estos códigos, existen multitud de soluciones, la primera y más obvia es la de modificar en el propio código de la herramienta que exporta los datos y “escribir” correctamente la información. Pero muchas veces esto no es posible, o bien el programa es muy antiguo y carece de mantenimiento, o simplemente no es posible realizar un desarrollo para modificar estos campos.

La solución queda entonces en el “tejado” de Excel que es quien recibe la información. Supongamos entonces que hemos recibido un campo con nombres de personas y el género establecido de la siguiente forma:

METODO FIND COMBINADO CON INSTRUCCION SELECT CASE O FUNCION REPLACE

Bien, para modificar esta información y por ejemplo poner HOMBRE o MUJER podemos realizar esta tarea de varias formas, podríamos realizarlo con SQL directamente, con condicionales sobre la columna indicada, pero también podemos hacerlo utilizando el método find para encontrar el campo y la columna que queremos cambiar (esto es interesante cuando los datos que recibimos pueden cambiar de estructura y posición de campos).

Pero el método find solamente nos sirve para localizar el campo, para poder modificar los valores lo podemos hacer de una forma bastante eficiente utilizando una instrucción SELECT CASE o recurriendo a la función REPLACE. A continuación os mostraré dos códigos, cada uno de ellos desarrollará una de las dos alternativas.

  • Método FIND con la instrucción SELECT CASE, este sería el código que os propongo:

Sub Seleccion_Caso()
'Declaramos variables
Dim Final As Double, i As Double
Dim nCampo As Object, sItem As Object
Dim sDato As String, nCol As Long
'Con la hoja1
With Sheets("Hoja1")
Final = Application.CountA(.Range("A:A"))
'Indicamos la búsqueda en la primera fila
Set nCampo = .Range("1:1")
Set sItem = nCampo.Find("Género")
'Si encontramos el dato, guardamos el número de columna
nCol = sItem.Column
'Mediante un for recorremos todos los ítems del campo seleccionado
For i = 2 To Final
'Con un Select Case vamos sustituyendo los datos
sDato = .Cells(i, nCol)
Select Case sDato
Case "H"
.Cells(i, nCol) = "HOMBRE"
Case "M"
.Cells(i, nCol) = "MUJER"
End Select
Next i
End With
End Sub

Como podéis observar, mediante la instrucción Select Case procedemos a realizar los cambios que necesitamos. Es necesario utilizar un loop for-next para que el select pueda evaluar cada celda (o ítem).

El resultado es este:

METODO FIND COMBINADO CON INSTRUCCION SELECT CASE O FUNCION REPLACE1

  • Método FIND con la función REPLACE, este sería el otro código que os propongo:

Sub Reemplazar()
'Declaramos variables
Dim Final As Double, i As Double
Dim nCampo As Object, sItem As Object
Dim sDato As String, nCol As Long
'Con la hoja1
With Sheets("Hoja1")
Final = Application.CountA(.Range("A:A"))
'Indicamos la búsqueda en la primera fila
Set nCampo = .Range("1:1")
Set sItem = nCampo.Find("Género")
'Indicamos la búsqueda en la primera fila
nCol = sItem.Column
'Seleccionamos toda la columna
Columns(nCol).Select
'Con un replace reemplazamos los datos elegidos
With Selection
.Replace What:="HOMBRE", Replacement:="H", LookAt:=xlWhole
.Replace What:="MUJER", Replacement:="M", LookAt:=xlWhole
End With
sItem.Select
End With
End Sub

Con este método para probarlo, realizaremos la inversa, es decir, si es HOMBRE se indicará una H, y si es MUJER una M.

Y volveremos a tener la misma información que al principio:

METODO FIND COMBINADO CON INSTRUCCION SELECT CASE O FUNCION REPLACE

De estos dos códigos, me gusta utilizar el primero con el select case, dado que me permite introducir al final de la instrucción un “else” si fuese necesario y así contemplar otros valores que no sean los que hemos establecidos. Sin embargo debo reconocer que el segundo código es más rápido al utilizar la función REPLACE.

Pues esto ha sido todo, espero que os haya resultado de interés y os ayude con vuestras automatizaciones.

Descarga el archivo de ejemplo pulsando en: MÉTODO FIND COMBINADO CON INSTRUCCIÓN SELECT CASE O FUNCIÓN REPLACE

¿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

RECORRER VARIOS ARCHIVOS Y SUS HOJAS Y BORRAR SU CONTENIDO CON VBA

Hola a todos:

Algunas tareas muy comunes en Excel son las de tener que seleccionar varios libros y realizar la misma tarea en cada uno de ellos y también en sus hojas. En este blog hay varios post donde recorremos y consolidamos información de varios archivos.

Un lector me pedía hace unos días que publicase un post sencillo en el que explicase el proceso de seleccionar varios archivos y borrar todo su contenido, incluyendo todas las hojas.

En efecto, esto se puede realizar, pero antes de nada me gustaría advertir que tengáis precaución a la hora de probar la macro dado que borrará los archivos que hayáis seleccionado. ¿OK?. De todas formas he incluido una ventana de advertencia para elegir si borrar o no hacerlo : )

Pues bien, solo tenéis que incluir esta macro en un módulo estándar y si, queréis un botón de comando en una hoja o ejecutarlo directamente desde VBA:

Sub Borrando_archivos()
'Declaramos variables
Dim narchivos As Variant, ilibro As Object
Dim j As Long, nhojas As Long, i As Long, elige As Long
'Desactivamos actualización de pantalla
Application.ScreenUpdating = False
'Seleccionamos archivos Excel
narchivos = Application.GetOpenFilename(FileFilter:="Excel (*.xls*),*.xls", _
Title:="Seleccionar archivos a borrar", MultiSelect:=True)
'Si no hay selección salimos de la rutina
If IsArray(narchivos) = False Then Exit Sub
'Mostramos ventana de advertencia para verificar si deseamos borrar los archivos
elige = MsgBox("ADVERTENCIA: ¿DESEAS BORRAR EL CONTENIDO DE LOS ARCHIVOS SELECCIONADOS?", vbYesNo + vbExclamation, "BORRAR ARCHIVOS")
'si pulsamos si:
If elige = vbYes Then
'Iniciamos loop por cada archivo seleccionado
For j = LBound(narchivos) To UBound(narchivos)
'Abrimos libro
Set ilibro = Workbooks.Open(Filename:=narchivos(j))
'Contamos número de hojas
nhojas = Sheets.Count
'Recorremos cada hoja y borramos todo el contenido
For i = 1 To nhojas
Sheets(i).Select
Cells.Select
Selection.Clear
Next i
'Cerramos el archivo y guardamos cambios
ActiveWorkbook.Close True
'Seguimos con el próximo archivo
Next j
'si pulsamos no, salimos de la rutina
Else: Exit Sub
End If
End Sub

La macro es muy sencilla, cuando pulsamos el botón de comando o la ejecutamos se muestra una ventana en la que nos va a permitir seleccionar cualquier archivo excel en cualquier ubicación de nuestro equipo:

RECORRER VARIOS ARCHIVOS Y SUS HOJAS CON VBA

Si elegimos archivos, la macro continuará, si no lo hacemos y pulsamos en cancelar, la macro se detendrá y saldremos del proceso.

Como medida de seguridad, es conveniente incluir un msgbox para una segunda confirmación si hemos seleccionado algún archivo en el paso anterior. Es posible que nos hayamos equivocado en la selección y no deseemos eliminar esa información.

RECORRER VARIOS ARCHIVOS Y SUS HOJAS CON VBA1

Si todo está correcto y pulsamos en “SI” la macro se ejecutará y toda la información será borrada. Si elegimos “NO”, la macro no se ejecutará.

En este post es muy importante centrarse en la utilidad del código para recorrer archivos y hojas (mediante dos Loop), siempre será de utilidad para otras muchas tareas, no solo borrar información, también crearla, o consolidarla.

Y eso es todo, espero que os sea de utilidad.
Descarga el archivo de ejemplo pulsando en: RECORRER VARIOS ARCHIVOS Y SUS HOJAS UTILIZANDO 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 RELACIÓN DE FECHAS ENTRE DOS FECHAS

Hola a todos!.

Hace unos días me hacían una consulta a través de LinkedIn que trataba sobre cómo se podía generar automáticamente todas las fechas comprendidas entre dos fechas (inicial y final).

Aunque esto es posible realizarlo mediante fórmulas, creo que lo más oportuno es hacerlo con VBA, ya no solo por la rapidez sino por todas las posibilidades que ofrece para luego poder pasar estos datos a un formulario con cuadros de lista o combos.

Para este ejercicio voy a plantear dos situaciones, una en la que queremos obtener todas las fechas y otra en la que queremos obtener solo los días hábiles y omitiendo también festivos.

Veamos la primera, obtener todas las fechas, para ello imaginad que tenemos las siguiente fechas en nuestra hoja Excel:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS

y queremos obtener todas las fechas que comprenden desde el 01/05/2018 hasta el 15/05/2018. Para poder hacerlo vamos a utilizar esta macro:

Sub obtener_fechas()
'Declaramos variables
Dim inicio As Date, fin As Date, nCont As Date
Dim sCadena As String, fsem As String
Dim matriz As Variant, j As Double
With Sheets("FECHAS")
'Indicamos las celdas con la fecha inicio y fin
inicio = .Cells(1, 2)
fin = .Cells(2, 2)
'Mediante un loop añadimos un día a la fecha inicial
'y guardamos fechas en la variable sCadena
Do While inicio < fin - 1
nCont = DateAdd("w", 1, inicio)
inicio = nCont
sCadena = sCadena & " " & inicio
Loop
'pasamos la información de la matriz a la hoja
matriz = Split(sCadena, " ")
For j = 1 To UBound(matriz)
.Cells(j, 3) = Format(matriz(j), "mm/dd/yyyy")
Next j
End With
End Sub

Como podéis observar, mediante un loop vamos añadiendo días a la fecha inicial de forma que vamos componiendo cada fecha hasta llegar a la fecha final. Esos datos los guardamos en una variable string como una cadena de texto que luego pasaremos a una matriz y finalmente a la hoja, este es el resultado:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS1

Ahora vamos con la segunda situación, es decir, queremos obtener sólamente los días hábiles y excluir festivos, para ello utilizaremos la misma macro pero con unas modificaciones:

Sub obtener_fechas_dias_lab()
'Declaramos variables
Dim inicio As Date, fin As Date, nCont As Date, dfest As Date
Dim sCadena As String, fsem As String, j As Double
Dim matriz As Variant
With Sheets("FECHAS")
'Indicamos las celdas con la fecha inicio y fin
inicio = .Cells(1, 2)
fin = .Cells(2, 2)
'Mediante un loop añadimos un día a la fecha inicial
'y guardamos fechas en la variable sCadena
Do While inicio < fin - 1
nCont = DateAdd("w", 1, inicio)
inicio = nCont
fsem = Format(inicio, "ddd")
dfest = CDate(.Cells(3, 2))
'Si el día es un sábado o domingo o un festivo no guardamos fecha
If fsem "sá." And fsem "do." And inicio dfest Then
sCadena = sCadena & " " & inicio
End If
Loop
'pasamos la información de la matriz a la hoja
matriz = Split(sCadena, " ")
For j = 1 To UBound(matriz)
.Cells(j, 4) = Format(matriz(j), "mm/dd/yyyy")
Next j
End With
End Sub

Para poder excluir los sábados y los domingos es necesario que podamos detectar los días en las fechas que vamos generando en el loop, esto lo hacemos con:

Format(inicio, "ddd")

Donde los sábados se representan como: “sá.” y los domingos como “do.“, es obvio que si estamos trabajando con otros idiomas debemos modificar e introducir los datos correspondientes . Con un condicional excluimos los sábados y los domingos y también la fecha del día festivo, finalmente la información es la siguiente:

MOSTRAR RELACION DE FECHAS ENTRE DOS FECHAS2

Y con esto ya hemos finalizado el ejercicio, ya podemos obtener los días entre dos fechas y listalos, (con o sin días laborales).

Espero que os resulte de utilidad!.

Descarga el archivo de ejemplo pulsando en: MOSTRAR RELACIÓN DE FECHAS ENTRE DOS FECHAS

¿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

PROBANDO ALGORITMO PREDICTIVO ID3 CON RESULTADOS DE DIAGNÓSTICOS ONCOLÓGICOS.

Hola a todos:

Como muchos de vosotros sabéis, esta web la creé en su momento como una forma de transmitir todo el conocimiento que iba aprendiendo sobre programación en particular y Excel en general. En cierto modo una forma de compartir el tiempo que dedico a mi hobbie que es programar y aprender a hacer cada día un poco mejor (nadie nace experto y dudo mucho que lleguemos a serlo en algún momento, todos debemos comprender la importancia de la humildad).

Pues bien, hoy me apetece escribir acerca de otros trabajos e investigaciones que voy realizando por cuenta propia y con el poco tiempo del que dispongo actualmente (ya sabéis, la vida, las obligaciones profesionales, etc).

Hace un tiempo escribí un post en el que me atrevía a programar parte de un algoritmo ID3, cuyo funcionamiento se basa en los árboles de decisión. Si no lo habéis leído o visto, este es el enlace: GENERANDO UN ALGORITMO ID3 EN VBA

Sé que en el mercado existe software muy potente con este tipo de algoritmos programados y embebidos en programas específicos, pero me gusta probar, investigar y trabajar y sobre todo el contestarme a la pregunta ¿eso lo puedo hacer programando en Excel?.

Pues bién finalmente lo realicé y me llevó un par de semanas trabajando de veinte minutos a una hora cada día (no disponía de más tiempo).

Hace tiempo encontré documentación sobre un tema muy concreto y que me interesa enormemente, ya no tanto por su implicación actual en la vida de las personas sino porque en el pasado me tocó sufrirlo de cerca con un familiar muy cercano, esto es: el cáncer.

Esta documentación la podéis encontrar en la UCI MAchine Learning UCI Machine Learning Repository un lugar web de naturaleza pública para que investigadores o personas interesadas en el machine learning puedan tener a su disposición datos con los que poder investigar.

En el caso del cáncer hay varios repositorios con documentación extensa, en mi caso, me decidí por este: machine-learning-databases breast cancer wisconsin

Aquí podréis encontrar una base de datos con diversos indicadores y su medición en una relación de casos:

PRACTICUM1

En rojo os marco los archivos necesarios, el primero son los datos recogidos en un archivo plano txt delimitado por comas:

PRACTICUM2

Para determinar el nombre de los campos y la escala de cada uno de ellos es necesario abrir el otro archivo con las especificaciones, y entre otras informaciones nos mostrará lo siguiente:

PRACTICUM3

Efectivamente, aquí tenemos el nombre de todos los campos, incluido el último, como variable dicotómica (2 – el tumor es benigno y 4 – el tumor es maligno).

Pues bien, con esta información creí interesante utilizar el algoritmo que había creado en Excel basado en el ID3 para comprobar cuál era el resultado que mostraba y si podría tener sentido.

Lo primero que hice fue crear la base de datos e incluirla en la hoja Excel:

PRACTICUM4

El resto del proceso es sencillo, solo hay que pulsar el botón “Generar Algoritmo” que se encuentra en la hoja Resultados.

La información obtenida fue la siguiente:

PRACTICUM5

Aunque la información que se muestra es extensa, podemos extraer una serie de conclusiones inicialmente:

En primer lugar, de todas las variables que hemos analizado o procesado, son dos cláramente las que determinan el resultado es 2 o 4, estas variables que voy a denominar explicativas, son: la uniformidad en el tamaño de la célula y la uniformidad en la forma de la célula.

Sin embargo, en vista de otros estudios, parece que la tercera variable “el núcleo desnudo” sería también determinante.

En este caso, mi algoritmo está solo programado para analizar aquella variable con el atributo cuya ganancia sea máxima, es decir la uniformidad en el tamaño de la célula.

Posteriormente obtendremos el valor o ganancia de cada una de las variables en los diferentes nodos de la variable principal, es decir, la uniformidad va desde el 1 (más uniforme, hasta el 10 (menos uniforme).

Según los resultados en los niveles 1 y 10 no existe ningún indicador que determine si podría ser maligno o benigno, dado que el peso de cada variable en todos los casos es 0.

Cuando se trata de una uniformidad total el resultado tiene a ser benigno, sin embargo es necesario observar el comportamiento de los núcleos desnudos y los nucleolos normales. En los niveles 2, 3 y 4 serán determinantes los núcleos desnudos y el espesor de la masa y a partir del nivel 6 las probabilidades de un resultado maligno son mayores, dado que son multitud de variables las que tendrían incidencia o habría que tener en cuenta.

Quizás para resolver los casos 5 y 10 sean necesarios más casos en la muestra con la que estamos trabajando y en general muy seguramente sea necesario ampliar la muestra para obtener mayores evidencias.

Los datos indican que cuanto mayor es la uniformidad de la célula y (muy probablemente también la uniformidad de la forma) el resultado sería maligno. Aunque es necesario también tener en cuenta el “peso” del resto de las variables en cada uno de los niveles de la variable principal.

Existe un estudio sobre esta misma fuente de datos que no puedo dejar de mencionar, aunque se ha realizado con el algoritmo C5. Este estudio lo podéis descargar aquí: Prediction of Breast cancer y aunque sus resultados vienen dados por otro tipo de plataforma y algoritmo, coincidimos en bastantes conclusiones. Y la más importante es que es necesario un mayor número de casos y quizás implementar un algoritmo mucho más preciso que el C5.

Por último, esto solo se trata de un ejercicio a modo de ejemplo y sin mayores pretensiones que mostrar su funcionamiento. La información siempre ha de ser tratada y contrastada por profesionales que conozcan los conceptos, yo no soy médico ni tampoco tengo conocimientos en este área de trabajo, pero sí he tratado de construir un método para obtener una serie de informaciones.

Me gustaría disponer de más tiempo para seguir desarrollando, pero desgraciadamente no dispongo de tal ventaja. La solución es ir haciéndolo poco a poco y con los instrumentos que tengo a mi alcance : )

Estas son las cosas que hago y con las que disfruto, investigando, aprendiendo, equivocándome y volviéndolo a intentar.

Os dejo el caso práctico:

Descarga el archivo de ejemplo pulsando en: PROBANDO ALGORITMO PREDICTIVO ID3 CON RESULTADOS ONCOLÓGICOS

 
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

ELIMINAR UNA MACRO UTILIZANDO OTRA MACRO

Hola a todos:

Hace unos días un lector me enviaba una consulta acerca de cómo podía eliminar una macro utilizando otra macro.

Aunque no suele ser muy habitual este tipo de procedimientos, dado que implica que si nos equivocamos podemos eliminar código o macros por equivocación, la verdad es que me pareció interesante para publicar en la web.

Antes de comenzar con el ejercicio, para que la macro funcione es necesario realizar unas modificaciones en el centro de confianza de nuestro programa de Excel. Para hacerlo, debéis entrar en Archivo > Opciones y pulsar en Centro de Confianza:

ELIMINAR UNA MACRO UTILIZANDO OTRA MACRO

A continuación se mostrará esta otra pantalla:

ELIMINAR UNA MACRO UTILIZANDO OTRA MACRO1

Elegimos la opción Configuración de macros y activamos la casilla que pone: Confiar en el acceso al modelo de objetos de proyectos de VBA, y aceptamos.

Es importante que realicemos este paso, si no lo hacemos la macro que os voy a mostrar generará un error y no se ejecutará.

Ahora veamos dos formas de realizar el borrado de nuestros procesos. Por una parte podemos eliminar el contenido de un módulo entero, aunque tenga varios sub o funciones. Simplemente queremos vaciar de contenido todo el módulo.

Para realizar esto, este es el código que podemos utilizar:

Sub Borrar_módulo()
'Declaramos variables
Dim modulo As String
'Eliminamos todo el contenido del módulo que indiquemos
modulo = "Módulo1"
With ThisWorkbook
.VBProject.VBComponents(modulo).CodeModule.DeleteLines 1, .VBProject.VBComponents(modulo).CodeModule.CountOfLines
End With
End Sub

En este caso estamos eliminando todo el contenido del módulo 1, si quisiéramos borrar el contenido “ThisWorkBook”, simplemente lo indicamos en la macro sustituyéndolo en la macro.

Pero también puede que solo deseemos eliminar un procedimiento concreto y no todo. Para eso, utilizaremos el siguiente código:

Sub Borrar_macro()
'Declaramos variables
Dim fin As Long
Dim inicio As Long
Dim modulo As Object
'Indicamos el módulo en el que queremos borrar la macro
Set modulo = ThisWorkbook.VBProject.VBComponents("Módulo1").CodeModule
'Indicamos el nombre del procedimiento o macro a eliminar
With modulo
inicio = .ProcStartLine("Borrar_módulo", vbext_pk_Proc)
fin = .ProcCountLines("Borrar_módulo", vbext_pk_Proc)
.DeleteLines inicio, fin
End With
End Sub

En este caso borraremos solo este código especificando el nombre de la subrutina anterior (Borrar_módulo) y que esté incluida en el módulo 1 de nuestro proyecto de VBA.

Obviamente podremos cambiar los valores en función de nuestra necesidades.

No voy a dejar archivo de ejemplo porque no estoy interactuando con la hoja ni vamos a crear datos, y no creo que sea necesario dado que solo necesitáis el código para y leer el post para poder realizar el ejemplo por vosotros mismos. De todas formas si tenéis dudas, me comentáis.

Por cierto, cuidado con este tipo de programaciones, recordad que estamos borrando código y debéis ser muy cuidadosos a la hora de programar, ¿ok?.

Eso es todo, espero que os haya gustado!. : )

¿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