randomizzazione serie valori



  • 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