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.
¡¡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