In questo articolo scoprirai come creare da zero un file Excel in grado di creare la tabella dei numeri primi in maniera dinamica.
Ricordiamo che "In matematica, un numero primo (in breve anche primo) è un numero intero positivo che abbia esattamente due divisori distinti". Quindi ad esempio 3, 5 e 7 sono numeri primi - mentre 10 (2x5) oppure 15 (3x5) non lo sono.
Il file è compatibile esclusivamente con Excel 365 viste le funzioni utilizzate ma se scarichi il file e hai una versione precedente potrai comunque scaricare e stampare due fogli ottimizzati per la stampa:
- Foglio 1_100 con l'intero elenco di numeri da 1 a 100 (ed evidenziati i numeri primi)
- Foglio SOLO_PRIMI_1_1000 che presenta unicamente i numeri primi da 1 a 1000
Prima di tutto, se vuoi utilizzare questo file ricordati di abilitare le macro. Se ti appare una schermata con "Le macro sono state disabilitate" devi cliccare su "Abilita contenuto" per farla funzionare.
Basta andare sul foglio NUMERI_PRIMI per poi:
- Cliccare su PARTENZA MACRO (il pulsante rosso in alto a destra)
- Inserire il numero più piccolo dell'intervallo che ci interessa (numero iniziale)
- Inserire il numero più grande dell'intervallo che ci interessa (numero finale)
- Et voilà: il file ci restituirà nella colonna D la fila di numeri primi dell'intervallo desiderato, mentre nelle celle F7, G7 e I7 ci sarà un breve recap (numero iniziale, numero finale, numero totale di numeri primi trovati nell'intervallo)
Se vuoi sapere di più su come è stato creato il file, continua a leggere.
NB: questo articolo e il relativo file sono stati ispirati da questo video di Bill Jelen che racconta come creare un file con numeri primi su Excel. Bill è un MVP di Excel molto conosciuto (tanto da meritarsi il soprannome Mr Excel) e il suo canale Youtube merita sicuramente una visita se stai cercando utilizzi specifici di Microsoft Excel. In particolare, Bill spiega con calma e precisione permettendo di seguirlo facilmente anche nei passaggi più complessi.
Come creare il file per la tabella dei numeri primi
Vediamo come funziona la creazione del file separandolo in diverse sezioni specifiche:
- Creazione della sequenza di numeri che ci interessano
- Creazione del calcolo per trovare i numeri primi
- Come restituire unicamente i numeri primi su una colonna
- Contare il totale di numeri primi totali trovati
- Creare la macro per fare questi calcoli in automatico
- Assegnare la macro alla forma PARTENZA MACRO
Come creare una sequenza di numeri su Microsoft Excel
Il punto di partenza è creare una sequenza di numeri con la funzione SEQUENZA. Questa funzione è un po' particolare dato che come sintassi presenta:
=SEQUENZA(righe;[colonne];[inizio];[passaggio])
Proviamo a metterla in termini più comprensibili:
- La prima parte chiamata righe ci indica quanti numeri ci interessano avere nell'intera sequenza (se 3 saranno 3, se 4 saranno 4 e così via)
- La seconda parte chiamata colonne indica quanto deve essere lunga la sequenza in colonna. Se inseriamo 1, la sequenza sarà su una sola colonna, se inseriamo 2 invece comprenderà due celle (ad esempio A6 e B6)
- La terza parte chiamata inizio è il primo valore della sequenza (se inseriamo 4, inizierà da 4)
- La quarta e ultima parte, passaggio, descrive di quanto bisogna incrementare la sequenza (ad esempio se inseriamo 12 e come inizio mettiamo 4, la sequenza inizierà da 4 per poi andare a 16 e poi 28 e così via)
La progressione avviene sempre da sinistra verso destra e poi verso il basso (se avessimo più colonne). In questo caso non ci interessa dato che abbiamo una sola colonna, ma dobbiamo fare in modo di creare una sequenza dinamica che tenga conto dei valori in F7 e G7:
=SEQUENZA(G7-F7+1;;F7)
Righe sarà la differenza fra il numero più piccolo e il più grande (+1), colonne sarà vuota (dato che non ci interessa), inizio sarà invece il valore in F7. Se inseriamo 12 e 25, la sequenza sarebbe (25-12+1;;12) che diventerebbe =SEQUENZA(14;;12). Avremmo quindi una sequenza da 12 a 25 come desiderato (12 conta come 1, 13 come 2 e così via).
Come trovare i numeri primi su Microsoft Excel
Per il momento abbiamo trovato solamente la sequenza di numeri, che abbiamo reso dinamica collegandola con F7 e G7. Ma come facciamo per trovare i numeri primi?
=SE.ERRORE(MIN(RESTO(A2/SEQUENZA(1;INT(RADQ(A2))-1;2);1));1)
Questa formula è veramente complicata ma aiuta a comprendere meglio la funzione SEQUENZA. In sostanza per evidenziare se un numero è primo, potremmo trovare il resto dividendolo con tutti i numeri interi precedenti (ad esempio 16 andrebbe diviso per 2,3,4,5,6,7... fino a 15). Se almeno una volta il resto è 0, allora il numero non è primo (16 non è primo perchè 16/2 = 8 con 0 di resto, 16/4 = 4 con 0 di resto etc). Per evitare però di rifare gli stessi calcoli (ad esempio 16/2 oppure 16/8), possiamo impostare così la sequenza per la divisione sfruttando la radice quadrata e la funzione RADQ.
Per numeri grandi (ad esempio 80) ciò significa che, se non c'è un valore per il quale il numero può essere diviso fino a 8 senza resti (la radice quadrata di 80 è inferiore a 9, quindi arriviamo massimo a 8 prima di ripeterci), sicuramente non lo troveremo oltre (avendo già fatto i calcoli precedenti fino a 8, sappiamo che non possiamo ad esempio avere 15 come unico numero possibile perchè avremmo già trovato l'altro valore minore nei calcoli precedenti).
L'immagine riassume quello che succede con i resti (evidenziati in verde). Possiamo ridurre il numero di calcoli totali necessari, come vediamo dall'immagine [quando dividiamo per 10, l'altro divisore diventa 8, quindi non c'è bisogno di dividere ad esempio per 11 dato che era già contenuto fra 7 e 8]:
Facciamo l'esempio con il numero 16:
=SEQUENZA(1;INT(RADQ(A2))-1;2) -> =SEQUENZA(1;3;2) -> = {2\3\4}
Se il numero fosse 16, il valore sarebbe =SEQUENZA(1;INT(RADQ(16))-1;2) per poi arrivare a =SEQUENZA(1;INT(4))-1;2) e quindi =SEQUENZA(1;3;2).
In questo caso i numeri da dividere sarebbero 2 (che è il valore di partenza), 3 (perchè ci spostiamo di uno) e 4 (perchè il valore in colonna è 3, quindi dobbiamo contare tre numeri).
Abbiamo quindi un numero che viene diviso per un intervallo di valori. In questo caso vediamo come trovare la soluzione al nostro problema:
=MIN(RESTO(A2/SEQUENZA(1;INT(RADQ(A2))-1;2);1)
La funzione RESTO divide il nostro numero (16) per la sequenza che abbiamo trovato (2,3,4). Successivamente, tutti questi valori vengono divisi per 1 (che è il divisore della funzione RESTO). Poi, troviamo il valore minimo (MIN) fra tutti questi.
Vediamo sempre l'esempio con 16:
=MIN(RESTO(16/{2\3\4};1)
Il minimo in questo caso (dato che 16 può essere diviso sia per 4 sia per 2) è sicuramente 0. Possiamo quindi dire che 16 non è un numero primo.
=MIN(RESTO({8\5,33\4};1) -> =MIN({0\0,33\0}) => 0
Terminata questa parte, dobbiamo inserire il SE.ERRORE per indicare che 2 e 3 sono numeri primi. Il problema è che utilizzando la funzione con RADQ la sequenza diventa negativa quindi ci genera un errore (con 2 diventerebbe =SEQUENZA(1;INT(RADQ(2))-1;2) -> =SEQUENZA(1;INT(0,4142);2) -> =SEQUENZA(1;0;2).
La formula definitiva è quella segnalata in precedenza, che dobbiamo ricordarci di trascinare in fondo seguendo le celle valide della colonna A.
Creare un nome definito con Microsoft Excel
In questo caso vogliamo facilitarci nella restituzione dei valori nella colonna D, quindi creiamo due nomi definiti che comprenderanno rispettivamente la colonna A (NUMERI) e la colonna B (RESTI). La particolarità è che creeremo dei nomi dinamici che comprendano unicamente le celle che ci interessano, ovvero quelle con dei valori all'interno.
Clicchiamo su Formule -> Gestione Nomi -> Nuovo:
Vediamo come trovare la formula per NUMERI. Come dicevamo vogliamo che la formula sia dinamica e che prenda in considerazione solo celle che abbiano un valore:
La formula riassunta è:
=SCARTO(NUMERI_PRIMI!$A$2;0; 0;CONTA.VALORI(NUMERI_PRIMI!$A:$A)-1; 1)
Iniziamo dalla funzione SCARTO, che parte da A2 dato che è il punto di partenza che ci interessa. Stiamo dicendo a Excel di non muoversi nè di righe nè di colonne (sono entrambi pari a 0), però stiamo anche contando i singoli valori con CONTA.VALORI dell'intera colonna togliendone solo 1 (che è A1) e di non muoversi in larghezza. La funzione riassume tutti i valori da A2 in poi, che sono dipendenti da quello che inseriamo in F7 e G7.
Vediamo il nome RESTI:
=SCARTO(NUMERI_PRIMI!$B$2;0; 0;CONTA.VALORI(NUMERI_PRIMI!$B:$B)-1; 1)
Il calcolo è lo stesso, solo che in questo caso stiamo iniziando da B2 dato che ci interessa la colonna B.
Come restituire unicamente i valori dei numeri primi con Excel
In questo caso dobbiamo utilizzare la funzione FILTRO per recuperare, fra i numeri della colonna A, quelli che abbiano un resto maggiore di zero ed ignorare i numeri uguali a 1 (dato che ci viene restituito, erroneamente, come numero primo):
=FILTRO(A2#;(RESTI>0)*(NUMERI<>1))
Stiamo utilizzando i nomi RESTI e NUMERI che abbiamo trovato in precedenza, in modo da poterli utilizzare all'interno dei calcoli senza problemi essendo dinamici (comprendono solo le celle con dei valori). Notiamo come ci sia un # che indica un intervallo di grandezza variabile, questo è uno dei grandi vantaggi di Excel 365 rispetto alle versioni precedenti di Excel perchè non dobbiamo definire ogni volta la grandezza dell'intervallo (array dinamico).
Come contare i numeri primi in un intervallo con Excel
In questo caso vogliamo fare una piccola modifica per aggiungere anche il totale dei numeri primi validi nella colonna D partendo da D2:
=CONTA.VALORI(D2#)
Il cancelletto # lavora in maniera dinamica e ci restituirà il numero totale di valori che troveremo da D2 in poi.
Come creare la tabella dei numeri primi con VBA su Excel
Per il momento il file funziona e se inseriamo dei nuovi valori in F7 e G7 possiamo trovare in autonomia tutti i numeri primi che desideriamo. Nel file è stata però inserita una macro per velocizzare questo passaggio creando un'interfaccia più comoda per l'inserimento, vediamo come.
Ho riassunto il codice che trovi nella macro per permetterti di capire meglio come funziona. Mi pare che questo approfondimento ti possa essere utile per modificarlo come preferisci, dato che non sempre il codice in VBA è facile da comprendere. Se vuoi visionarlo sul file, puoi cliccare su Sviluppo -> Macro -> Modifica.
Tutte le righe che iniziano con ' sono commenti che puoi tranquillamente ignorare se sai programmare con Visual Basic for Applications (o VBA).
Option Explicit
Sub Numeri_Primi()
Application.ScreenUpdating = False
'Evitiamo che ci siano calcoli sullo schermo
Dim iniziale As Variant
Dim finale As Variant
'Definiamo iniziale e finale quali punto iniziale e finale del nostro intervallo
Dim my_range As Range
Dim my_sheet As Worksheet
Dim last_row As Long
'Definiamo l'intervallo, il foglio di riferimento e l'ultimo valore che ci interessa per le formule
Set my_sheet = ThisWorkbook.Worksheets("NUMERI_PRIMI")
'Definiamo che il foglio che ci interessa è quello chiamato NUMERI_PRIMI
Range("B3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
'Cancella il contenuto da B3 in poi
Range("F7").Select
Selection.ClearContents
'Cancella il contenuto di F7
Range("G7").Select
Selection.ClearContents
'Cancella il contenuto di G7
iniziale = InputBox("Inserisci il numero iniziale")
'Crea la maschera per inserire il primo valore
Range("F7").Select
Range("F7").Value = iniziale
'Seleziona la cella F7 e la rende uguale al valore inserito
finale = InputBox("Inserisci il numero finale")
Range("G7").Select
Range("G7").Value = finale
'Seleziona la cella G7 e la rende uguale al valore inserito
last_row = my_sheet.Cells(Rows.Count, 1).End(xlUp).Row
'Definisce l'ultimo valore che ci interessa per i calcoli, ovvero l'ultima cella con un valore valido nella colonna A
Set my_range = my_sheet.Range("B2:B" & last_row)
'Definisce l'intervallo come l'intervallo fra B2 e B[ultimo_valore]. Ad esempio B2:B100
my_sheet.Range("B2").Select
Selection.Copy
my_range.PasteSpecial Paste:=xlPasteFormulas, operation:=xlPasteSpecialOperationNone
'Seleziona la formula in B2 e la copia in fondo fino all'ultima cella che ci interessa
Application.CutCopyMode = False
'Cancella i valori che abbiamo nel copia
Application.Goto Reference:=my_sheet.Range("I7")
'Terminata la macro, torna al nostro foglio nella cella I7
End Sub
Come assegnare la macro a una forma su Microsoft Excel
Per velocizzare la parte di utilizzo della macro, abbiamo creato una forma (Inserisci -> Forma) e abbiamo scritto "PARTENZA MACRO" modificandone lo stile. Se vogliamo far partire la macro cliccando questa forma, dobbiamo quindi cliccare con il tasto destro sulla forma stessa:
Nel menu contestuale che si aprirà, notiamo che c'è una sezione chiamata "Assegna macro..." che è proprio quella che ci interessa:
A questo punto selezioniamo la macro Numeri_Primi, che abbiamo creato in precedenza:
Ora, tutte le volte che cliccheremo sulla forma "PARTENZA MACRO", la macro ripartirà permettendoci nuovi calcoli.
Come utilizzare il file per creare la tabella dei numeri primi
Abbiamo visto come è stato creato il file e come possiamo replicarlo da zero, utilizzando varie formule complesse e un po' di VBA. Sicuramente lo stesso file si può creare anche in versioni di Excel precedenti alla 365, ma molte delle funzionalità dell'ultima versione sul mercato aiutano parecchio nella semplicità di creazione. Se vuoi scaricarlo, clicca sul pulsante!
Sono un formatore e consulente esperto nell’uso e nell’insegnamento di Microsoft Excel.
Negli ultimi 3 anni ho tenuto corsi presso realtà in multinazionali come Aruba, Bridor, IMI Orton, Primadonna e SISAL, oltre a PMI e startup di diverso genere.
Realizzo corsi di formazione Excel dedicati per aziende, supporto professionisti 1:1 a distanza con call mirate e collaboro con aziende offrendo servizi di consulenza quali creazione di business plan, dashboard di vendita e non solo.
Vuoi saperne di più? Prenota una call gratuita di 15′!