Ho provato a far trasformare la macro in uno Script alla AI. Questo è il risultato, che non funziona, per ora:
Option Explicit
Sub Main
Dim nAmbi, i, s, p
Dim sTitoloAmbi, sRuote, sFiltro
Dim filtroAnni, nRuoteScelte
Dim ruoteSelezionate(12)
Dim ambi(5, 2)
Dim inputOk, pRuote, idxR, x
Dim nEstrTot, idIni, idFin, nEstrAnalizzate
Dim dataLimite, kk, dEstr
Dim aTitoli(34), col
'========================
' INPUT NUMERO AMBI
'========================
nAmbi = Val(InputBox("Quanti ambi vuoi analizzare? (2-5)", "Gruppo Ambi", "2"))
If nAmbi < 2 Or nAmbi > 5 Then
Call Scrivi("Numero ambi non valido. Inserire un valore tra 2 e 5.", True)
Exit Sub
End If
'========================
' INPUT AMBI con validazione
'========================
For i = 1 To nAmbi
inputOk = False
Do While Not inputOk
s = InputBox("Ambo " & i & " (es: 8,77 — numeri tra 1 e 90, diversi tra loro)", "Inserimento ambo " & i)
If s = "" Then Exit Sub
s = Replace(s, ".", ",")
s = Replace(s, " ", "")
p = Split(s, ",")
If UBound(p) <> 1 Then
MsgBox "Formato non valido. Inserisci due numeri separati da virgola."
ElseIf Not IsNumeric(p(0)) Or Not IsNumeric(p(1)) Then
MsgBox "Inserisci solo numeri."
ElseIf CInt(p(0)) < 1 Or CInt(p(0)) > 90 Or CInt(p(1)) < 1 Or CInt(p(1)) > 90 Then
MsgBox "I numeri devono essere compresi tra 1 e 90."
ElseIf CInt(p(0)) = CInt(p(1)) Then
MsgBox "I due numeri dell'ambo devono essere diversi."
Else
ambi(i, 1) = CInt(p(0))
ambi(i, 2) = CInt(p(1))
inputOk = True
End If
Loop
Next i
'========================
' FILTRO PERIODO
'========================
sFiltro = InputBox("Analizza solo gli ultimi N anni (es: 5)." & vbCrLf & _
"Lascia vuoto o 0 per tutto l'archivio.", "Filtro periodo", "0")
filtroAnni = Val(sFiltro)
'========================
' SELEZIONE RUOTE
'========================
sRuote = InputBox("Ruote da analizzare (es: 1,3,5 oppure TUTTE):" & vbCrLf & vbCrLf & _
"1=Bari 2=Cagliari 3=Firenze 4=Genova 5=Milano" & vbCrLf & _
"6=Napoli 7=Palermo 8=Roma 9=Torino 10=Venezia 11=Nazionale", _
"Selezione Ruote", "TUTTE")
If sRuote = "" Then Exit Sub
nRuoteScelte = 0
Dim rr
If UCase(Trim(sRuote)) = "TUTTE" Then
For rr = 1 To 11
ruoteSelezionate(rr) = True
Next rr
nRuoteScelte = 11
Else
pRuote = Split(sRuote, ",")
For x = 0 To UBound(pRuote)
idxR = CInt(Trim(pRuote(x)))
If idxR >= 1 And idxR <= 11 Then
ruoteSelezionate(idxR) = True
nRuoteScelte = nRuoteScelte + 1
End If
Next x
End If
If nRuoteScelte = 0 Then
Call Scrivi("Nessuna ruota valida selezionata.", True)
Exit Sub
End If
'========================
' LIMITI ARCHIVIO
'========================
nEstrTot = EstrazioniArchivio
idFin = nEstrTot
idIni = 1
If filtroAnni > 0 Then
dataLimite = DateAdd("yyyy", -filtroAnni, Now())
For kk = 1 To nEstrTot
dEstr = CDate(DataEstrazione(kk, , , "/"))
If dEstr >= dataLimite Then
idIni = kk
Exit For
End If
Next kk
End If
nEstrAnalizzate = idFin - idIni + 1
'========================
' INTESTAZIONE
'========================
sTitoloAmbi = ""
For i = 1 To nAmbi
If i > 1 Then sTitoloAmbi = sTitoloAmbi & " - "
sTitoloAmbi = sTitoloAmbi & Format2(ambi(i, 1)) & "." & Format2(ambi(i, 2))
Next i
Call Scrivi("STATISTICA GRUPPO AMBI", True, , , vbBlue)
Call Scrivi("Ambi: " & sTitoloAmbi, True)
If filtroAnni > 0 Then
Call Scrivi("Periodo: ultimi " & filtroAnni & " anni (" & nEstrAnalizzate & " estrazioni)", True)
Else
Call Scrivi("Periodo: archivio completo (" & nEstrAnalizzate & " estrazioni)", True)
End If
Call Scrivi()
'========================
' INTESTAZIONI TABELLA
'========================
aTitoli(1) = "Ruota"
aTitoli(2) = "Rit.Att."
aTitoli(3) = "Rit.Max"
aTitoli(4) = "Rit.Medio"
aTitoli(5) = "% su Max"
aTitoli(6) = "Freq"
aTitoli(7) = "IC Norm."
aTitoli(8) = "Ultima Uscita"
aTitoli(9) = "Estratti"
col = 10
For i = 1 To nAmbi
aTitoli(col) = Format2(ambi(i,1)) & "." & Format2(ambi(i,2)) & " Rit.Att."
aTitoli(col + 1) = Format2(ambi(i,1)) & "." & Format2(ambi(i,2)) & " Rit.Max"
aTitoli(col + 2) = Format2(ambi(i,1)) & "." & Format2(ambi(i,2)) & " Freq"
aTitoli(col + 3) = Format2(ambi(i,1)) & "." & Format2(ambi(i,2)) & " Rit.Est."
aTitoli(col + 4) = Format2(ambi(i,1)) & "." & Format2(ambi(i,2)) & " Max.Est."
col = col + 5
Next i
Call InitTabella(aTitoli, vbBlue, , , vbWhite)
'========================
' LOOP RUOTE + TUTTE
'========================
Dim Ru
Dim aEstratti
Dim rit, ritMax, freq, ritMedio, ic, percentMax
Dim dataU, estratti, ritCorr, trovatoPrimo
Dim ritA(5), ritMaxA(5), freqA(5), ritEstA(5), ritEstMaxA(5)
Dim ritCorrA(5), ritCorrEstA(5), trovatoPrimoA(5), trovatoPrimoEstA(5)
Dim id, trovato, rStart, rEnd, rr2, gruppoUscito, a
Dim t1, t2, jj, j
Dim nCols, aValori, aColori, c, nomeRuota
For Ru = 1 To 12
If Ru <= 11 Then
If Not ruoteSelezionate(Ru) Then GoTo SkipRuota
End If
Call Messaggio(IIf(Ru <= 11, NomeRuota(Ru), "Tutte le ruote selezionate"))
rit = 0 : ritMax = 0 : freq = 0
ritMedio = 0 : ic = 0 : percentMax = 0
dataU = "--" : estratti = ""
ritCorr = 0 : trovatoPrimo = False
For a = 1 To nAmbi
ritA(a) = 0 : ritMaxA(a) = 0 : freqA(a) = 0
ritEstA(a) = 0 : ritEstMaxA(a) = 0
ritCorrA(a) = 0 : ritCorrEstA(a) = 0
trovatoPrimoA(a) = False : trovatoPrimoEstA(a) = False
Next a
'========================
' LOOP ESTRAZIONI
'========================
For id = idFin To idIni Step -1
trovato = False
If Ru <= 11 Then
rStart = Ru : rEnd = Ru
Else
rStart = 1 : rEnd = 11
End If
For rr2 = rStart To rEnd
If Ru = 12 Then
If Not ruoteSelezionate(rr2) Then GoTo NextRuota2
End If
Call GetArrayNumeriRuota(id, rr2, aEstratti)
If aEstratti(1) = 0 Then GoTo NextRuota2
gruppoUscito = False
For a = 1 To nAmbi
If AmboUscito(aEstratti, ambi(a, 1), ambi(a, 2)) Then
gruppoUscito = True
Exit For
End If
Next a
If gruppoUscito Then
trovato = True
If Not trovatoPrimo Then
rit = ritCorr
trovatoPrimo = True
dataU = DataEstrazione(id, , , "/")
estratti = ""
For j = 1 To 5
estratti = estratti & Format2(aEstratti(j)) & " "
Next j
If Ru = 12 Then estratti = NomeRuota(rr2) & ": " & estratti
End If
If ritCorr > ritMax Then ritMax = ritCorr
ritCorr = 0
Exit For
End If
NextRuota2:
Next rr2
If trovato Then
freq = freq + 1
Else
ritCorr = ritCorr + 1
End If
'========================
' SINGOLI AMBI (solo ruota singola)
'========================
If Ru <= 11 Then
Call GetArrayNumeriRuota(id, Ru, aEstratti)
For a = 1 To nAmbi
t1 = False : t2 = False
For jj = 1 To 5
If aEstratti(jj) = ambi(a, 1) Then t1 = True
If aEstratti(jj) = ambi(a, 2) Then t2 = True
Next jj
If t1 And t2 Then
freqA(a) = freqA(a) + 1
If Not trovatoPrimoA(a) Then
ritA(a) = ritCorrA(a)
trovatoPrimoA(a) = True
End If
If ritCorrA(a) > ritMaxA(a) Then ritMaxA(a) = ritCorrA(a)
ritCorrA(a) = 0
Else
ritCorrA(a) = ritCorrA(a) + 1
End If
If t1 Or t2 Then
If Not trovatoPrimoEstA(a) Then
ritEstA(a) = ritCorrEstA(a)
trovatoPrimoEstA(a) = True
End If
If ritCorrEstA(a) > ritEstMaxA(a) Then ritEstMaxA(a) = ritCorrEstA(a)
ritCorrEstA(a) = 0
Else
ritCorrEstA(a) = ritCorrEstA(a) + 1
End If
Next a
End If
Call AvanzamentoElab(idIni, idFin, idFin - id)
If ScriptInterrotto Then Exit For
Next id
'========================
' SINGOLI AMBI su "Tutte"
'========================
If Ru = 12 Then
Dim rr3, id2, aE2
Dim rA, rmA, fA, reA, remA
Dim rcA, rceA, tpA, tpeA
Dim ritMinTutte, ritEstMinTutte
Dim u1, u2, jj2
For a = 1 To nAmbi
ritMinTutte = -1 : ritEstMinTutte = -1
ritMaxA(a) = 0 : ritEstMaxA(a) = 0 : freqA(a) = 0
For rr3 = 1 To 11
If Not ruoteSelezionate(rr3) Then GoTo NextRuotaT
rA = 0 : rmA = 0 : fA = 0
reA = 0 : remA = 0
rcA = 0 : rceA = 0
tpA = False : tpeA = False
For id2 = idFin To idIni Step -1
Call GetArrayNumeriRuota(id2, rr3, aE2)
If aE2(1) = 0 Then GoTo NextEstr2
u1 = False : u2 = False
For jj2 = 1 To 5
If aE2(jj2) = ambi(a, 1) Then u1 = True
If aE2(jj2) = ambi(a, 2) Then u2 = True
Next jj2
If u1 And u2 Then
fA = fA + 1
If Not tpA Then
rA = rcA
tpA = True
End If
If rcA > rmA Then rmA = rcA
rcA = 0
Else
rcA = rcA + 1
End If
If u1 Or u2 Then
If Not tpeA Then
reA = rceA
tpeA = True
End If
If rceA > remA Then remA = rceA
rceA = 0
Else
rceA = rceA + 1
End If
NextEstr2:
Next id2
freqA(a) = freqA(a) + fA
If ritMinTutte = -1 Or rA < ritMinTutte Then ritMinTutte = rA
If rmA > ritMaxA(a) Then ritMaxA(a) = rmA
If ritEstMinTutte = -1 Or reA < ritEstMinTutte Then ritEstMinTutte = reA
If remA > ritEstMaxA(a) Then ritEstMaxA(a) = remA
NextRuotaT:
Next rr3
ritA(a) = IIf(ritMinTutte < 0, 0, ritMinTutte)
ritEstA(a) = IIf(ritEstMinTutte < 0, 0, ritEstMinTutte)
Next a
End If
'========================
' CALCOLI
'========================
If freq > 0 Then
ritMedio = Round(nEstrAnalizzate / freq, 1)
If ritMedio > 0 Then ic = Round(rit / ritMedio, 2)
If ritMax > 0 Then percentMax = Round((rit / ritMax) * 100, 1)
End If
'========================
' RIGA TABELLA
'========================
nCols = 9 + nAmbi * 5
ReDim aValori(nCols)
ReDim aColori(nCols)
If Ru <= 11 Then
nomeRuota = NomeRuota(Ru)
Else
nomeRuota = "Tutte"
End If
aValori(1) = nomeRuota
aValori(2) = rit
aValori(3) = ritMax
aValori(4) = ritMedio
aValori(5) = percentMax & "%"
aValori(6) = freq
aValori(7) = ic
aValori(8) = dataU
aValori(9) = Trim(estratti)
col = 10
For i = 1 To nAmbi
aValori(col) = ritA(i)
aValori(col + 1) = ritMaxA(i)
aValori(col + 2) = freqA(i)
aValori(col + 3) = ritEstA(i)
aValori(col + 4) = ritEstMaxA(i)
col = col + 5
Next i
For c = 1 To nCols
aColori(c) = RGB(240, 240, 240)
Next c
If ic >= 2 Then
aColori(7) = vbYellow
ElseIf ic >= 1.5 Then
aColori(7) = RGB(255, 220, 100)
End If
If percentMax >= 80 Then
aColori(5) = RGB(255, 150, 150)
End If
Call AddRigaTabella(aValori, aColori)
SkipRuota:
Next Ru
Call SetTableHeight(7)
Call CreaTabella
Call Scrivi()
Call Scrivi("Legenda IC Norm.: >2 = giallo | >1.5 = arancione", True)
Call Scrivi("Legenda % su Max: >80% = rosso chiaro", True)
Call Scrivi()
Call Scrivi("RAMCOLOTTO - Statistica Gruppo Ambi", True, , , vbBlue)
End Sub
'========================
' VERIFICA AMBO USCITO
'========================
Function AmboUscito(aE, n1, n2)
Dim j, t1, t2
t1 = False : t2 = False
For j = 1 To 5
If aE(j) = n1 Then t1 = True
If aE(j) = n2 Then t2 = True
Next j
AmboUscito = (t1 And t2)
End Function
Lo metto per curiosità. Il tempo era finito e quindi non ho potuto andare avanti.
Non ridete degli errori, deve ancora imparare