› Sviluppare funzionalita su Microsoft Office con VBA › Non calcola
-
AutoreArticoli
-
Questo codice sotto se utilizzato in questo modo non calcola e rimane bloccato.
Sub Mischia_carte() Dim N, C, R As String ' N = Sheets("CARTE").Range("A40") ' Quantit? ( Devono essere 96 quelle scelte ) C = 0 ' Carte R = 42 ' Riga ' RIPETI: ' X = Int(Rnd() * N) + 1 If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R) C = C + 1: R = R + 1 ' ' If C = N Then GoTo FATTO Else GoTo RIPETI FATTO: ' If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else GoTo RIPETI FINE: MsgBox ("Finito !") '--- End SubInvece se scrivo in questo modo si esaurisce la memoria di stack ma calcola, anche se dopo il messaggio continua a ripetersi all'infinito!! Come risolvo?
Sub Mischia_carte() Dim N, C, R As String ' N = Sheets("CARTE").Range("A40") ' Quantit? ( Devono essere 96 quelle scelte ) C = 0 ' Carte R = 42 ' Riga ' RIPETI: ' X = Int(Rnd() * N) + 1 If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R) C = C + 1: R = R + 1 ' ' If C = N Then GoTo FATTO Else GoTo RIPETI FATTO: ' If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else Call ricalcola FINE: MsgBox ("Finito !") '--- End Sub Sub ricalcola() Call Mischia_carte End SubRisolta, funziona!
Sub Mischia_carte() Dim N, C, R, X As String ' N = Sheets("CARTE").Range("A40") ' Quantit? C = 0 ' Carte R = 42 ' Riga ' RIPETI: ' X = Int(Rnd() * N) + 1 If R = X Then Sheets("CARTE").Range("B" & R) = Sheets("CARTE").Range("A" & R) C = C + 1: R = R + 1 ' If C = N Then GoTo FATTO Else GoTo RIPETI FATTO: ' N = Sheets("CARTE").Range("A40") ' Quantit? C = 0 ' Carte R = 42 ' Riga ' If Sheets("CARTE").Range("B40") >= 96 Then GoTo FINE Else GoTo RIPETI ' FINE: MsgBox ("Finito !") '--- End SubRisolta, funziona!
Molto bene, anche se non ci credo 🙂 adesso però osserva che:
- Manca Option Explicit. O almeno, non mostri che ci sia.
- I Dim devono essere espliciti per ogni variabile. L'istruzione "Dim N, C, R, X As String" dichiara di tipo String soltanto l'ultima, la X, mentre le altre variabili sono indifferenziate (assumono tipo Variant con spreco di byte di memoria).
- Hai dichiarato X come String ma poi le assegni un valore numerico ("X = Int(Rnd() * N) + 1"). Questo non va bene perchè forzi il compilatore a trasformare in stringa un numero inutilmente visto che poi effettui dei confronti tra numeri.Â
- Hai utilizzato Rnd ma non hai inizializzato il generatore di numeri casuali (Randomize), quindi otterrai sempre e inequivocabilmente il medesimo numero "casuale".
- Quei Goto sono da evitare.
Forse se spieghi scenario e obiettivo ti si può dare qualche consiglio più mirato e più utile.
Â
Quindi devo dichiarare dim ad ogni singola variabile? Non c'è modo di unirle in una sola riga?
Cavolo sai quante ne ho scritte così adesso devo modificarle tutte.
Randomize come si applica?
Â
--Ho sistemato i dim all'interno del Gioco.
Non c'è modo di unirle in una sola riga?
Non mi sono spiegato bene, scusa. Puoi dimensionare quante variabili vuoi su una riga, ma per ognuna sarebbe bene specificare il tipo.
Esempio:
Dim a as String, b as String, c as StringMentre invece:
Dim a, b, c as StringSignifica che solo "c" è espressamente di tipo stringa, le altre due sono di tipo Variant (cioè assumono il primo tipo di dato che viene assegnato loro e comunque riservano in memoria uno spazio molto più grande del necessario). Con i computer di oggi, dove memoria ce n'è, non si nota molto la differenza di performance. Ma tanto è per essere precisi 🙂
Comunque non sei affatto costretto a riscrivere il tuo codice. Magari da oggi avrai un attenzione in più.
Randomize con un argomento imprevedibile (il "seme") imposta il generatore di numeri casuali a essere un po' più casuale (in realtà non genera numeri in modo del tutto casuale). Ti basta dichiararlo a inizio routine (quindi non serve ogni volta che usi Rnd):
Sub qualcosa() Dim ... Dim ... Dim ... Randomize Timer 'imposta un seme diverso ad ogni esecuzione ... resto del codice End SubHo sistemato i dim all'interno del Gioco.
Ah ma adesso ricordo... LBDPÂ
 -
AutoreArticoli
