Hola a todos! Qué tal estáis?, espero que bien.

Sobre la temática de los números primos, en esta web ya he publicado en su momento una entrada relacionada: GENERAR Y EXTRAER NÚMEROS PRIMOS EN EXCEL CON VBA

Pero siempre quise modificar una de esas macros para mostrar la información de otra manera. Es decir, mostrar o generar los números primos no solamente en una fila, sino en varias columnas y pudiendo establecer el número de elementos en cada columna, y ahora que tengo un poco de tiempo he decidido adaptar la programación.

Para introducir estos datos, el número total de elementos por columna y el límite hasta el que queremos generar los números primos, he decidido utilizar un inputbox:

En este caso cada columna tendrá un máximo de 10 elementos y se generarán números primos entre el 1 y el 600 (que por cierto, el 1 no se mostrará dado que no se considera un número primo). Este es el resultado:

Para crear este tipo de macros que generan los datos y los muestra en columnas, es necesario utilizar loops y contadores que serán las variables que nos permitirán saber cuándo debemos pasar a otra columna.

Este es el código que he programado:

Option Explicit
Sub NUMEROSPRIMOS()
    'Definimos variables
    Dim Cont1 As Long, Cont2 As Long, i As Long, j As Long, RANGO As Object
    Dim Columna As Long, Primus As Double, Formulario As Variant, Miarray As Variant
    'Desactivamos actualización de pantalla
    Application.ScreenUpdating = False
    'creamos inputbox, validamos si el formulario está vacío o los datos son incorrectos
    Formulario = InputBox("INDICA LARGO DE COLUMNA Y LIMITE HASTA EL QUE CALCULAR LOS NÚMEROS PRIMOS:" & Chr(13) & _
    Chr(13) & "EJEM: 10,600", "GENERAR NÚMEROS PRIMOS")
    If Formulario = Empty Then Exit Sub
    On Error GoTo etiqueta
    Miarray = Split(Formulario, ",")
    On Error GoTo 0
    'Si existen datos los borramos de la hoja
    With ActiveSheet
        .Range("A1", ActiveCell.SpecialCells(xlLastCell)).Select
        Selection.Clear
        'Inicializamos proceso
        Cont1 = 1
        Columna = 1
        'Pasamos los datos del inputbox al proceso
        For i = 1 To Miarray(1)
            'creamos un bucle desde 1 a límite que hayamos elegido
            If Cont1 <= Miarray(0) Then
                Cont2 = 0
                'creamos un segundo bucle para comprobar si el número es o no primo
                'si es igual a cero y el contador acumula 2 ceros únicamente, es primo
                For j = 1 To Miarray(1)
                'para verificar si es primo utilizamos función mod, cuando el residuo sea 0
                    Primus = i Mod j
                    'podriamos usar también: Primus = i - (j * Fix(i / j))
                    If Primus = 0 Then Cont2 = Cont2 + 1
                    Next j
                    If Cont2 = 2 Then
                        Cells(Cont1, Columna).Value = i
                        Cont1 = Cont1 + 1
                    End If
                Else
                    Cont1 = 1
                    Columna = Columna + 1
                End If
                Next i
            End With
            ActiveCell.Select
            Exit Sub
etiqueta:
            MsgBox ("VERIFICA LOS DATOS QUE HAS INTRODUCIDO E INTÉNTALO DE NUEVO"), vbExclamation
        End Sub

Cómo podéis observar, para detectar los números primos he utilizado esta fórmula: Primus = i Mod j. Aunque podríamos utilizar otras dos (ver post anterior).

Si os fijáis en el código veréis cómo utilizo varios contadores (uno para el detección de los números primos y otro para controlar el final de cada columna.

Y esto es todo, creo que es un ejercicio muy interesante y estoy seguro que os puede resultar de utilidad en algún momento.

Descarga el archivo de ejemplo pulsando en:

¿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

Comparte este post