Novità

EXCEL E DINTORNI

Ripristinato vecchi Aggiorna Archivio spero senza nulla che richiami kìattenzione degli Antivirus.
Come prima dal foglio Archivio basta cliccare su Aggiorna Archivio, verrà aggiornato anche ArchivioFiltrato, se volete cambiare data d'inizio e/o fine archivio usate il pulsante Cambia Data
 
  • Like
Reazioni: KEN
Ken ho trovato una nota del Baciccia, diceva semplicemente OK. Credo stesse a significare che ti considerava OK.
Il messaggio che ti appare indica semplicemente che non hai creato (e dovevi farlo se io fossi stato piùchiaro nelle spiegazioni) su C:\

Vedi l'allegato 2315793

Poi dopo aver scaricato il file ZIP (ACC! se mi avessero confermato che l'altro file non veniva segnalato come Virus, avrei già aggiornato)
lo devi estrarre in questa cartella, e poi dal foglio Archivio, cliccare su Aggiorna.
Abbi pazienza credo che anche senza ulteriori coferme ripristinerò il vecchio Aggiorna, per non diventar scemi.Se non riesci ad aggiornare dimmelo e ti metto il file aggiornato.
Acc. Con te siamo già in 5. Allora conquisteremo la Sardegna altro che Isola d'Elba che non riesco a trovare sulla carta geografica! Che sia perché è quella della Grecia?
Ho scaricato il file excel sul desktop e sbloccato , ho provato il percorso che hai mostrato ma non ho trovato quelle cartelle.
Adesso ho scaricato ultimo file che hai messo aggiornato proverò le prossime estrazioni se aggiorna grazie per la tua disponibilità .
 
Vedi l'allegato 2315794

Nel mentre sto testando alcuni metodi trovati su Internet (non posso dirvi dove per le regole di questo Forum), comunque se cercate Metodi lotto, in uno dei siti proposti troverete Terno secco sulla Nazionale
Io ho ampliato le ricerche a qualsiasi ruota vogliate (Isola d'Elba esclusa!)
Inricordo tra quali numeri delle due ultime righe si può fare la previsione in lunghetta su nazionale in corso? Interessa sapere quali sono i numeri delle lunghette per favore grazie
 
Inricordo tra quali numeri delle due ultime righe si può fare la previsione in lunghetta su nazionale in corso? Interessa sapere quali sono i numeri delle lunghette per favore grazie
questi foglio che sto finendo, non sono stati ancora controllati, per vedere se ci fossero errori, dico questi fogli perchè ne ho fatto altri due

1780426256352.png

1780426300794.png

devo pero ancora finirli e testarli (non per i risultati, quello è, poi, compito vostro) perché a volte ci sono errori nascosti e cerco di individuarli, probabilmente senza riuscirci, però ci provo.
Inmerito alla domanda i tre numeri delle due terzine sono questi:
1780427211223.png
Aggiornati alla 30/05/2026
Però attenzione le statistiche sono su 18 estrazioni e veniamo da 7 giocate positive consecutive entro 11 estrazioni c'è da aspettarsi una o più estrazioni negative.
Ma i dati in mio possesso sono ancora pochi. Non avere fretta, fai giocate virtuali e quando decidi di giocare cerca di avere altre segnalazioni che, in qualche modo rafforzino, la previsione, sapendo sempre che una mano importante spetta alla fortuna.
 

Allegati

  • 1780426963965.png
    1780426963965.png
    1,2 KB · Visite: 8
Infatti grazie avevo già intuito le negatività
Ho dovuto rinunciare a due macro che sembravano promettenti, oggi le AI continuano a fare macro che non funzionano. Forse è colpa delle mie idee confuse o forse no.
Comunque:
1780440533291.png
118 esiti positivi su 243 previsioni non è ottimo, ma non è nemmeno malvagio.Sono metodi pubblicati dai cosiddetti Esperti (quelli che si autonominano esperti). Hanno alcuni comportamenti tipici:

1) pubblicano centinaia di metodi e migliaia di previsioni, tra le quali, ogni tanto, una si avvera. Allora dimenticando i diecimila eventi negativi esaltano quell'unica previsione azzeccata;

2) Si esprimono usando un linguaggio apparentemente da esperti, incomprensibile ai più, e anche a loro se è per questo. Tendono a riunirsi in cerchie di mutuo incensamento... Complmenti Mister X le sue previsioni sono una Bomba!, Si figuri Mister Y se non fosse stato per il suo altissimo... e via prenendo per i fondelli.

3) poi ci sono le ex postine, che scoperto quanto rende prendere per il Censored hanno fatto quaterne su quaterne, anche giocando numeri mai usciti su ruote inesistenti. Il pollo di turno che abbocca lo trovano sempre (e non sono pochi)

4) Poi ci sono i nuovi Leonardo da Vinci, che sanno tutto di tutto, che intervengono anche se stai parlando dei cavoli tuoi, non risparmiando nessuno coi loro consigli, osservando tutto dall'alto della loro arroganza. Sono quelli, per intenderci, che ti perculano se non sai fare cose che loro pensano semplici.

Poi ce ne sono altri con mille mila facce diverse.

Poi per fortuna ci sono anche quelli che facendo quel che possono sono più che disponibili, alcuni su questo sito, ma sono rarità, peccato perché la condiisione arricchisce.

Poi ci sono io che studio da tempo il modo di rubarvi i soldi, ma ahime! non sapendo niente di niente non so da che parte iniziare.
Qualche suggerimento? Potrei farmi chiamare il Damo Verde, oppure Mr Terno col Binocolo?
Potrei scrivere sul Terno della Scimmia Picaresca che negli ultimi venti secoli ha sempre garantito la Vincita. Metodo segretissimo in vendita all'eccezionale offerta, solo per oggi per i prossimi 30 anni, di 50 cent, assieme al metodo vi dò anche mia moglie e tutti i miei familiari (beh, non tutti, non vi voglio così male dopotutto!).

a parte gli scherzi, e non scherzo, giocare 1 euro, anche con 5 numeri permette di sognare e soddisfa quel bisogno naturale dell'uomo di "giocare".
Non smetta di sognare, è l'unica cosa che, per ora, non possono portarci via.
 
ho provato python, non ci capisco niente (e quando mai ho capito qualcosa?).
Ma come diceva un mio carissimissimo amico: "Che te' freca? Fottitteni"
ho tirato (la AI ha tirato) fuori questo:
Generato il: 03/06/2026 12:46

====================================================================
LUNGHETTE RICORRENTI | GENNAIO | Ruota BA
====================================================================
Anni totali analizzati : 26
Soglia minima : ambo in almeno 15 anni su 26
====================================================================

--- LUNGHETTE DA 2 NUMERI (top 1) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
48 - 87 15/26 58% [2001, 2002, 2004, 2006, 2008, 2009]... +9

--- LUNGHETTE DA 3 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 48 - 87 20/26 77% [2001, 2002, 2004, 2006, 2007, 2008]... +14
35 - 48 - 87 20/26 77% [2001, 2002, 2004, 2005, 2006, 2007]... +14
37 - 48 - 87 20/26 77% [2001, 2002, 2004, 2005, 2006, 2007]... +14
39 - 48 - 87 20/26 77% [2001, 2002, 2004, 2005, 2006, 2007]... +14
48 - 49 - 87 20/26 77% [2001, 2002, 2004, 2005, 2006, 2007]... +14

--- LUNGHETTE DA 4 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
10 - 19 - 48 - 87 25/26 96% [2001, 2002, 2004, 2005, 2006, 2007]... +19
10 - 28 - 48 - 87 25/26 96% [2001, 2002, 2003, 2004, 2005, 2006]... +19
10 - 48 - 55 - 87 25/26 96% [2001, 2002, 2003, 2004, 2005, 2006]... +19
10 - 37 - 48 - 87 24/26 92% [2001, 2002, 2003, 2004, 2005, 2006]... +18
28 - 37 - 48 - 87 24/26 92% [2001, 2002, 2003, 2004, 2005, 2006]... +18

--- LUNGHETTE DA 5 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
2 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
4 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
5 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
7 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

--- LUNGHETTE DA 6 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 2 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
2 - 3 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
2 - 4 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
2 - 5 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
2 - 6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

--- LUNGHETTE DA 7 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 2 - 3 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 4 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 5 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 7 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

--- LUNGHETTE DA 8 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 2 - 3 - 4 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 5 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 7 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 8 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

--- LUNGHETTE DA 9 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 2 - 3 - 4 - 5 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 7 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 8 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 9 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

--- LUNGHETTE DA 10 NUMERI (top 5) ---
Numeri Anni ambo % Dettaglio anni
-----------------------------------------------------------------
1 - 2 - 3 - 4 - 5 - 6 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 5 - 7 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 5 - 8 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 5 - 9 - 10 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20
1 - 2 - 3 - 4 - 5 - 10 - 11 - 19 - 48 - 87 26/26 100% [2001, 2002, 2003, 2004, 2005, 2006]... +20

====================================================================
SUGGERIMENTO: le lunghette più corte con % alta sono le migliori.
Modifica MIN_ANNI, MESE_SCELTO o RUOTA_SCELTA per altre analisi.

Cu ye? Boh!

questa è la guida all'uso chiesta alla AI:

================================================================
GUIDA ALL'USO - Analisi Lunghette Lotto
(per chi non conosce Python)
================================================================
<span data-prose-review-ignore="">&nbsp;</span>
COS'FA QUESTO PROGRAMMA
------------------------
Analizza lo storico delle estrazioni del Lotto e cerca gruppi
di numeri (chiamati "lunghette") che, in un certo mese dell'anno,
hanno dato almeno un ambo su una ruota a scelta.
<span data-prose-review-ignore="">&nbsp;</span>
In pratica risponde alla domanda:
"Quali numeri escono spesso a Gennaio su Bari, tanto da formare
un ambo quasi ogni anno?"
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
COSA SERVE
----------
1. Python installato sul computer (sembra che tu ce l'abbia già)
2. Il file storico01-oggi.txt in C:\AgiornaLotto
3. Il file analisi_lunghette.py salvato in C:\AgiornaLotto
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
COME SI AVVIA
-------------
Fai doppio clic sul file:
analisi_lunghette.py
<span data-prose-review-ignore="">&nbsp;</span>
Si apre una finestra nera, il programma lavora qualche secondo
(o qualche minuto se i dati sono tanti) e poi mostra i risultati.
<span data-prose-review-ignore="">&nbsp;</span>
Alla fine trovi il file di testo con i risultati nella stessa
cartella C:\AgiornaLotto -- aprilo con il Blocco Note e stampa
con Ctrl+P.
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
COME SI PERSONALIZZA
--------------------
Per cambiare mese, ruota o soglia, apri il file .py con il
Blocco Note (clic destro &gt; Apri con &gt; Blocco Note) e cerca
queste righe in cima:
<span data-prose-review-ignore="">&nbsp;</span>
MESE_SCELTO = 1 &lt;-- cambia il numero del mese
1=Gennaio, 2=Febbraio, ecc.
<span data-prose-review-ignore="">&nbsp;</span>
RUOTA_SCELTA = "BA" &lt;-- cambia la ruota
BA=Bari, CA=Cagliari, FI=Firenze
GE=Genova, MI=Milano, NA=Napoli
PA=Palermo, RM=Roma, TO=Torino
VE=Venezia, NZ=Nazionale
<span data-prose-review-ignore="">&nbsp;</span>
MIN_ANNI = 15 &lt;-- anni minimi in cui la lunghetta
deve aver dato almeno un ambo.
Se non trova nulla, prova con 12
o 10. Se trova troppo, alzalo.
<span data-prose-review-ignore="">&nbsp;</span>
TOP_PER_TAGLIA = 5 &lt;-- quante lunghette mostrare per
ogni dimensione (5, 10, 20...)
<span data-prose-review-ignore="">&nbsp;</span>
Dopo aver cambiato i valori, salva il file (Ctrl+S) e
fai doppio clic di nuovo per rieseguirlo.
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
COME SI LEGGONO I RISULTATI
----------------------------
Esempio di risultato:
<span data-prose-review-ignore="">&nbsp;</span>
--- LUNGHETTE DA 3 NUMERI ---
17 - 26 - 59 18/24 75% [2001,2003,2004,2006...]
<span data-prose-review-ignore="">&nbsp;</span>
Significa:
- La lunghetta è composta dai numeri 17, 26 e 59
- In 18 anni su 24 analizzati ha dato almeno un ambo
(cioè almeno due di quei tre numeri sono usciti
insieme a Gennaio su quella ruota)
- 75% = tre anni su quattro ha funzionato
- I numeri tra parentesi sono gli anni in cui ha dato ambo
<span data-prose-review-ignore="">&nbsp;</span>
Obiettivo: trovare la lunghetta PIÙ CORTA con la % PIÙ ALTA.
Una lunghetta da 4 numeri all'85% è meglio di una da 8 numeri
al 90%, perché costa meno da giocare!
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
CONSIGLI PRATICI
----------------
- Inizia con MIN_ANNI = 15 e vedi cosa trova
- Se non trova nulla, abbassa a 12 poi a 10
- Le lunghette da 2 numeri (ambo secco) sono rarissime
ad alta percentuale: più spesso si trovano da 4 a 6 numeri
- Prova mesi diversi: alcuni mesi sono più "stabili" di altri
- Prova ruote diverse: non tutte le ruote si comportano uguale
<span data-prose-review-ignore="">&nbsp;</span>
<span data-prose-review-ignore="">&nbsp;</span>
IN CASO DI PROBLEMI
-------------------
- Finestra nera che si apre e chiude subito:
clic destro sul file .py &gt; Apri con &gt; Python
oppure apri prima il Prompt dei Comandi (cerca "cmd" nel menu
Start), vai nella cartella con:
cd C:\AgiornaLotto
e digita:
python analisi_lunghette.py
<span data-prose-review-ignore="">&nbsp;</span>
- "File non trovato":
controlla che il file storico01-oggi.txt sia esattamente
in C:\AgiornaLotto e che il nome sia scritto uguale.
<span data-prose-review-ignore="">&nbsp;</span>
================================================================
<span data-prose-review-ignore="">&nbsp;</span>
 
Se qualcuno di voi è come me, cioè non capisce nulla e vuole comunque provare, posso spiegarvi, passo passo, se me lo ricordo, come installare Thonny (Python) sposorizzato su questi post, per provare a far qualcosa. non siate timidi o spaventati, quelli che capiscono non vi danno nulla, noi che non capiamo una beata mazza cerchiamo di far qualcosa, risibile quanto si vuole ma "nostro".
Se state pensando chi io? Che non riesco neanche a salvare un file dove voglio? Ma che scherziamo? Si proprio tu che come me vaghi sperduto nel disco per cercare quella cosa che pure era lì! E ora sembra scomparsa. Maledetta! Esci dentro!
Per tutte quelle tre, quattro persone che perdono tempo leggendo i miei fuori di testa, se volete iniziare scaricate questo:

1780484684215.png

vi appare questa finestra:

1780484727362.pngMandatela a quel paese cliccano in basso scritto in grigio quasi invisibile 1780484769607.png
e arriverete qui (bei pdm che sono vero?)
1780484830633.png

cliccate e inizia, finalmente, il download (se avete un antivirs ecc come malwarebytes vi sconsiglierà di scaricare, no mse preocupe non ci sono rischi.
Se lo fate ditemelo e vi spiegherò come andare avanti. PODEMOS!
f
 
Le ia fanno molti errori dipende anche da come viene fatta la richiesta 2 + 2 fa 4, ma non ti dice che anche 3+ 1 fa 4
Io mi trovo meglio con Deepseek
 
Le ia fanno molti errori dipende anche da come viene fatta la richiesta 2 + 2 fa 4, ma non ti dice che anche 3+ 1 fa 4
Io mi trovo meglio con Deepseek
Probabilmente è come Windows, Linux, Mac ognuno ha i suoi preferiti.
Non sottovalutare le AI sono al contempo più e meno di quello che pensi. Poi dipende da cosa cerchi. Se cerchi la soluzione ai tuoi problemi, la vincita sicura al lotto, la salute eterna e la ricchezza senza confini... Beh! Rimarrai deluso.
Le AI hanno quei limiti che, chi le gestisce, ha voluto porle (se le usiamo noi).
Pensa in pochi secondi ho utilizzato qualcosa che non ho idea neanche di come funzioni. Graie alle AI. Chiedi a qualcuno su questo Forun o su altri di guidarti allo stesso modo...
Noi siamo ciò che possimo fare. E io posso fare poco o niente. Ma con l'aiuto delle AI posso fare molto, male magari, ma posso farlo.
Tutti possono fare qualcosa se gli altri non le tarpano le ali con le loro vigliaccherie. Io, tu altri come noi possiamo mandare a quel paese gli arroganti di turno grazie alle AI. Ti sembra poco?
 
Ultima modifica:
Se hai Thonny ...

questo Browser con evidenziatore è fatto quasi esclusivamente con l'IA.

Ci ho impiegato un giorno a fargli allineare il conteggio delle Estrazioni da zero a uno ...

ma adesso sembra funzionare!

Codice:
import tkinter as tk
from tkinter import messagebox, font
import os

class LottoBrowser:
    def __init__(self, master, estrazioni):
        self.master = master
        self.estrazioni = estrazioni
        self.index = len(estrazioni) - 1
        self.max_index = len(estrazioni) - 1

        self.master.title("Browser Estrazioni By Joe")
        self.master.geometry("520x550")

        self.text = tk.Text(master, font=("Courier New", 14), width=45, height=16)
        self.text.pack(pady=10, padx=20)
        self.text.config(state="disabled")

        self.colori = ['red', 'blue', 'green', 'orange', 'purple', 'brown', 'cyan', 'magenta', 'darkgreen', 'darkblue']

        control_frame = tk.Frame(master)
        control_frame.pack(pady=5, fill='x', padx=20)

        self.slider = tk.Scale(control_frame, from_=0, to=self.max_index, orient="horizontal",
                               showvalue=False, command=self.slider_moved)
        self.slider.pack(side="left", fill='x', expand=True, padx=5)

        self.entry_var = tk.StringVar()
        self.entry = tk.Entry(control_frame, width=8, textvariable=self.entry_var, justify='center')
        self.entry.pack(side="right", padx=5)
        self.entry.bind("<Return>", self.entry_submitted)

        nav_frame = tk.Frame(master)
        nav_frame.pack(pady=10)

        self.auto_scroll_job = None

        self.prev_button = tk.Button(nav_frame, text=" << Indietro ", width=15)
        self.prev_button.pack(side="left", padx=10)
        self.prev_button.bind("<ButtonPress-1>", self.start_auto_scroll_prev)
        self.prev_button.bind("<ButtonRelease-1>", self.stop_auto_scroll)

        self.next_button = tk.Button(nav_frame, text=" Avanti >> ", width=15)
        self.next_button.pack(side="left", padx=10)
        self.next_button.bind("<ButtonPress-1>", self.start_auto_scroll_next)
        self.next_button.bind("<ButtonRelease-1>", self.stop_auto_scroll)

        self.show_estrazione()

    def show_estrazione(self):
        if not self.estrazioni:
            return
          
        estrazione = self.estrazioni[self.index]
        numeri_list = estrazione['Numeri'].split(', ')
        ruote = ["Ba", "Ca", "Fi", "Ge", "Mi", "Na", "Pa", "Ro", "To", "Ve", "Nz"]
      
        numeri_list_formattati = [f"{int(n):02d}" for n in numeri_list]

        counts = {}
        for n in numeri_list_formattati:
            counts[n] = counts.get(n, 0) + 1
        duplicati = [num for num, c in counts.items() if c > 1]

        mappa_colori = {num: self.colori[i % len(self.colori)] for i, num in enumerate(duplicati)}

        self.text.config(state="normal")
        self.text.delete("1.0", tk.END)

        bold_font = font.Font(self.text, self.text.cget("font"))
        bold_font.configure(weight="bold")
        for col in mappa_colori.values():
            self.text.tag_configure(f"col_{col}", foreground=col, font=bold_font)

        header = f"Estrazione {self.index + 1} di {self.max_index + 1}\n"
        header += f"Data: {estrazione['Data']}\n"
        header += "-" * 30 + "\n"
        self.text.insert(tk.END, header)

        for i in range(0, len(numeri_list_formattati), 5):
            idx_ruota = i // 5
            if idx_ruota < len(ruote):
                ruota_nome = ruote[idx_ruota]
                gruppo = numeri_list_formattati[i:i+5]
              
                self.text.insert(tk.END, f"{ruota_nome}: ")
                for num in gruppo:
                    start_idx = self.text.index(tk.END + "-1c")
                    self.text.insert(tk.END, num + " ")
                    end_idx = self.text.index(tk.END + "-1c")
                  
                    if num in mappa_colori:
                        self.text.tag_add(f"col_{mappa_colori[num]}", start_idx, end_idx)
                self.text.insert(tk.END, "\n")

        self.text.config(state="disabled")
        self.slider.set(self.index)
        self.entry_var.set(str(self.index + 1))

    def slider_moved(self, val):
        self.index = int(val)
        self.show_estrazione()

    def entry_submitted(self, event=None):
        try:
            val_int = int(self.entry_var.get()) - 1
            if 0 <= val_int <= self.max_index:
                self.index = val_int
                self.show_estrazione()
            else:
                messagebox.showwarning("Attenzione", f"Inserire un valore tra 1 e {self.max_index + 1}")
        except ValueError:
            messagebox.showerror("Errore", "Inserire un numero valido")

    def start_auto_scroll_prev(self, event):
        if self.index > 0:
            self.index -= 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(200, self.auto_scroll_prev)

    def auto_scroll_prev(self):
        if self.index > 0:
            self.index -= 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(50, self.auto_scroll_prev)

    def start_auto_scroll_next(self, event):
        if self.index < self.max_index:
            self.index += 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(200, self.auto_scroll_next)

    def auto_scroll_next(self):
        if self.index < self.max_index:
            self.index += 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(50, self.auto_scroll_next)

    def stop_auto_scroll(self, event):
        if self.auto_scroll_job:
            self.master.after_cancel(self.auto_scroll_job)
            self.auto_scroll_job = None

def carica_estrazioni_da_file_speciale(file_path):
    estrazioni = []
    if not os.path.exists(file_path):
        messagebox.showerror("Errore", f"File non trovato: {file_path}")
        return estrazioni
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if len(line) < 118:
                    continue

                giorno = line[0:2]
                mese = line[2:4]
                anno = line[4:8]
                data = f"{giorno}/{mese}/{anno}"

                numeri_raw = line[8:118]
                numeri = [numeri_raw[i:i+2] for i in range(0, 110, 2)]

                numeri_formattati = [str(int(n)) for n in numeri]

                estrazioni.append({
                    'Data': data,
                    'Numeri': ', '.join(numeri_formattati)
                })
    except Exception as e:
        messagebox.showerror("Errore Caricamento", str(e))
    return estrazioni

if __name__ == "__main__":
    file_path = r"C:\*****\Archivio.txt"

    estrazioni = carica_estrazioni_da_file_speciale(file_path)

    root = tk.Tk()
    if estrazioni:
        app = LottoBrowser(root, estrazioni)
        root.mainloop()
    else:
        root.destroy()

Nelle ultime righe c'è il link all'archivio che DEVE essere quello presente nella cartella ArcTvl di Spaziometria

e che deve essere possibilmente aggiornato.

:)
 
Se hai Thonny ...

questo Browser con evidenziatore è fatto quasi esclusivamente con l'IA.

Ci ho impiegato un giorno a fargli allineare il conteggio delle Estrazioni da zero a uno ...

ma adesso sembra funzionare!

Codice:
import tkinter as tk
from tkinter import messagebox, font
import os

class LottoBrowser:
    def __init__(self, master, estrazioni):
        self.master = master
        self.estrazioni = estrazioni
        self.index = len(estrazioni) - 1
        self.max_index = len(estrazioni) - 1

        self.master.title("Browser Estrazioni By Joe")
        self.master.geometry("520x550")

        self.text = tk.Text(master, font=("Courier New", 14), width=45, height=16)
        self.text.pack(pady=10, padx=20)
        self.text.config(state="disabled")

        self.colori = ['red', 'blue', 'green', 'orange', 'purple', 'brown', 'cyan', 'magenta', 'darkgreen', 'darkblue']

        control_frame = tk.Frame(master)
        control_frame.pack(pady=5, fill='x', padx=20)

        self.slider = tk.Scale(control_frame, from_=0, to=self.max_index, orient="horizontal",
                               showvalue=False, command=self.slider_moved)
        self.slider.pack(side="left", fill='x', expand=True, padx=5)

        self.entry_var = tk.StringVar()
        self.entry = tk.Entry(control_frame, width=8, textvariable=self.entry_var, justify='center')
        self.entry.pack(side="right", padx=5)
        self.entry.bind("<Return>", self.entry_submitted)

        nav_frame = tk.Frame(master)
        nav_frame.pack(pady=10)

        self.auto_scroll_job = None

        self.prev_button = tk.Button(nav_frame, text=" << Indietro ", width=15)
        self.prev_button.pack(side="left", padx=10)
        self.prev_button.bind("<ButtonPress-1>", self.start_auto_scroll_prev)
        self.prev_button.bind("<ButtonRelease-1>", self.stop_auto_scroll)

        self.next_button = tk.Button(nav_frame, text=" Avanti >> ", width=15)
        self.next_button.pack(side="left", padx=10)
        self.next_button.bind("<ButtonPress-1>", self.start_auto_scroll_next)
        self.next_button.bind("<ButtonRelease-1>", self.stop_auto_scroll)

        self.show_estrazione()

    def show_estrazione(self):
        if not self.estrazioni:
            return
         
        estrazione = self.estrazioni[self.index]
        numeri_list = estrazione['Numeri'].split(', ')
        ruote = ["Ba", "Ca", "Fi", "Ge", "Mi", "Na", "Pa", "Ro", "To", "Ve", "Nz"]
     
        numeri_list_formattati = [f"{int(n):02d}" for n in numeri_list]

        counts = {}
        for n in numeri_list_formattati:
            counts[n] = counts.get(n, 0) + 1
        duplicati = [num for num, c in counts.items() if c > 1]

        mappa_colori = {num: self.colori[i % len(self.colori)] for i, num in enumerate(duplicati)}

        self.text.config(state="normal")
        self.text.delete("1.0", tk.END)

        bold_font = font.Font(self.text, self.text.cget("font"))
        bold_font.configure(weight="bold")
        for col in mappa_colori.values():
            self.text.tag_configure(f"col_{col}", foreground=col, font=bold_font)

        header = f"Estrazione {self.index + 1} di {self.max_index + 1}\n"
        header += f"Data: {estrazione['Data']}\n"
        header += "-" * 30 + "\n"
        self.text.insert(tk.END, header)

        for i in range(0, len(numeri_list_formattati), 5):
            idx_ruota = i // 5
            if idx_ruota < len(ruote):
                ruota_nome = ruote[idx_ruota]
                gruppo = numeri_list_formattati[i:i+5]
             
                self.text.insert(tk.END, f"{ruota_nome}: ")
                for num in gruppo:
                    start_idx = self.text.index(tk.END + "-1c")
                    self.text.insert(tk.END, num + " ")
                    end_idx = self.text.index(tk.END + "-1c")
                 
                    if num in mappa_colori:
                        self.text.tag_add(f"col_{mappa_colori[num]}", start_idx, end_idx)
                self.text.insert(tk.END, "\n")

        self.text.config(state="disabled")
        self.slider.set(self.index)
        self.entry_var.set(str(self.index + 1))

    def slider_moved(self, val):
        self.index = int(val)
        self.show_estrazione()

    def entry_submitted(self, event=None):
        try:
            val_int = int(self.entry_var.get()) - 1
            if 0 <= val_int <= self.max_index:
                self.index = val_int
                self.show_estrazione()
            else:
                messagebox.showwarning("Attenzione", f"Inserire un valore tra 1 e {self.max_index + 1}")
        except ValueError:
            messagebox.showerror("Errore", "Inserire un numero valido")

    def start_auto_scroll_prev(self, event):
        if self.index > 0:
            self.index -= 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(200, self.auto_scroll_prev)

    def auto_scroll_prev(self):
        if self.index > 0:
            self.index -= 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(50, self.auto_scroll_prev)

    def start_auto_scroll_next(self, event):
        if self.index < self.max_index:
            self.index += 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(200, self.auto_scroll_next)

    def auto_scroll_next(self):
        if self.index < self.max_index:
            self.index += 1
            self.show_estrazione()
            self.auto_scroll_job = self.master.after(50, self.auto_scroll_next)

    def stop_auto_scroll(self, event):
        if self.auto_scroll_job:
            self.master.after_cancel(self.auto_scroll_job)
            self.auto_scroll_job = None

def carica_estrazioni_da_file_speciale(file_path):
    estrazioni = []
    if not os.path.exists(file_path):
        messagebox.showerror("Errore", f"File non trovato: {file_path}")
        return estrazioni
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                if len(line) < 118:
                    continue

                giorno = line[0:2]
                mese = line[2:4]
                anno = line[4:8]
                data = f"{giorno}/{mese}/{anno}"

                numeri_raw = line[8:118]
                numeri = [numeri_raw[i:i+2] for i in range(0, 110, 2)]

                numeri_formattati = [str(int(n)) for n in numeri]

                estrazioni.append({
                    'Data': data,
                    'Numeri': ', '.join(numeri_formattati)
                })
    except Exception as e:
        messagebox.showerror("Errore Caricamento", str(e))
    return estrazioni

if __name__ == "__main__":
    file_path = r"C:\*****\Archivio.txt"

    estrazioni = carica_estrazioni_da_file_speciale(file_path)

    root = tk.Tk()
    if estrazioni:
        app = LottoBrowser(root, estrazioni)
        root.mainloop()
    else:
        root.destroy()

Nelle ultime righe c'è il link all'archivio che DEVE essere quello presente nella cartella ArcTvl di Spaziometria

e che deve essere possibilmente aggiornato.

:)
OK lo proverò volentieri. Ora sto provando, è un giorno che la AI cerca di istruirmi, ma temo si sia rassegnata.
Ora sta girando un qualcosa che dovrebbe trovare una sestina e dei numeri da 2 a 10 che, nel corso egli anni in certi periodi si sono riproposti. O qualcosa del genere. perché finisce sempre che la mia richiesta venga prontamente accettata e poi, un pezzo alla volta, completamnete stravolta. D'altra parte alla centesima domanda tecnica scrivo le parole che la AI anela: FAI QUELLO CHE VUOI MA FAI QUALCOSA!
Or gira da più di un'ora ma la AI dice che è normale...
Certo la potenza di Pytho, in confronto a Excel è straordinario, ma sinceramente faccio fatica a comprendere Excel figuriamoci Python.
A buon rendere
 
Il vba di excel e il vbscript di Spaziometria sono parenti stretti e derivazioni del Visual Basic (VB)

Per applicazioni (A) Excel e per script (S) Spaziometria (L8 / LD e altri) .

La logica di programmazione è molto simile.

La differenza più grossa è che con excel i dati sono in una cella (ad es a1 / b4 / az121)

nello script si deve invece assegnare il valore a delle variabili ad esempio a(1) = xyz.

Poi formule ed operatori logici, tecnica di programmazione e sintassi sono molto simili.

Il problema più grosso dello script è che i risultati sono cristallizzati alla fine dell'elaborazione.

Sono un testo, una pagina (HTML), un rendiconto economico, un grafico o un quant'altro.

Non c'è possibilità di "interagire" in tempo reale, mentre lo script viene elaborato.

Mentre con i linguaggi più potenti e le interfacce grafiche si può interagire in tempo reale.

Se potrai utilizzare il browser vedrai che si possono scorrere le estrazioni ed i colori cambiano

assieme ai numeri presenti nell'Estrazione, a seconda delle scelta fatta.


Pertanto a differenza dello script, questo programma in Python NON ha un unico risultato finale.

Ma può rimanere "in funzione" ed esporre tutti gli infiniti risultati che si vorranno avere.

Cioè gli sono possibili quelli di ogni estrazione in archivio e rintracciabile a piacere.

Naturalmente il suo scopo è solo quello di evidenziare con lo stesso colore gli Estratti presenti 2 o più volte.

:)
 
Il vba di excel e il vbscript di Spaziometria sono parenti stretti e derivazioni del Visual Basic (VB)

Per applicazioni (A) Excel e per script (S) Spaziometria (L8 / LD e altri) .

La logica di programmazione è molto simile.

La differenza più grossa è che con excel i dati sono in una cella (ad es a1 / b4 / az121)

nello script si deve invece assegnare il valore a delle variabili ad esempio a(1) = xyz.

Poi formule ed operatori logici, tecnica di programmazione e sintassi sono molto simili.

Il problema più grosso dello script è che i risultati sono cristallizzati alla fine dell'elaborazione.

Sono un testo, una pagina (HTML), un rendiconto economico, un grafico o un quant'altro.

Non c'è possibilità di "interagire" in tempo reale, mentre lo script viene elaborato.

Mentre con i linguaggi più potenti e le interfacce grafiche si può interagire in tempo reale.

Se potrai utilizzare il browser vedrai che si possono scorrere le estrazioni ed i colori cambiano

assieme ai numeri presenti nell'Estrazione, a seconda delle scelta fatta.


Pertanto a differenza dello script, questo programma in Python NON ha un unico risultato finale.

Ma può rimanere "in funzione" ed esporre tutti gli infiniti risultati che si vorranno avere.

Cioè gli sono possibili quelli di ogni estrazione in archivio e rintracciabile a piacere.

Naturalmente il suo scopo è solo quello di evidenziare con lo stesso colore gli Estratti presenti 2 o più volte.

:)
1780517630090.png
bello. ho dovuto adattare il mio file archivio che ho visto è privo della ruota Nazionale dopo il 26/05/2026
 
1780519552551.png

Una sestina interessante la Tabella indica il numero di ambi estratti nel corso degli anni per mese:

1780519621274.png
1780519844300.png


1780519904646.png


1780519957992.png

1780520172945.png

Giugno è appena iniziato, e se non inizia proprio ora a tradire, gli ambi dovrebbero arrivare (su tutte).
Credo che meriti un po' di attenzione (merito di Python)
 
di per se già l'antivirus di w11 esegue un allert eccezionale a mio avviso come lo era w10 ,avendo la versione premium non ho notato nulla di che al momento anche perchè Le 4 rilevazioni Huorong, Jiangmin, QuickHeal, VirIT usano firme generiche ed euristiche (OMacro/Downloader, Dropper, SAgent). Èplausibile e tipico dei falsi positivi per utility con macro che interagiscono con il filesystem o la rete. Anche qui : Il codice scarica da brightstarlottery.it.questo se venisse compromesso, lo zip estratto potrebbe contenere payload malevoli.potrebbe tornare utile generare degli archivi github aggiornabili ma è altra storia. se mi incolli i moduli ModAggiornaArchivio o ModCreaStorico posso dargli un occhiata,dovrebbero esser loro la causa dei rilevamenti ;)
Scusa mi sono accorto solo ora (ero troppo incazzato con me stesso) di cosa mi avevi chiesto:

Macro Aggiorna Archivio:
Option Explicit

Private bCalledFromRicrea As Boolean

Private Function ControllaRiferimenti() As Boolean
Dim testOk As Boolean
testOk = True
On Error Resume Next
Dim testXML As Object
Set testXML = CreateObject("MSXML2.XMLHTTP")
If Err.Number <> 0 Then
MsgBox "Impossibile creare oggetto MSXML. Installare Microsoft XML.", vbCritical
testOk = False
End If
Err.Clear
Dim testStream As Object
Set testStream = CreateObject("ADODB.Stream")
If Err.Number <> 0 Then
MsgBox "Impossibile creare oggetto ADODB.Stream. Installare Microsoft ActiveX Data Objects.", vbCritical
testOk = False
End If
On Error GoTo 0
ControllaRiferimenti = testOk
End Function

Private Function Get7ZipPath() As String
Dim paths(2) As String
paths(0) = "C:\Program Files\7-Zip\7z.exe"
paths(1) = "C:\Program Files (x86)\7-Zip\7z.exe"
paths(2) = Environ("ProgramFiles") & "\7-Zip\7z.exe"
Dim i As Integer
For i = 0 To 2
If Dir(paths(i)) <> "" Then Get7ZipPath = paths(i): Exit Function
Next i
Get7ZipPath = ""
End Function

Private Function TestWritePermissions(ByVal folderPath As String) As Boolean
Dim testFile As String
testFile = folderPath & "\test_" & Format(Now, "yyyymmddhhnnss") & ".tmp"
On Error Resume Next
Open testFile For Output As #1
Close #1
If Dir(testFile) <> "" Then Kill testFile
TestWritePermissions = (Err.Number = 0)
On Error GoTo 0
End Function

Private Function RuotaToCol(ByVal r As String) As Long
Select Case r
Case "BA": RuotaToCol = 4
Case "CA": RuotaToCol = 9
Case "FI": RuotaToCol = 14
Case "GE": RuotaToCol = 19
Case "MI": RuotaToCol = 24
Case "NA": RuotaToCol = 29
Case "PA": RuotaToCol = 34
Case "RM": RuotaToCol = 39
Case "TO": RuotaToCol = 44
Case "VE": RuotaToCol = 49
Case "RN": RuotaToCol = 54
Case Else: RuotaToCol = 0
End Select
End Function

Sub AggiornaArchivio()

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = True


If Not ControllaRiferimenti() Then Exit Sub

Dim zipPath As String
zipPath = Get7ZipPath()
If zipPath = "" Then MsgBox "7-Zip non trovato.", vbCritical: Exit Sub

If Not TestWritePermissions(ThisWorkbook.Path) Then
MsgBox "Permessi insufficienti sulla cartella.", vbCritical: Exit Sub
End If

On Error GoTo ErrorHandler

' Blocca Application solo se chiamata standalone
If Not bCalledFromRicrea Then
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.CalculateBeforeSave = False
.DisplayAlerts = False
.DisplayStatusBar = True
End With
End If

Dim url As String, zipFile As String, txtFile As String
Dim wsArchivio As Worksheet
Dim lastRowArchivio As Long, lastValue As Long
Dim i As Long, j As Long
Dim http As Object, stream As Object, WshShell As Object, fso As Object
Dim fileContent As String, arrLines() As String
Dim riga As String, dataEstrazione As Date
Dim ultimaDataArchivio As Date
Dim Ruota As String, parts() As String
Dim newRowCount As Long
Dim extractPath As String, extractedFile As String
Dim ultimaData As Date

url = "https://www.brightstarlottery.it/STORICO_ESTRAZIONI_LOTTO/storico.zip"
zipFile = Environ("TEMP") & "\LottoTemp.zip"
txtFile = Environ("TEMP") & "\LottoTemp.txt"

On Error Resume Next
If Dir(zipFile) <> "" Then Kill zipFile
If Dir(txtFile) <> "" Then Kill txtFile
On Error GoTo ErrorHandler

Set wsArchivio = ThisWorkbook.Sheets("Archivio")

lastRowArchivio = wsArchivio.Range("C" & Rows.count).End(xlUp).row
If lastRowArchivio >= 9 Then
ultimaDataArchivio = CDate(wsArchivio.Cells(lastRowArchivio, 3).Value)
lastValue = CLng(wsArchivio.Cells(wsArchivio.Range("A" & Rows.count).End(xlUp).row, 1).Value)
Else
ultimaDataArchivio = CDate("01/01/1900")
lastValue = 0
End If

Application.StatusBar = "Download archivio..."
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", url, False
http.Send
If http.Status <> 200 Then
MsgBox "Errore download. Status: " & http.Status
GoTo Cleanup
End If

Set stream = CreateObject("ADODB.Stream")
With stream
.Type = 1
.Open
.Write http.responseBody
.SaveToFile zipFile, 2
.Close
End With

Application.StatusBar = "Estrazione ZIP..."
extractPath = Environ("TEMP") & "\LottoExtract"
On Error Resume Next
Kill extractPath & "\*.*"
RmDir extractPath
On Error GoTo ErrorHandler
MkDir extractPath

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run """" & zipPath & """ e """ & zipFile & """ -o""" & extractPath & """ -y", 0, True

extractedFile = Dir(extractPath & "\*.txt")
If extractedFile = "" Then
MsgBox "File txt non trovato dopo l'estrazione."
GoTo Cleanup
End If
FileCopy extractPath & "\" & extractedFile, txtFile

Application.StatusBar = "Lettura file..."
Set fso = CreateObject("Scripting.FileSystemObject")
With fso.OpenTextFile(txtFile)
fileContent = .ReadAll
.Close
End With

fileContent = Replace(fileContent, vbCrLf, vbLf)
arrLines = Split(fileContent, vbLf)

Application.StatusBar = "Analisi dati..."
Dim firstNewLine As Long
firstNewLine = -1
For i = UBound(arrLines) To 0 Step -1
riga = Trim(arrLines(i))
If Len(riga) > 10 Then
On Error Resume Next
dataEstrazione = DateSerial(CLng(Left(riga, 4)), CLng(Mid(riga, 6, 2)), CLng(Right(Left(riga, 10), 2)))
If Err.Number = 0 Then
If dataEstrazione <= ultimaDataArchivio Then
firstNewLine = i + 1
Exit For
End If
Else
Err.Clear
End If
On Error GoTo ErrorHandler
End If
Next i
If firstNewLine = -1 Then firstNewLine = 0

Dim totalNewDates As Long
totalNewDates = 0
Dim prevDateStr As String
prevDateStr = ""
For i = firstNewLine To UBound(arrLines)
riga = Trim(arrLines(i))
If Len(riga) > 10 Then
On Error Resume Next
dataEstrazione = DateSerial(CLng(Left(riga, 4)), CLng(Mid(riga, 6, 2)), CLng(Right(Left(riga, 10), 2)))
If Err.Number = 0 Then
Dim ds2 As String
ds2 = Format(dataEstrazione, "dd/mm/yyyy")
If ds2 <> prevDateStr Then
totalNewDates = totalNewDates + 1
prevDateStr = ds2
End If
Else
Err.Clear
End If
On Error GoTo ErrorHandler
End If
Next i

If totalNewDates = 0 Then
MsgBox "Nessuna nuova estrazione da aggiungere."
GoTo Cleanup
End If

Dim TOTAL_COLS As Long
TOTAL_COLS = 58
Dim dataArr() As Variant
ReDim dataArr(1 To totalNewDates, 1 To TOTAL_COLS)

Dim r As Long, c As Long
For r = 1 To totalNewDates
For c = 4 To TOTAL_COLS
dataArr(r, c) = 0
Next c
Next r

Application.StatusBar = "Elaborazione dati in memoria..."
newRowCount = 0
Dim currentDateStr As String
currentDateStr = ""
Dim baseCol As Long

For i = firstNewLine To UBound(arrLines)
riga = Trim(arrLines(i))
If Len(riga) > 10 Then
On Error Resume Next
dataEstrazione = DateSerial(CLng(Left(riga, 4)), CLng(Mid(riga, 6, 2)), CLng(Right(Left(riga, 10), 2)))
If Err.Number <> 0 Then Err.Clear: GoTo NextLine2
On Error GoTo ErrorHandler

Dim dataStr As String
dataStr = Format(dataEstrazione, "dd/mm/yyyy")

If currentDateStr <> dataStr Then
newRowCount = newRowCount + 1
currentDateStr = dataStr
dataArr(newRowCount, 1) = lastValue + newRowCount
dataArr(newRowCount, 3) = dataEstrazione
End If

parts = Split(Mid(riga, 12), vbTab)
If UBound(parts) >= 5 Then
Ruota = Trim(parts(0))
baseCol = RuotaToCol(Ruota)
If baseCol > 0 Then
For j = 0 To 4
dataArr(newRowCount, baseCol + j) = CLng(Trim(parts(j + 1)))
Next j
End If
End If
End If
NextLine2:
Next i

Application.StatusBar = "Scrittura su foglio..."
Dim destRow As Long
destRow = lastRowArchivio + 1

' Scrittura array in un colpo solo — nessun loop sul foglio
wsArchivio.Cells(destRow, 1).Resize(newRowCount, TOTAL_COLS).Value = dataArr
Call ApplicaFormattazioneTabella(wsArchivio, 9, 1, 58)

' Aggiorna automaticamente DataFineAnalisi con l'ultima data in archivio
ultimaData = wsArchivio.Cells(destRow + newRowCount - 1, 3).Value
ThisWorkbook.Names("DataFineAnalisi").RefersTo = "=""" & Format(ultimaData, "yyyy-mm-dd") & """"

' ?? AGGIORNA AUTOMATICAMENTE ARCHIVIO FILTRATO
Call AggiornaArchivioFiltrato

' ?? FORMATTA AUTOMATICAMENTE ARCHIVIO FILTRATO
Dim wsF As Worksheet
Set wsF = ThisWorkbook.Sheets("ArchivioFiltrato")
Call ApplicaFormattazioneTabella(wsF, 1, 1, 58)

' Formato data su tutta la colonna C in un unico Range
wsArchivio.Range( _
wsArchivio.Cells(destRow, 3), _
wsArchivio.Cells(destRow + newRowCount - 1, 3) _
).NumberFormat = "dd/mm/yyyy"



Cleanup:
Application.StatusBar = "Pulizia file temporanei..."
On Error Resume Next
If Dir(zipFile) <> "" Then Kill zipFile
If Dir(txtFile) <> "" Then Kill txtFile
If Dir(extractPath & "\*.*") <> "" Then Kill extractPath & "\*.*"
RmDir extractPath
On Error GoTo 0

' Ripristina Application solo se chiamata standalone
If Not bCalledFromRicrea Then
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.CalculateBeforeSave = True
.CutCopyMode = False
.DisplayAlerts = True
.StatusBar = False
End With
If newRowCount > 0 Then
MsgBox "Aggiornamento completato. Aggiunte " & newRowCount & " nuove estrazioni."
Else
MsgBox "Nessuna nuova estrazione da aggiungere."
End If
End If

Exit Sub

ErrorHandler:
MsgBox "Errore: " & Err.Description & vbCrLf & "N. " & Err.Number
Resume Cleanup

Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic


End Sub

Sub RicreaArchivio()
Dim risposta As Integer
risposta = MsgBox("Sei sicuro di voler cancellare tutto l'archivio e ricrearlo da zero?" & vbCrLf & "L'operazione potrebbe richiedere diversi minuti.", vbYesNo + vbExclamation, "Conferma")
If risposta = vbNo Then Exit Sub

Dim wsArchivio As Worksheet
Set wsArchivio = ThisWorkbook.Sheets("Archivio")

' Blocca tutto una volta sola qui, non verrà ripristinato da AggiornaArchivio
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
.CalculateBeforeSave = False
.DisplayAlerts = False
.DisplayStatusBar = True
End With

Application.StatusBar = "Cancellazione archivio..."
Dim lastRow As Long
lastRow = wsArchivio.Cells(Rows.count, "C").End(xlUp).row
If lastRow >= 9 Then
wsArchivio.Range("A9:BF" & lastRow).ClearContents
End If

' Segnala ad AggiornaArchivio di non toccare Application
bCalledFromRicrea = True
AggiornaArchivio
bCalledFromRicrea = False

' Ripristina tutto solo ora, dopo che 7000 righe sono già scritte
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.CalculateBeforeSave = True
.CutCopyMode = False
.DisplayAlerts = True
.StatusBar = False
End With

MsgBox "Ricostruzione archivio completata.", vbInformation, "Fatto"
End Sub

è quella attuale diversa da quella che c'era.

Macro crea storico TXT, l'ho provata funziona con spaziometria, ma non se non c'è nessuna estrazione, peccato, quando avrò voglia vedrò cosa posso fare.
Option Explicit

Sub CreaStoricoTXT()

Dim sh As Worksheet
Dim lastRow As Long, r As Long
Dim f As Integer
Dim pathTXT As String
Dim DataEstr As String
Dim Anno As String, Mese As String, giorno As String
Dim Ruota As Long, c As Long
Dim colMap(1 To 11) As Long
Dim sigla(1 To 11) As String
Dim line As String

Set sh = ThisWorkbook.Worksheets("Archivio")

' Mappa colonne ruote
colMap(1) = 4 ' BA
colMap(2) = 9 ' CA
colMap(3) = 14 ' FI
colMap(4) = 19 ' GE
colMap(5) = 24 ' MI
colMap(6) = 29 ' NA
colMap(7) = 34 ' PA
colMap(8) = 39 ' RM (Roma)
colMap(9) = 44 ' TO
colMap(10) = 49 ' VE
colMap(11) = 54 ' RN (Nazionale)

' Sigle nel formato richiesto da Ramco
sigla(1) = "BA"
sigla(2) = "CA"
sigla(3) = "FI"
sigla(4) = "GE"
sigla(5) = "MI"
sigla(6) = "NA"
sigla(7) = "PA"
sigla(8) = "RM"
sigla(9) = "TO"
sigla(10) = "VE"
sigla(11) = "RN"

lastRow = sh.Cells(sh.Rows.count, "C").End(xlUp).row

' Percorso file TXT nella cartella TEMP
pathTXT = Environ$("TEMP") & "\storico.txt"

f = FreeFile
Open pathTXT For Output As #f

' Loop su tutte le estrazioni
For r = 9 To lastRow

DataEstr = sh.Cells(r, "C").Value
If IsDate(DataEstr) Then

giorno = Format(Day(DataEstr), "00")
Mese = Format(Month(DataEstr), "00")
Anno = Format(Year(DataEstr), "0000")

' Formato richiesto: AAAA/MM/GG
Dim dataTXT As String
dataTXT = Anno & "/" & Mese & "/" & giorno

' 11 righe per ogni estrazione
For Ruota = 1 To 11
line = dataTXT & vbTab & sigla(Ruota)

For c = 0 To 4
line = line & vbTab & Format(sh.Cells(r, colMap(Ruota) + c).Value, "00")
Next

Print #f, line
Next

End If

Next r

Close #f

MsgBox "File storico.txt generato correttamente in: " & vbCrLf & pathTXT, vbInformation

End Sub


Evidenziazione e deevidenziazione:
Option Explicit

Public MostraInfo As Boolean

Const FIRST_ROW As Long = 9

Function GetColor(index As Long) As Long
Select Case index
Case 1: GetColor = RGB(255, 255, 0)
Case 2: GetColor = RGB(255, 200, 0)
Case 3: GetColor = RGB(255, 80, 80)
Case 4: GetColor = RGB(150, 255, 150)
Case 5: GetColor = RGB(0, 180, 0)
Case 6: GetColor = RGB(150, 200, 255)
Case 7: GetColor = RGB(0, 120, 255)
Case 8: GetColor = RGB(180, 120, 255)
Case 9: GetColor = RGB(255, 150, 200)
Case 10: GetColor = RGB(220, 220, 220)
Case 11: GetColor = RGB(150, 150, 150)
Case 12: GetColor = RGB(180, 120, 60)
Case 13: GetColor = RGB(120, 255, 220)
Case 14: GetColor = RGB(255, 215, 0)
Case 15: GetColor = RGB(180, 230, 255)
End Select
End Function

' ============================
' MACRO MASTER
' ============================
Sub EvidenziazioneMaster()
If MostraInfo = False Then
Dim risposta As VbMsgBoxResult
risposta = MsgBox( _
"MACRO DI EVIDENZIAZIONE - GUIDA RAPIDA" & vbCrLf & vbCrLf & _
"A - Evidenzia numeri personali" & vbCrLf & _
"B - Evidenzia numeri uguali nelle ultime 18 estrazioni" & vbCrLf & _
"C - Numeri ricorrenti non combinati nelle ultime 14 estrazioni" & vbCrLf & vbCrLf & _
"Vuoi continuare a mostrare questo messaggio?", _
vbYesNoCancel + vbInformation, "Informazioni sulla macro")
If risposta = vbNo Then
MostraInfo = True
ElseIf risposta = vbCancel Then
Exit Sub
End If
End If

Dim scelta As String
scelta = UCase(InputBox( _
"A = numeri personali" & vbCrLf & _
"B = numeri uguali" & vbCrLf & _
"C = numeri ricorrenti non combinati", "Seleziona modalita"))

If scelta = "A" Then
Call EvidenziaNumeriDaData
ElseIf scelta = "B" Then
Call VerificaNumeriUgualiIntegrata
ElseIf scelta = "C" Then
Call VerificaNumeriRicorrentiNonCombinati
Else
MsgBox "Scelta non valida."
End If
End Sub

' ============================
' A) EVIDENZIA NUMERI PERSONALI
' ============================
Sub EvidenziaNumeriDaData()
Dim ws As Worksheet
Dim nums(1 To 15) As Variant
Dim InputStr As String, parts As Variant
Dim startDate As Date
Dim r As Long, i As Long
Dim lastRow As Long
Dim foundRow As Long
Dim Ruote() As String
Dim colonneRuote As Variant
Dim k As Integer

Set ws = ThisWorkbook.Sheets("Archivio")
Ruote = Split("Bari,Cagliari,Firenze,Genova,Milano,Napoli,Palermo,Roma,Torino,Venezia,Nazionale", ",")
colonneRuote = Array("D:H", "I:M", "N:R", "S:W", "X:AB", "AC:AG", "AH:AL", "AM:AQ", "AR:AV", "AW:BA", "BB:BF")
lastRow = ws.Cells(ws.Rows.count, "A").End(xlUp).row

InputStr = InputBox("Inserisci fino a 15 numeri separati da virgola", "Evidenzia numeri")
If Trim(InputStr) = "" Then Exit Sub

parts = Split(InputStr, ",")
If UBound(parts) > 14 Then
MsgBox "Puoi inserire massimo 15 numeri", vbExclamation
Exit Sub
End If

For i = 0 To UBound(parts)
nums(i + 1) = val(Trim(parts(i)))
Next i

On Error Resume Next
startDate = CDate(InputBox("Inserisci la data di inizio (es. 02/01/2024)", "Data inizio"))
On Error GoTo 0
If startDate = 0 Then Exit Sub

foundRow = 0
For r = FIRST_ROW To lastRow
If ws.Cells(r, "C").Value >= startDate Then
foundRow = r
Exit For
End If
Next r

If foundRow = 0 Then
MsgBox "Nessuna data uguale o successiva trovata.", vbExclamation
Exit Sub
End If

Call DeEvidenzia

Application.ScreenUpdating = False

For k = LBound(Ruote) To UBound(Ruote)
Dim rng As Range
Set rng = ws.Range( _
ws.Cells(foundRow, ws.Range(colonneRuote(k)).Column), _
ws.Cells(lastRow, ws.Range(colonneRuote(k)).Columns( _
ws.Range(colonneRuote(k)).Columns.count).Column))

For i = 1 To UBound(parts) + 1
If nums(i) <> 0 Then
On Error Resume Next
With rng.FormatConditions.Add( _
Type:=xlCellValue, _
Operator:=xlEqual, _
Formula1:="=" & nums(i))
.Interior.Color = GetColor(i)
End With
On Error GoTo 0
End If
Next i
Next k

Application.ScreenUpdating = True
MsgBox "Evidenziazione completata."
End Sub

' ============================
' B) VERIFICA NUMERI UGUALI
' ============================
Sub VerificaNumeriUgualiIntegrata()
Dim ws As Worksheet
Dim ultimaEstrazione As Range
Dim estrazioni As Range
Dim numeriUguali As Collection
Dim Numero As Variant
Dim i As Integer, j As Integer, k As Integer
Dim Ruote() As String
Dim colonneRuote As Variant
Dim UltimaRiga As Long
Dim cella As Range
Dim trovato As Boolean
Dim colorIndex As Long

Set ws = ThisWorkbook.Sheets("Archivio")
Ruote = Split("Bari,Cagliari,Firenze,Genova,Milano,Napoli,Palermo,Roma,Torino,Venezia,Nazionale", ",")
colonneRuote = Array("D:H", "I:M", "N:R", "S:W", "X:AB", "AC:AG", "AH:AL", "AM:AQ", "AR:AV", "AW:BA", "BB:BF")
UltimaRiga = ws.Cells(ws.Rows.count, "A").End(xlUp).row

Call DeEvidenzia

Application.ScreenUpdating = False

For k = LBound(Ruote) To UBound(Ruote)

Set numeriUguali = New Collection

Set ultimaEstrazione = ws.Range( _
ws.Cells(UltimaRiga, ws.Range(colonneRuote(k)).Column), _
ws.Cells(UltimaRiga, ws.Range(colonneRuote(k)).Columns( _
ws.Range(colonneRuote(k)).Columns.count).Column))

Set estrazioni = ws.Range( _
ws.Cells(UltimaRiga - 18, ws.Range(colonneRuote(k)).Column), _
ws.Cells(UltimaRiga - 1, ws.Range(colonneRuote(k)).Columns( _
ws.Range(colonneRuote(k)).Columns.count).Column))

For Each cella In ultimaEstrazione
Numero = cella.Value
If IsNumeric(Numero) And val(Numero) <> 0 Then
colorIndex = ((val(Numero) - 1) Mod 15) + 1
trovato = False

For i = 1 To estrazioni.Rows.count
For j = 1 To estrazioni.Columns.count
If estrazioni.Cells(i, j).Value = Numero Then
trovato = True
On Error Resume Next
With estrazioni.Cells(i, j).FormatConditions.Add( _
Type:=xlCellValue, _
Operator:=xlEqual, _
Formula1:="=" & Numero)
.Interior.Color = GetColor(colorIndex)
End With
On Error GoTo 0
End If
Next j
Next i

If trovato Then
On Error Resume Next
numeriUguali.Add Numero, CStr(Numero)
With cella.FormatConditions.Add( _
Type:=xlCellValue, _
Operator:=xlEqual, _
Formula1:="=" & Numero)
.Interior.Color = GetColor(colorIndex)
End With
On Error GoTo 0
End If
End If
Next cella

Next k

Application.ScreenUpdating = True
MsgBox "Evidenziazione completata."
End Sub

Sub VerificaNumeriRicorrentiNonCombinati()
Dim ws As Worksheet
Dim Ruote() As String
Dim colonneRuote As Variant
Dim UltimaRiga As Long
Dim k As Integer
Dim i As Integer, j As Integer
Dim estrazioni As Range
Dim colorIndex As Long
Dim num As Variant
Dim chiave As Variant

Set ws = ThisWorkbook.Sheets("Archivio")
Ruote = Split("Bari,Cagliari,Firenze,Genova,Milano,Napoli,Palermo,Roma,Torino,Venezia,Nazionale", ",")
colonneRuote = Array("D:H", "I:M", "N:R", "S:W", "X:AB", "AC:AG", "AH:AL", "AM:AQ", "AR:AV", "AW:BA", "BB:BF")
UltimaRiga = ws.Cells(ws.Rows.count, "A").End(xlUp).row

' --- Chiedi numero estrazioni ---
Dim inputN As String
inputN = InputBox("Quante estrazioni vuoi analizzare?", "Numero estrazioni", "6")
If Trim(inputN) = "" Then Exit Sub
Dim nEstrazioni As Integer
nEstrazioni = CInt(inputN)
If nEstrazioni < 2 Then
MsgBox "Inserisci almeno 2 estrazioni.", vbExclamation
Exit Sub
End If

Call DeEvidenzia

Application.ScreenUpdating = False

For k = LBound(Ruote) To UBound(Ruote)

Set estrazioni = ws.Range( _
ws.Cells(UltimaRiga - nEstrazioni + 1, ws.Range(colonneRuote(k)).Column), _
ws.Cells(UltimaRiga, ws.Range(colonneRuote(k)).Columns( _
ws.Range(colonneRuote(k)).Columns.count).Column))

' --- STEP 1: Conta occorrenze ---
Dim conteggio As Object
Set conteggio = CreateObject("Scripting.Dictionary")

For i = 1 To estrazioni.Rows.count
For j = 1 To estrazioni.Columns.count
num = estrazioni.Cells(i, j).Value
If IsNumeric(num) And num <> 0 Then
If conteggio.Exists(num) Then
conteggio(num) = conteggio(num) + 1
Else
conteggio.Add num, 1
End If
End If
Next j
Next i

' --- STEP 2: Evidenzia numeri usciti 2 o piu' volte ---
For Each chiave In conteggio.Keys
If conteggio(chiave) >= 2 Then
colorIndex = ((CLng(chiave) - 1) Mod 15) + 1
On Error Resume Next
With estrazioni.FormatConditions.Add( _
Type:=xlCellValue, _
Operator:=xlEqual, _
Formula1:="=" & chiave)
.Interior.Color = GetColor(colorIndex)
End With
On Error GoTo 0
End If
Next chiave

Next k

Application.ScreenUpdating = True

MsgBox "Evidenziazione C completata. Analizzate " & nEstrazioni & " estrazioni."
End Sub


' ============================
' RIMUOVI FORMATTAZIONE CONDIZIONALE
' ============================
Sub DeEvidenzia()
Dim ws As Worksheet
Dim Ruote() As String
Dim colonneRuote As Variant
Dim UltimaRiga As Long
Dim k As Integer
Dim estrazioni As Range

Set ws = ThisWorkbook.Sheets("Archivio")
Ruote = Split("Bari,Cagliari,Firenze,Genova,Milano,Napoli,Palermo,Roma,Torino,Venezia,Nazionale", ",")
colonneRuote = Array("D:H", "I:M", "N:R", "S:W", "X:AB", "AC:AG", "AH:AL", "AM:AQ", "AR:AV", "AW:BA", "BB:BF")
UltimaRiga = ws.Cells(ws.Rows.count, "A").End(xlUp).row

Application.ScreenUpdating = False

For k = LBound(Ruote) To UBound(Ruote)
Set estrazioni = ws.Range( _
ws.Cells(FIRST_ROW, ws.Range(colonneRuote(k)).Column), _
ws.Cells(UltimaRiga, ws.Range(colonneRuote(k)).Columns( _
ws.Range(colonneRuote(k)).Columns.count).Column))
estrazioni.FormatConditions.Delete
Next k

Application.ScreenUpdating = True
End Sub

Macro cambiare data:

Public Sub AvvioArchivio()

Dim d As Variant
Dim dataInserita As Date
Dim dataFineInserita As Date
Dim dataValida As Date
Dim dataFineValida As Date
Dim wsF As Worksheet

' =========================
' DATA INIZIO
' =========================

Do
d = InputBox("Da quale data vuoi iniziare l'analisi dell'archivio?", _
"Data inizio")

If d = "" Then

' Nessuna data inserita ? usa la prima disponibile
dataInserita = TrovaDataValida(#1/1/1900#)
Exit Do

ElseIf IsDate(d) Then

dataInserita = DateValue(CDate(d))
Exit Do

Else

MsgBox "Formato data non valido. Riprova.", vbCritical

End If

Loop

dataValida = TrovaDataValida(dataInserita)

' =========================
' DATA FINE
' =========================

Do
d = InputBox("Fino a quale data vuoi analizzare l'archivio?" & vbCrLf & _
"(Lascia vuoto per usare l'ultima estrazione disponibile)", _
"Data fine")

If d = "" Then

dataFineInserita = TrovaUltimaDataArchivio()
Exit Do

ElseIf IsDate(d) Then

dataFineInserita = CDate(d)
Exit Do

Else

MsgBox "Formato data non valido. Riprova.", vbCritical

End If

Loop

dataFineValida = TrovaDataValidaFine(dataFineInserita)

' Controllo coerenza
If dataFineValida < dataValida Then
MsgBox "La data finale non può essere precedente alla data iniziale.", vbCritical
Exit Sub
End If

' =========================
' SALVA NOMI DEFINITI
' =========================

On Error Resume Next
ThisWorkbook.Names("DataInizioAnalisi").Delete
ThisWorkbook.Names("DataFineAnalisi").Delete
On Error GoTo 0

ThisWorkbook.Names.Add _
Name:="DataInizioAnalisi", _
RefersTo:="=""" & Format(dataValida, "yyyy-mm-dd") & """"

ThisWorkbook.Names.Add _
Name:="DataFineAnalisi", _
RefersTo:="=""" & Format(dataFineValida, "yyyy-mm-dd") & """"

' =========================
' MESSAGGI
' =========================

If dataValida <> dataInserita Then

MsgBox "La data iniziale inserita non era presente nell'archivio." & vbCrLf & _
"Verrà utilizzata la prima data successiva disponibile: " & _
Format(dataValida, "dd/mm/yyyy"), vbInformation

End If

If dataFineValida <> dataFineInserita Then

MsgBox "La data finale inserita non era presente nell'archivio." & vbCrLf & _
"Verrà utilizzata la prima data precedente disponibile: " & _
Format(dataFineValida, "dd/mm/yyyy"), vbInformation

End If

' =========================
' AGGIORNA ARCHIVIO
' =========================

Call AggiornaArchivioFiltrato

Set wsF = ThisWorkbook.Sheets("ArchivioFiltrato")

Call ApplicaFormattazioneTabella(wsF, 1, 1, 58)

End Sub

Function TrovaUltimaDataArchivio() As Date

Dim ws As Worksheet
Dim lastRow As Long

Set ws = Sheets("Archivio")

lastRow = ws.Cells(ws.Rows.count, "C").End(xlUp).row

TrovaUltimaDataArchivio = ws.Cells(lastRow, 3).Value

End Function

Function TrovaDataValidaFine(dataRichiesta As Date) As Date

Dim ws As Worksheet
Dim lastRow As Long
Dim r As Long

Set ws = Sheets("Archivio")

lastRow = ws.Cells(ws.Rows.count, "C").End(xlUp).row

For r = lastRow To 9 Step -1

If IsDate(ws.Cells(r, 3).Value) Then

If ws.Cells(r, 3).Value <= dataRichiesta Then

TrovaDataValidaFine = ws.Cells(r, 3).Value
Exit Function

End If

End If

Next r

TrovaDataValidaFine = ws.Cells(9, 3).Value

End Function
 
bello. ho dovuto adattare il mio file archivio che ho visto è privo della ruota Nazionale dopo il 26/05/2026

Effettivamente per la Nazionale c'è un errore di logica che non ho corretto.

Perché questa ruota è diversa dalle altre ed il suo estratto non è "a tutte" come invece è per le altre 10 Ruote.

Ma lo script voleva essere "una prova" e reputo il risultato dell'interazione ottimo anche perché esso

andrebbe limitato alle 10 ruote, senza sbattersi, per correggere un errore che continuerebbe ad essere un errore.

Come sai, per contro, spesso è difficile ottenere risultati decenti, dunque ho ritenuto utile descrivere le potenzialità,

sia della IA che della velocità nel fornire una soluzione che della rapidità nell'eseguirla.

:)
 

Ultima estrazione Lotto

  • Estrazione del lotto
    mercoledì 03 giugno 2026
    Bari
    06
    49
    53
    65
    25
    Cagliari
    23
    71
    63
    50
    27
    Firenze
    79
    07
    61
    08
    65
    Genova
    05
    48
    79
    23
    16
    Milano
    15
    40
    78
    47
    58
    Napoli
    37
    81
    07
    34
    78
    Palermo
    36
    65
    39
    69
    05
    Roma
    04
    23
    53
    82
    05
    Torino
    24
    40
    52
    35
    81
    Venezia
    53
    85
    38
    74
    67
    Nazionale
    57
    31
    74
    75
    30
    Estrazione Simbolotto
    Napoli
    39
    40
    23
    08
    27
Indietro
Alto