Macro Excel Click su cella e cambia valore



  • Macro Excel: Click su cella e cambia valore
    di Macchia (utente non iscritto) data: 04/10/2013 11:49:36

    Ciao a tutti,
    sono abbastanza scarso con macro e VBA. Vorrei fare una cosa del genere:
    Su un certo intervallo di celle, cliccando su una cella, al primo clic compare una lettera, al secondo un'altra, al terzo un'altra ancora, al quarto una diversa e al quinto la cella torna vuota. Inoltre è possibile che questo intervallo si possa espandere, aggiungendo righe e colonne.
    Vi ringrazio per l'aiuto.
    Ciao



  • di totygno71 (utente non iscritto) data: 04/10/2013 12:02:11

    La vedo dura



  • di gaetanopr data: 04/10/2013 14:19:25

    Prova la macro funziona con il doppioclick, da copiare direttamente sul foglio interessato
    If then, si può sostituire con select case
     
    Dim Controllo As Byte
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      
        If Intersect(Target, Range("A5")) Is Nothing Then Exit Sub
           
            Controllo = Controllo + 1
            If Controllo = 1 Then
                Target.Value = "A"
            ElseIf Controllo = 2 Then
                Target.Value = "B"
            ElseIf Controllo = 3 Then
                Target.Value = "C"
            ElseIf Controllo = 4 Then
                Target.Value = "D"
            ElseIf Controllo = 5 Then Target.Value = "": Controllo = 0: Exit Sub
            End If
            Cancel = True   ' serve a rendere non editabile la cella cliccata
    End Sub
    



  • di Vecchio Frac data: 04/10/2013 14:27:12

    La mia versione ^_^
    Nel codice, ovviamente, di foglio1.
    La parola nascosta compare in C1.
    Allego anche il file.
     
    Option Explicit
    
    Const parola_nascosta = "ciao"
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Static indice As Integer
    
        If Target.Cells.Count > 1 Then Exit Sub
        
        Application.EnableEvents = False
        If Not Intersect(Target, [c1]) Is Nothing Then
            indice = indice + 1
            If indice >= Len(parola_nascosta) + 1 Then
                [c1] = ""
                indice = 0
            Else
                [c1] = Left(parola_nascosta, indice)
            End If
            [A1].Select
        End If
        Application.EnableEvents = True
    End Sub
    






  • di totygno71 (utente non iscritto) data: 04/10/2013 15:29:30

    Ragazzi ma questi sono surrogati...
    L'amico Macchia chiedeva l'evento ad ogni singolo click della stessa cella... almeno questo ho capito io...
    cit"cliccando su una cella, al primo clic compare una lettera, al secondo un'altra, al terzo un'altra ancora...



  • di Macchi (utente non iscritto) data: 04/10/2013 15:30:46

    Grazie, l'idea che avevo è la prima proposta di gaetanopr. Ha un piccolo problema: Se voglio per esempio mettere in una cella dell'intervallo la A, e in un altra sempre A, clicco sulla prima cella e mi compare la A, ma se clicco sulla seconda compare direttamente la B. Si può sistemare questa cosa? grazie mille



  • di Macchia (utente non iscritto) data: 04/10/2013 15:36:39

    totygno71 hai ragione, la mia idea era leggermente diversa, però mi adatto alle risposte che ricevo, non c'è problema. Meglio il singolo click ma mi posso accontentare anche del doppio. L'unico problema è quello che ho segnalato.
    Grazie



  • di gaetanopr (utente non iscritto) data: 04/10/2013 15:42:39

    prova questa
     
    Dim Controllo As byte
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Target.Cells.Count > 1 Then Exit Sub
        
        Application.EnableEvents = False
        If Intersect(Target, Range("A5:B5")) Is Nothing Then Exit Sub
           
            Controllo = Controllo + 1
            If Controllo = 1 Then
                Target.Value = "A"
            ElseIf Controllo = 2 Then
                Target.Value = "B"
            ElseIf Controllo = 3 Then
                Target.Value = "C"
            ElseIf Controllo = 4 Then
                Target.Value = "D"
            ElseIf Controllo = 5 Then Target.Value = "": Controllo = 0: Exit Sub
            End If
        Application.EnableEvents = True
    End Sub



  • di gaetanopr (utente non iscritto) data: 04/10/2013 15:48:13

    Questa non l'ho provata, "funziona" dovrebbe sulle celle A5 e B5



  • di Macchia (utente non iscritto) data: 04/10/2013 15:48:32

    Ora non mi fa proprio niente...doppio click mi fa entrare solo nella cella, non compare più nulla.



  • di gaetanopr (utente non iscritto) data: 04/10/2013 15:55:16

    Ciao macchia l'ultima che ti ho postato funziona con il doppoclick, altrimenti prova quella che ti ho postato in precedenza e cambia




     
      If Intersect(Target, Range("A5")) Is Nothing Then Exit Sub
      con 
    
      If Intersect(Target, Range("A5:B5")) Is Nothing Then Exit Sub
    
    
    'prova alternandoti tra le due celle A5 e B5



  • di gaetanopr (utente non iscritto) data: 04/10/2013 15:58:25

    cit>>Ragazzi ma questi sono surrogati...

    Ciao totygno71 i surrogati sono sempre un punto di partenza, ad esempio quella di V.F mi è piaciuta veramente



  • di gaetanopr (utente non iscritto) data: 04/10/2013 16:02:11

    cit>>Ciao macchia l'ultima che ti ho postato funziona con il doppoclick
    scusami volevo dire click purtroppo scrivo con il cell.

    Ciaoo



  • di Vecchio Frac data: 04/10/2013 16:09:44

    Se ci fate caso, la mia versione funziona con un solo click nella cella C1, come da quesito iniziale... quella di totygno è tutta indivia ^_^





  • di Macchia (utente non iscritto) data: 04/10/2013 16:30:51

    Forse mi ero spiegato male io all'inizio:
    Se ho una tabella per esempio A1:C5, in ognuna delle celle che compongono la tabella devo poter cliccare per far uscire, prima A, sostituita poi dalla B e cosi via. Però il punto è che ogni volta che cambio cella, la cella deve partire dalla A, cioè: se in A1 clicco 3 volte e così compare la C, se clicco in A2 deve comparire A, non D come accade.
    Grazie per l'aiuto in tutto.



  • di gaetanopr (utente non iscritto) data: 04/10/2013 17:46:14

    Un' idea potrebbe essere, usando un array che raccoglie tutti gli indirizzi dei target e ad ogni click si controlla il target con quelli dell'array, quindi se trova 1 riscontro uguale scriverà B e cosi via

    Stasera faccio qualche prova



  • di Vecchio Frac data: 04/10/2013 20:29:35

    cit. "Forse mi ero spiegato male io all'inizio:"
    ---> Ah infatti io avevo capito diversamente :)





  • di tortyno (utente non iscritto) data: 04/10/2013 20:30:46

    Se se....^_^



  • di gaetanopr data: 04/10/2013 23:30:16

    cit>>Se ho una tabella per esempio A1:C5, in ognuna delle celle che compongono la tabella devo poter cliccare per far uscire, prima A, sostituita poi dalla B e cosi via. Però il punto è che ogni volta che cambio cella, la cella deve partire dalla A, cioè: se in A1 clicco 3 volte e così compare la C, se clicco in A2 deve comparire A, non D come accade.

    Prova questa dovrebbe fare al caso tuo
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
        
        Application.EnableEvents = False
        If Intersect(Target, Range("A1:C5")) Is Nothing Then Exit Sub
       
            DATO = Target.Value
                 
            Select Case DATO
             Case ""
             Target.Value = "A"
             Case "A"
             Target.Value = "B"
             Case "B"
             Target.Value = "C"
             Case "C"
             Target.Value = "D"
              Case "D"
             Target.Value = ""
            End Select
    
        Application.EnableEvents = True
    End Sub
    



  • di gaetanopr data: 05/10/2013 00:55:58

    Però secondo me è meglio sfruttare il doubleclick, almeno con questa macro, in modo da poter sostituire la lettera anche quando clicchi consecutivamente sulla stessa cella



  • di gaetanopr data: 05/10/2013 01:13:12

    cit>>Però secondo me è meglio sfruttare il doubleclick, almeno con questa macro, in modo da poter sostituire la lettera anche quando clicchi consecutivamente sulla stessa cella

    Oppure mi era sfuggito, data l'ora, spostare la selezione su un'altra cella a fine macro
    ES: Range("D1").Select





  • di Vecchio Frac data: 05/10/2013 11:55:06

    Esatto. Questa era stata anche la mia soluzione.
    Farei anche attenzione alla verifica del dato (maiuscole/minuscole).
    Per il resto ok.





  • di totygno71 (utente non iscritto) data: 05/10/2013 13:57:18

    E se nea cella ci fosse "w" o "q" o "pippo"?



  • di gaetanopr data: 05/10/2013 14:20:43

    cit>>>Esatto. Questa era stata anche la mia soluzione.
    si ho visto adesso che avevi messo alla fine [A1].Select
    Come fatto notare da V.F ho modificato la macro in modo da tener conto di eventuali maiuscole/minuscole

    cit>>E se nea cella ci fosse "w" o "q" o "pippo"?
    Rimarrebbe inalterata, nella select dovrà indicare solo i valori che devono essere cambiati

    Allego macro
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
        
        Application.EnableEvents = False
        If Intersect(Target, Range("A1:C5")) Is Nothing Then Exit Sub
       
            DATO = UCase(Target.Value)
                 
            Select Case DATO
             Case ""
             Target.Value = "A"
             Case "A"
             Target.Value = "B"
             Case "B"
             Target.Value = "C"
             Case "C"
             Target.Value = "D"
              Case "D"
             Target.Value = ""
            End Select
           
           [D1].Select
        
    Application.EnableEvents = True
    End Sub
    



  • di Macchia (utente non iscritto) data: 07/10/2013 11:52:40

    Vi ringrazio, l'ultima è ciò di cui avevo bisogno. Un'ultima cosa che non capisco: Se clicco su una areaa diversa da quella del range della macro, in alcuni casi mi interrompe la macro e dunque se poi riclicco su una cella dell'intervallo, non va più la macro. Se ne seleziono altre sempre al di fuori del range e poi torno sul range invece continua a funzionare. Sapete perché?
    grazie



  • di gaetanopr data: 07/10/2013 12:08:04

    Non posso provare, ,ma prova ad invertire questa parte

     
     
        If Intersect(Target, Range("A1:C5")) Is Nothing Then Exit Sub
         Application.EnableEvents = False



  • di Macchia (utente non iscritto) data: 07/10/2013 12:11:10

    Eccezionale! Ora tutto come desideravo. Grazie!



  • di Macchia (utente non iscritto) data: 07/10/2013 17:58:32

    Un ultimo aiuto: Se oltre a questa macro ne volessi un'altra che su un altro range di celle cliccandoci sopra mi cambia il colore della cella tra 3 colori diversi oltre che il fondo trasparente, come posso fare? grazie



  • di gaetanopr data: 07/10/2013 18:59:10

    Sempre in sequenza??
    ti do un aiuto usa la macro di prima e invece di agire sul valore della cella, lavora sulla proprietà che definisce il colore di sfondo, quindi DATO = UCase(Target.Value) diventa
    DATO = Target.Interior.ColorIndex
    allo stesso modo modifica la select case.
    In rete trovi i vari codici per i colori



  • di Macchia (utente non iscritto) data: 07/10/2013 19:02:58

    Infatti per costruire la seconda macro x colorare le celle ci sono più o meno riuscito, ma non riesco a metterle insieme, cioè se metto la prima però non mi funziona l'altra...si capisce? Come strutturo il tutto per metterci le due macro diverse? grazie



  • di gaetanopr data: 07/10/2013 19:12:25

    puoi usare una macro che a seconda del range selezionato richiamare la prima o la seconda macro



  • di gaetanopr data: 07/10/2013 19:35:16

    cit>>ma non riesco a metterle insieme, cioè se metto la prima però non mi funziona l'altra..
    Questo è un esempio di come dicevo prima, l'ho scritta velocemente quindi controllala bene
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Application.Intersect(Target, Range("A1:C5")) Is Nothing Then Call CambiaValore
    If Not Application.Intersect(Target, Range("A6:C10")) Is Nothing Then Call Formatta
    Application.EnableEvents = True
    End Sub
    
    Sub Formatta()
            
          DatoF = ActiveCell.Interior.ColorIndex
                 
          With ActiveCell
            Select Case DatoF
             Case xlNone
             .Interior.ColorIndex = 3
             Case 3
             .Interior.ColorIndex = 4
             Case 4
             .Interior.ColorIndex = 5
             Case 5
             .Interior.ColorIndex = 6
             Case 6
             .Interior.ColorIndex = xlNone
             
            End Select
           End With
           [F1].Select
        
    
    End Sub
    
    
    Sub CambiaValore()
    
            DatoC = UCase(ActiveCell.Value)
            
           With ActiveCell
            Select Case DatoC
             Case ""
             .Value = "A"
             Case "A"
             .Value = "B"
             Case "B"
             .Value = "C"
             Case "C"
             .Value = "D"
              Case "D"
             .Value = ""
            End Select
           
           [D1].Select
          End With
    End Sub
    



  • di Macchia (utente non iscritto) data: 08/10/2013 16:10:33

    eccezionale! grazie