martes, 27 de septiembre de 2016

VBA: Objeto Dictionary - Resaltar Palabras elegidas dentro de un Rango.

Aprovecharé hoy para emplear el objeto Dictionary, similar a una Collection en cuanto a finalidad o propósito... pero que aporta algún matiz.

Sirva como breve referencia lo siguiente.
1- La opción para especificar un método de comparación para las claves (vbBinaryCompare y vbTextCompare). Esto permitiría distinguir clave entre mayúsculas y minúsculas.
2- Un método (.Exists) para determinar si existe un objeto en un diccionario.
3- Un método (.Keys) para extraer todas las claves en una matriz.
4- Un método (.Items)para la extracción de todos los elementos en una matriz.
5- Un método (.Key(xxx)=yyyy)para cambiar un valor de clave.
6- Un método (.RemoveAll) para quitar todos los elementos del diccionario.

Una diferencia importante entre el objeto de Collection y el objeto Dictionary es el comportamiento de la propiedad Item: Si utilizamos la propiedad Item para hacer referencia a una clave inexistente de una Collection, obtendremos un error, en cambio si utiliza la propiedad Item para hacer referencia a una clave no existente en un dictionary, dicha clave se agregará al diccionario!! (Por ello, deberemos emplear el método .Exists para determinar si es o no una clave en un Dictionary.)


Comenzamos el ejemplo asignando un Nombre definido al rango A2:A6
contenido =Listado!$A$2:$A$6
este rango contiene una serie de palabras que son importantes y queremos resaltar dentro del texto que aparezca en otro rango...

VBA: Objeto Dictionary - Resaltar Palabras elegidas dentro de un Rango.



Insertamos el siguiente procedimiento en un módulo estándar de nuestro proyecto de VB, y posteriormente asignamos la macro a un botón:

Sub MarcarPalabras()
Dim Rng As Range, Dn As Range
Dim Sp As Variant    'Array
Dim pos As Long, n As Long, x As Long
Dim Dic As Object   'objeto Dictionary

'recuperamos el rango a partir del nombre definido creado
Set Rng = ActiveWorkbook.Names("contenido").RefersToRange

'Generamos nuestro propio objeto Dictionary
Set Dic = CreateObject("scripting.dictionary")
'definimos el tipo/propiedad del objeto
'vbBinaryCompare = si necesitamos una comparativa, respecto a mayusculas-minúsculas, exacta
'vbTextCompare = si NO necesitamos una comparativa, respecto a mayusculas-minúsculas, exacta
Dic.CompareMode = vbTextCompare

'recorremos cada celda del rango, i.e., cada palabra a localizar
'añadiendola a nuestro dictionary
x = 1
For Each Dn In Rng
    'si no existe la nueva palabra la añadimos al Diccionario
    'método .Exists
    If Not Dic.Exists(Dn.Value) Then
        'método Add
        Dic.Add Dn.Value, x
        x = x + 1
    End If
Next Dn

'con el diccionario creado, recorremos cada celda del rango seleccionado
'y cada palabra de cada celda
For Each celda In Selection
    c = 0:    pos = 0
    'separamos las frases por palabras
    Sp = Split(celda.Value, " ")
        'y recorremos cada palabra
        For n = 1 To UBound(Sp)
            'si existe la palabra..
            If Dic.Exists(Sp(n)) Then
                '...localizamos su posición y longitud
                pos = InStr(pos + 1, celda.Value, Sp(n), vbTextCompare)
                'para marcarla en rojo
                celda.Characters(pos, Len(Sp(n))).Font.Color = vbRed
            End If
        Next n
Next celda
End Sub



Tras ejecutar nuestra macro este es el resultado, tal como esperábamos:

VBA: Objeto Dictionary - Resaltar Palabras elegidas dentro de un Rango.

jueves, 22 de septiembre de 2016

Explicación de cómo convertir un valor Decimal a Hexadecimal

Obviamente sabemos que existe la función estándar de Excel:
=DEC.A.HEX(número;[posiciones])
que convertirá cualquier número decimal en hexadecimal...
Hoy lo que veremos es la explicación de esta función... en definitiva en qué consiste ese algoritmo de conversión.
El motivo del post es dar respuesta a un lector que planteaba la siguiente proegunta
Hola quisiera saber como pasar un código decimal a hexadecimal sin usar la fórmula de Excel.  Gracias


Lo más importante antes de comenzar es entender que un sistema decimal emplea 10 valores (del 0 al 9), mientras que el sistema hexadecimal emplea 16 (números de 0 al 9 y además las letras A, B, C, D, E y F) según la siguiente equivalencia:

Explicación de cómo convertir un valor Decimal a Hexadecimal



El algoritmo de trabajo se basa en conseguir en primer lugar la parte entera del cociente del número a convertir y posteriores entre 16 (hasta llegar a cero):
=ENTERO(B2/A3)

Explicación de cómo convertir un valor Decimal a Hexadecimal



En un segundo paso, a partir de esos cocientes (parte entera) obtenidos obtenemos el residuo o resto de la división entre 16 de dichos valores:
=RESIDUO(B2;A3)

Explicación de cómo convertir un valor Decimal a Hexadecimal



En un penúltimo paso, empleando la función BUSCARV conseguimos recuperar el valor correspondiente Hexadecimal (según la Tabla de equivalencia mostrada al inicio):

Explicación de cómo convertir un valor Decimal a Hexadecimal



El último paso es simple, basta unir en sentido inverso (ver celda D6) los valores equivalentes hexadecimales obtenidos.
=D5&D4&D3
Como comprobación, en la celda F8 se aplica la función estándar de Excel... obteniendo el mismo dato.

martes, 20 de septiembre de 2016

Fecha Inmediata Anterior a Otra

Un lector preguntaba por una fórmula para obtener la fecha inmediata anterior a otra dada, según una condición:
[...] necesito hallar la fecha de compra de unos consumos, tiene que ser la próxima anterior[...]
Tal y como se muestra en la imagen:

Fecha Inmediata Anterior a Otra



El objetivo es claro, para cada fecha y artículo del segundo rango D3:E8 debemos recuperar la fecha correspondiente anterior más próxima del primer rango A3:B8.

Para ello construimos la siguiente matricial que insertamos en F3:
=E3-MIN(SI(E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())>0;E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())))
(recuerda validarla presionado Ctrl+Mayuscula+Enter!!)

A continuación copiaremos y pegaremos al resto de celdas F4:F8.


¿Cómo funciona esta fórmula matricial?.
Nos basamos en el cálculo de diferencias entre fechas para llegar a la más próxima anterior; esto es, con la parte más profunda de la fórmula, llegamos a conseguir unas fechas para aquellos casos en los que coincide el artículo.. así discriminamos las fechas que no nos interesan:
SI($A$3:$A$8=D3;$B$3:$B$8;HOY())

Fecha Inmediata Anterior a Otra


Sobre esta fecha obtenida aplicamos un nuevo condicional para calcular la diferencia con la fecha de referencia:
=SI(E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())>0;E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY()))

discriminando además aquellas diferencias negativas (solo nos quedamos con diferencias positivas); esto es así por que buscamos sólo fechas anteriores (una diferencia negativa indicaría que la fecha es posterior).!!

Fecha Inmediata Anterior a Otra



Si de esas diferencias obtenidas nos quedamos con el valor mínimo:
MIN(SI(E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())>0;E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())))
y ese valor mínimo lo restamos a la fecha de referencia, obtenemos la Fecha buscada:
=E3-MIN(SI(E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())>0;E3-SI($A$3:$A$8=D3;$B$3:$B$8;HOY())))

Es decir, sobre el ejemplo de la imagen (fecha de referencia 15/07/2016), desde la fecha de referencia nos desplazamos 10 días antes... lo que nos lleva a la fecha de origen: 05/07/2016

Tal como se muestra en la imagen:

Fecha Inmediata Anterior a Otra

jueves, 15 de septiembre de 2016

Las Autofomas en Excel y el Teorema de Pitágoras

Algo que todos recordamos de la escuela, pero que nunca nos hemos parado a darle la importancia que merece: Teorema de Pitágoras (de Samos).
Que dice: En todo triángulo rectángulo el cuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos.


En el post de hoy mostraremos una explicación geométrica de este teorema, para lo cual emplearemos las Formas de Excel
Comprobaremos de manera casi perfecta como se verifica este teorema.
La idea es construir un cuadrado perfecto 'exterior' con cuatro triángulos rectángulos idénticos, dejando en su parte interior un nuevo cuadrado 'menor', generado a partir de las hipotenusas de los cuatro triángulos.. tal como vemos en la imagen:

Las Autofomas en Excel y el Teorema de Pitágoras


Para mostrar esta representación, los valores o medidas tomados son:
c1:= lado 1 (cateto 1 o lado corto del triángulo): 3 cm
c2:= lado 2 (cateto 2 o lado largo del triángulo): 4 cm
h := hipotenusa: 5 cm
Dimensiones que verifican el teorema (32+42=52)


La explicación y demostración visual reside en que el área del cuadrado perfecto exterior, de lado c1 + c2, y por tanto área:
(c1 + c2)2
coincide con la suma de las área de los cuatro triángulos rectángulos más el cuadrado menor de lado h:
h2 + 4 x (c1 x c2) / 2

de donde se consigue:
(c1 + c2)2 = 4 x (c1 x c2/2) + h2
c12 + (2 x c1 x c2) + c22 = (2 x c1 x c2) + h2
c12 + c22 = h2


Demostrando así el famoso teorema.

En cuanto a Excel, cómo construimos nuestra composición.
En primer lugar insertamos un triángulo rectángulo:

Las Autofomas en Excel y el Teorema de Pitágoras


Una vez insertado, desde su barra de herramientas y su pestaña de Formato accedemos al grupo Tamaño donde cambiamos las propiedades de Alto (=3 cm) y Ancho (=4 cm)

Las Autofomas en Excel y el Teorema de Pitágoras


Duplicamos hasta tener cuatro triángulos iguales (si queremos podemos cambiarles el color de relleno)
Intentamos colocarlos de la siguiente manera:

Las Autofomas en Excel y el Teorema de Pitágoras


Lo conseguiremos girando/rotando y ayudándonos de la herramienta de Alinear Objetos, dentro de la Barra de herramientas de las Formas > pestaña Formato > grupo Organizar > botón Alinear:

Las Autofomas en Excel y el Teorema de Pitágoras



Una vez conseguido el ajuste más perfecto que podamos entre los distintos ángulos, insertaremos una nueva forma: Un Rectángulo

Las Autofomas en Excel y el Teorema de Pitágoras


Al que daremos dimensiones de 5 cm de Alto y Ancho.
Ya podemos girarlo y moverlo hasta el hueco formado por nuestros cuatro triángulos (ver imagen inicial)... comprobaremos como encaja en ese área, demostrando por tanto el teorema.


Para ver otras demostraciones y leer algo más al respecto ir a Wikipedia

martes, 13 de septiembre de 2016

VBA: Añadir Comentario a una Autoforma

Continuando con la temática del post anterior, expondré una alternativa a la forma de añadir un Comentario/Mensaje a una autoforma.

Hoy usaremos la herramienta de Hipervínculo.

Tenemos una autoforma 'Rectángulo redondeado 1' sobre la que queremos visualizar un comentario o mensaje personalizado al pasar el cursor por encima:

VBA: Añadir Comentario a una Autoforma


El primer paso es asociar un hipervínculo al objeto, para lo cual seleccionamos (clic derecho) la autoforma y luego 'Hipervínculo':

VBA: Añadir Comentario a una Autoforma


Dentro de la Ventana de Insertar Hipervínculo presionamos el botón de Info. en Pantalla..., desde donde escribiremos el comentario o mensaje que deseemos.

VBA: Añadir Comentario a una Autoforma


Terminamos de configurar el Hipervínculo, vinculándolo a Un lugar de este documento > con referencia a una celda escondida o lejana... en mi ejemplo indico celda C4 por estar debajo de la autoforma.

VBA: Añadir Comentario a una Autoforma


Este último aspecto es clave, ya que para ejecutar nuestra macro, ahora deberemos asociar en la ventana de código de la hoja de trabajo, un evento de _SelectionChange; de tal forma que al presionar el botón/autoforma el hipervínculo hará un doble trabajo:
1-muestra el comentario
2-lleva la celda activa a la celda indicada (en el ejemplo C4).
3-al crear el evento _SelectionChange, asociándolo a dicha celda se lanzará nuestra macro.


Así pues, tenemos el siguiente código principal, insertado en un módulo estándar (Módulo1) de nuestro proyecto de Vb:

Sub MacroPrincipal()
'desarrollo de la macro principal
'a ejecutar la presionar la autoforma
MsgBox "Ejcutada la macro"
End Sub



Por otra parte, en la ventana de código de la hoja donde se encuentre la celda indicada (Celda C4) añadimos:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'cuando la celda seleccionada sea C4
'entonces lanzamos la MacroPrincipal
If Target.Address = "$C$4" Then Call Módulo1.MacroPrincipal
End Sub



Listo.
Podemos comprobar el efecto.. al pasar el cursor por encima de la autoforma veremos el comentario, tal como deseábamos.
Por otra parte tenemos la funcionalidad de 'botón', y al presionarlo el hipervínculo nos lleva a la celda C4, que controlamos conel evento Worksheet_SelectionChang.

jueves, 8 de septiembre de 2016

VBA: El evento MouseMove para añadir comentarios a una Autoforma

Todos conocemos la propiedad .ControlTipText que nos permite asociar un comentarios nuestros controles de UserForms, sin embargo, tal cosa no es posible en las autoformas de la hoja de cálculo.
Por este motivo hoy veremos una manera de engañar a Excel para conseguir el efecto de un TipText (mensaje o comentario) asociado a una autoforma.


Para ello necesitamos lo siguiente:
Dos controles ActiveX del tipo Etiqueta (o label), al que hemos borrado el texto de su propiedad Caption.

VBA: El evento MouseMove para añadir comentarios a una Autoforma

Los he llamado 'Contorno1' y 'Contorno2'. Estas 'Etiquetas' serán las que controlarán el mensaje o comentario.


Por supuesto necesitamos nuestro comentario.
Para ello insertamos un Cuadro de Texto desde la ficha Insertar > grupo Ilustraciones > botón Formas > Cuadro de texto. Le llamamos 'Msg_Comentario'.
A este cuadro de texto le añadimos un comentario...

VBA: El evento MouseMove para añadir comentarios a una Autoforma



Finalmente insertamos un botón o imagen o autoforma al que asociamos/asignamos la ejecución de nuestra macro principal. Para el ejemplo, insertamos en un módulo estándar de nuestro proyecto de VB:

Sub MacroPrincipal()
'correspondería al procedimiento principal a ejecutar
'[código principal]....
MsgBox "Has presionado el botón de la macro"
End Sub



Llega el momento de tratar el evento MouseMove, por lo que accedemos a la ventana de código de la hoja donde estamos trabajando, y buscamos en el primer desplegable el objeto 'Contorno1':

VBA: El evento MouseMove para añadir comentarios a una Autoforma



A continuación le asociamos el evento MouseMove desde el segundo desplegable:

VBA: El evento MouseMove para añadir comentarios a una Autoforma



Añadimos una línea de código en este evento para conseguir ocultar el Cuadro de texto que habíamos nombrado como 'Msg_comentario':

Private Sub Contorno1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'Al pasar el cursor por este 'Contorne' Exterior
'ocultamos el cuadro de texto con el comentario
ActiveSheet.Shapes("Msg_Comentario").Visible = msoFalse
End Sub



Repetimos la operación para el Contorno2, con el siguiente código

Private Sub Contorno2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'Al pasar el cursor por este 'Contorne' Interior
'mostramos el cuadro de texto con el comentario
ActiveSheet.Shapes("Msg_Comentario").Visible = msoTrue
End Sub



Tenemos todo listo, solo falta componer el cuadro.
Lo primero que haremos será superponer (por capas) el Contorno1 (en el fondo) el Contorno2 (encima del Contorno1) y por último el botón de la macro (por encima de los dos Contornos):

VBA: El evento MouseMove para añadir comentarios a una Autoforma



Es importante la posición de los Contornos, ya que de ello depende el efecto de mostrar/ocultar el comentario...

Para hacer invisible los controles ActiveX de etiquetas 'Contorno1' y 'Contorno2' podemos cambiarles la propiedad .BackStyle a 0-fmBackStyleTransparent:

VBA: El evento MouseMove para añadir comentarios a una Autoforma



Vemos el efecto final conseguido en la siguiente imagen:

VBA: El evento MouseMove para añadir comentarios a una Autoforma

martes, 6 de septiembre de 2016

VBA: Adivina el número buscado - juego en Excel

Desarrollaremos hoy un sencillo juego en Excel que consiste en adivinar un número entero entre 1 y 100.
Comenzaremos construyendo un par de funciones UDF que nos servirán para dar pistas al jugador...
Así, insertamos en un módulo estándar de nuestro proyecto VBA las siguientes funciones (una de ellas la vimos y explicamos en el post anterior):

Function FxEsPar(x As Integer) As Boolean
Dim n As Integer
'comenzamos indicando por defecto que el valor de la función es FALSO
FxEsPar = False
'solo si cumple la ocondición será PAR
'un número es par si el resto de su cocinete entre dos es cero
If (x Mod 2 = 0) Then
    FxEsPar = True
End If

'también podríamos haber aplicado la función
'FxEsPar = Application.WorksheetFunction.IsEven(x)
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function FxEsPrimo(x As Integer) As Boolean
Dim n As Integer
'En matemáticas,
'un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos:
'él mismo y el 1.
n = 2
'damos valor VERDADERO por defecto a la función
FxEsPrimo = True
'si el número no es mayor que 1 no puede ser primo
If x <= 1 Then FxEsPrimo = False
'lanzamo un loop para ver si el número tiene algú otro divisor
Do While FxEsPrimo And n <= Sqr(x)
  'si encontramos uno
  'en cuyo caso el resto del cociente será cero
  If (x Mod n = 0) Then
    'en ese caso NO será primo
    FxEsPrimo = False
  End If
  n = n + 1
Loop

'en esta función trabajamos a la inversa,
'demostramos que no existe otro divisor para el número...
End Function

Estas funciones, como adelantaba al inicio de la entrada, la emplearemos en el procedimiento principal, para aportar pistas del número buscado... Añadimos entonces en módulo estándar de nuestro proyecto VBA el siguiente procedimiento:

Sub AdivinaNumero()
Randomize   'Inicializa el generador de números aleatorios.
Dim stPista As String, op As String
Dim msg1 As String, msg2 As String, msg3 As String
Dim x As Integer, numero As Integer
'el número a adivinar!!
'un aleatorio entre 1 y 100
numero = Int(Rnd * 100)

'daremos 10 oportunidades para descubrir el número
'para ello usamos un contador 'intento'
intento = 1

'recorremos los diez intentos...
Do While x <> numero And IsNumeric(numero) = True And intento <= 10
    opcion = (11 - intento)
    If opcion = 1 Then
        op = "Te queda " & opcion & " intento." & vbCrLf
    Else
        op = "Te quedan " & opcion & " intentos." & vbCrLf
    End If
      
    If x <> numero And IsNumeric(numero) = True And intento = 1 Then
        'generamos pista... entre las dos opciones definidas
        'con nuestras UDF: FxEsPAr y FxEsPrimo
        'generamos un aleatorio entre 1 y 2
        pista = Int((2 * Rnd) + 1)

       Select Case pista
         Case Is = 1
          If (FxEsPar(numero) = True) Then stPista = "Pista: Es un número PAR."
          If (FxEsPar(numero) = False) Then stPista = "Pista: Es un número IMPAR."
         Case Is = 2
          If (FxEsPrimo(numero) = True) Then stPista = "Pista: Es un número PRIMO."
          If (FxEsPrimo(numero) = False) Then stPista = "Pista: Es un número COMPUESTO - no primo."
       End Select
    End If
    
    'Comienza la rueda de preguntas al usuario
    x = Val(InputBox("Debes adivinar un número entero entre 1 y 100" & vbCrLf & op + stPista, "Excelforo"))
    '... y el feedback
    If x > 100 Or x < 1 Then m = MsgBox("Debes ingresar un número entre 1 y 100.", 0, "Adivinando un número entero entre 1 y 100"): End
    If x > numero Then m = MsgBox("Más pequeño que " & x, 0, "Adivinando un número entero entre 1 y 100")
    If x < numero Then m = MsgBox("Más grande que " & x, 0, "Adivinando un número entero entre 1 y 100")
    
    'incrementamos el contador
    intento = intento + 1
Loop
      
'Sacamos el mensaje final
msg1 = "Hey!, ¿hiciste trampa?.. Has acertado a la primera!!"
msg2 = "Correcto!!, el número buscado era: " & numero & "."
msg3 = "OOOOh, el número era: " & numero & "."

aux = intento - 1
If x = numero And aux = 1 Then m = MsgBox(msg1 & vbCrLf & msg2, 0, "Enhorabuena!!!")
If x = numero And aux > 1 Then m = MsgBox(msg2, 0, "Felicidades!")
If x <> numero Then m = MsgBox(msg3, 0, "Se siente!!")

End Sub

Asocia la macro 'AdivinaNumero' a un botón o similar, y ya estamos listos para jugar!!!

jueves, 1 de septiembre de 2016

VBA: Número primos en Excel

Hoy un clásico de la programación: Listar números primos.

Recordemos brevemente la definición de número primo:
Número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1.
A diferencia de los números primos, los números compuestos son los números naturales que tienen algún divisor natural aparte de sí mismos y del 1 y por lo tanto, pueden factorizarse.
El número 1, por convenio, no se considera ni primo ni compuesto.

Leer más en Wikipedia.


En el ejemplo siguiente listaremos los números primos existentes inferiores al número 200.
Insertamos en un módulo estándar de nuestro proyecto de VB:

Sub Primos()
Dim x As Integer, y As Integer
Dim contador As Integer, divisores As Integer
'un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos:
'él mismo y el 1.

'Contador para insertar el valor en las celdas
contador = 1
contador2 = 1
'recorremos del 2 al 200
'ya que el 1 no se considera primo
For x = 2 To 200
    'reiniciamos el número de divisores de x
    divisores = 0
    For y = 2 To 200
        'si el resot del cociente es cero es que es divisor
        If (x Mod y = 0) Then
            'incrementamos el contador
            divisores = divisores + 1
        End If
    Next y
    'si hemos encontrado un solo divisor entonces es primo
    'el resto de número tendrá al menos uno (>=1)
    'en todos los casos además de por el uno!!
    If divisores = 1 Then
        'llevamos el número a la celda...
        'separándolo en dos columnas....
        '(los 24 primeros en la columna A y los siguientes en la B)
        If contador <= 24 Then
            Cells(contador, "A").Value = x
            contador = contador + 1
        Else
            Cells(contador2, "B").Value = x
            contador2 = contador2 + 1
            contador = contador + 1
        End If
    End If
Next x

End Sub

Si ejecutamos la macro veremos el resultado:

VBA: Número primos en Excel

Adicionalmente podemos construir una función UDF. Insertamos en un módulo estándar de nuestro proyecto de VB:

Function FxEsPrimo(x As Integer) As Boolean
Dim n As Integer
'En matemáticas,
'un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos:
'él mismo y el 1.
n = 2
'damos valor VERDADERO por defecto a la función
FxEsPrimo = True
'si el número no es mayor que 1 no puede ser primo
If x <= 1 Then FxEsPrimo = False
'lanzamos un loop para ver si el número tiene algún otro divisor
Do While FxEsPrimo And n <= Sqr(x)
  'si encontramos uno
  'en cuyo caso el resto del cociente será cero
  If (x Mod n = 0) Then
    'en ese caso NO será primo
    FxEsPrimo = False
  End If
  n = n + 1
Loop

'en esta función trabajamos a la inversa,
'demostramos que no existe otro divisor para el número...
End Function

Con esta función, sobre la hoja de cálculo o en otros procedimientos, obtendremos un VERDADERO o FALSO, sobre un número entero positivo cualquiera.