randomizzazione serie valori
Hai un problema con Excel? 
randomizzazione serie valori
di Paolo (utente non iscritto) data: 01/02/2013 19:21:48
Salve. Ho questo problema. Faccio l'esempio. Se la cella a1 è vuota non deve succedere nulla mentre se è piena vorrei che nella cella a2 ci fosse una "randomizzazione" di una serie di valori. Grazie
di Vecchio Frac data: 01/02/2013 19:33:33
in A2: =SE(A1="";"";SCEGLI(INT(CASUALE()*3)+1;"a";"b";"c"))
Ma definisci "randomizzazione" di una serie di valori.
di Paolo (utente non iscritto) data: 02/02/2013 14:10:32
Ho appena provato la tua formula e mi va benissimo, però ha questo inconveniente che ora ti spiego: se scrivo qualcosa in a1 nella a2 mi esce un valore prendiamo in esempio la tua formula mi esce la lettera "b" e fin qui tutto bene, però se nella cella b1 per esempio o in qualunque altra cella scrivo qualcosa il valore della cella a2 me lo cambia nuovamente (e non me lo dovrebbe cambiare) oppure se premo il tasto canc in qualsiasi cella mi cambia sempre il valore della cella a2; come mai?
di Vecchio Frac data: 02/02/2013 14:28:42
Perchè nella formula c'è la funzione CASUALE che per natura viene ricalcolata ogni volta che si fa qualcosa sul foglio (si reinserisce una formula o si modifica una cella).
Quello era solo un esempio per vedere se avevo capito cosa volevi fare :)
Non è pensabile che sia quella la formula che ti serve.
Io volevo solo farti vedere come si sceglie un valore da una lista di valori.
Definisci meglio il contesto, l'esigenza e il risultato atteso, e anche la risposta sarà più precisa (e magari si userà una funzione con codice perchè più versatile).
di Paolo (utente non iscritto) data: 02/02/2013 14:36:04
A me la tua funzione va benissimo e calza a pennello per la mia esigenza solo che quando scrivo qualcosa in un altra cella non mi deve cambiare più il valore della cella a2; il valore me lo potrebbe cambiare solo se modifico la cella interessata come in questo caso la a1. Quindi questa formula come si potrebbe modificare?
di Vecchio Frac data: 02/02/2013 14:56:43
Il codice allegato fa la stessa cosa ma non ha questo problema.
Scrivi =RANDOM() in A2 o dove vuoi.
Quando viene immesso un valore in A1, la funzione pesca un valore a caso dalla lista fornita e lo mette in A2.
Ma poi questo valore rimane fisso, anche se poi ci son modifiche al foglio.
Ci sono notevoli migliorie da poter apporre, ad esempio la lista di valori da cui pescare potrebbe risiedere sul foglio stesso e quindi essere dinamica.
Non sapendo cosa ti serve e cosa vuoi fare, si va un po' a tentativi :)
Option Explicit
Function random()
Dim r As Integer
Application.Volatile
Randomize Timer
random = ""
If [A1] <> "" Then
r = Int(Rnd * 3) + 1
random = Choose(r, "a", "b", "c")
End If
End Function
|
di Vecchio Frac data: 02/02/2013 14:57:56
Scusa, devi togliere "Application.Volatile" dalla Function altrimenti si comporta come la formula nella cella :)
di Paolo (utente non iscritto) data: 02/02/2013 18:33:41
Ho provato il tuo nuovo codice ma di errore, sicuramente avrò sbagliato qualcosa. Non è che gentilmente mi potresti allegare un esempio
di Vecchio Frac data: 02/02/2013 22:54:20
Allego una versione modificata. E più aderente a quello che ti aspetti.
Allego anche un piccolo file.
'nel foglio interessato alla modifica
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
Randomize Timer
If Target.Address = "$A$1" Then
Application.EnableEvents = False
If Target = "" Then
[B1] = ""
Else
r = Int(Rnd * 3) + 1
[B1] = Choose(r, "a", "b", "c")
End If
Application.EnableEvents = True
End If
End Sub
|
di Paolo (utente non iscritto) data: 03/02/2013 15:11:47
Ora il tuo file funziona. Però vorrei fare questo: quando scrivo qualcosa in a1 in a2 mi randomizza dei valori, quando scrivo qualcosa in b1 in b2 mi randomizza gli stessi valori, quando scrivo qualcosa in c1 in c2 mi randomizza sempre gli stessi valori fino alla a10. Come posso adattare il tuo file per questa esigenza? Si può fare? Fermo restando che i valori che sono in a2 b2 c2 ecc... non me li cambi.
di Vecchio Frac data: 04/02/2013 10:50:49
cit. " quando scrivo qualcosa in a1 in a2 mi randomizza dei valori, quando scrivo qualcosa in b1 in b2 mi randomizza gli stessi valori, quando scrivo qualcosa in c1 in c2 mi randomizza sempre gli stessi valori fino alla a10. "
---> e se scrivi qualcosa in A2 che cosa deve succedere?
di Paolo (utente non iscritto) data: 04/02/2013 15:03:01
In a2 b2 c2 ecc... non devo scrivere nulla, mi deve solo uscire uno di quei valori.
di Vecchio Frac data: 04/02/2013 17:24:02
Allora cambia la routine come di seguito indicato.
Scrivi in riga 1 e in riga 2 vedrai i valori cambiare, ma solo sotto la cella interessata.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer
If Target.Row <> 1 Then Exit Sub
Randomize Timer
Application.EnableEvents = False
If Target = "" Then
Target.Offset(1) = ""
Else
r = Int(Rnd * 3) + 1
Target.Offset(1) = Choose(r, "a", "b", "c")
End If
Application.EnableEvents = True
End Sub
|
di Paolo (utente non iscritto) data: 05/02/2013 20:41:38
Ho provato e va bene, solo che se per esempio nella cella a1 scrivo ciao nella a2 mi esce la "b" per esempio ma poi se cambio ciao e scrivo per esempio salve resta sempre la "b".
di Vecchio Frac data: 05/02/2013 20:52:13
No, non è che resta sempre la "b"; il punto è che vengono randomizzati solo tre valori e quindi la probabilità che ne esca uno uguale al precedente è altissima. E' chiaro che devi aumentare i valori da scegliere per ottenere qualcosa di sensato.
Solo che è dall'inizio della discussione che non definisci benedetta questa "serie di valori" :)
di Paolo (utente non iscritto) data: 05/02/2013 21:20:46
Io ho provato con i miei valori che sono 12 ma non ha randomizzato nulla anzi ti dirò di più; una volta scritti tutti e randomizzati bene ho cancellato tutte le 24 celle e riscrivendo qualcosa in quelle celle non me le randomizza proprio!
di Vecchio Frac data: 05/02/2013 22:02:20
Gosh :)
Allega il tuo file, con dati di esempio.
di Paolo (utente non iscritto) data: 07/02/2013 07:17:33
Ho allegato un file di esempio.
di Vecchio Frac data: 07/02/2013 08:25:40
Non era gestita la selezione multipla delle celle, ma solo la cella singola.
Ho modificato il codice e adesso funziona.
Per farlo funzionare su colonna invece che su riga dove vedi .Offset(1) devi cambiare in .Offset(, 1) e naturalmente il controllo sulla colonna iniziale: se modifico una cella non in colonna A non deve succedere niente:
If Target.Column <> 1 Then Exit Sub
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer, cella As Range
If Target.Row <> 1 Then Exit Sub
Randomize Timer
Application.EnableEvents = False
For Each cella In Target
If cella = "" Then
cella.Offset(1) = ""
Else
r = Int(Rnd * 12) + 1
cella.Offset(1) = Choose(r, "GENNAIO", "FEBBRAIO", "MARZO", "APRILE", "MAGGIO", "GIUGNO", "LUGLIO", "AGOSTO", "SETTEMBRE", "OTTOBRE", "NOVEMBRE", "DICEMBRE")
End If
Next
Application.EnableEvents = True
End Sub |
di Paolo (utente non iscritto) data: 07/02/2013 19:46:26
Ok, ora va benissimo per la riga. Ho provato per la colonna ma c'è questo problema: quando scrivo qualcosa nella colonna A mi randomizza sotto sempre nella colonna A invece di uscire affianco cioè nella colonna B, se scrivo qualcosa nella colonna N mi deve uscire nella colonna O. Per limitare alle celle A1:A10 si può? Cosa devo modificare?
di Vecchio Frac data: 07/02/2013 21:03:19
Come detto prima, per funzionare in colonna devi cambiare i riferimenti a Offset.
Allego la revisione della procedura limitata solo a A1:A10.
Scrivere qualcosa in tale range produrrà un risultato in B1:B10.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Integer, cella As Range
If Intersect(Target, [A1:A10]) Is Nothing Then Exit Sub
Randomize Timer
Application.EnableEvents = False
For Each cella In Target
If cella = "" Then
cella.Offset(1) = ""
Else
r = Int(Rnd * 12) + 1
cella.Offset(,1) = Choose(r, "GENNAIO", "FEBBRAIO", "MARZO", "APRILE", "MAGGIO", "GIUGNO", "LUGLIO", "AGOSTO", "SETTEMBRE", "OTTOBRE", "NOVEMBRE", "DICEMBRE")
End If
Next
Application.EnableEvents = True
End Sub |
di Paolo (utente non iscritto) data: 08/02/2013 14:29:14
Ok, grazie. Sei un grande
Vuoi Approfondire?