Tasto TAB e VBA



  • Tasto TAB e VBA
    di Kipudda (utente non iscritto) data: 24/01/2015 14:44:49

    Sul mio foglio excel ho inserito la seguente istruzione su VBA per fare in modo che, trovandomi sulla cella A10, al momento in cui mi sposto con il cursore sulla cella affianco (senza aver inserito alcun valore nella cella A10) il file mi riposiziona automaticamente sulla cella D10 (e non sulla cella B10).
    Però ho verificato che, se sposto il cursore con il tasto freccia (destra), l’istruzione funziona correttamente; se invece utilizzo il tasto TAB, l’istruzione non si attiva ed il cursore si sposta nella cella successiva B10 e non nella cella D10.
    Come posso correggere l’istruzione inserita su VBA per fare in modo che, spostandomi sia con il tasto TAB che con il tasto freccia (destra), il cursore si riposizioni nella cella desiderata?

    Grazie mille!

     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Target.Address(0, 0) = "A10" Then
        Range("D10").Select
    End If
    
    End Sub
    



  • di scossa data: 24/01/2015 15:09:54

    cit. Kipudda: " trovandomi sulla cella A10, al momento in cui mi sposto con il cursore sulla cella affianco (senza aver inserito alcun valore nella cella A10) il file mi riposiziona automaticamente sulla cella D10 (e non sulla cella B10)."

    Il codice che hai postato non fa assolutamente quello che dici.
    Target è la cella selezionata quindi ti porta in D10 quando selezioni ("entri" in) A10 e non quando "ti sposti" in B10.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Mabolsie (utente non iscritto) data: 24/01/2015 15:22:53

    Ciao Prova cosi:

    Max
     
    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim a As String
    a = Target.Address
    If Target.Address() = a Then
        Range("D10").Select
    End If
    
    End Sub
    



  • di mabolsie (utente non iscritto) data: 24/01/2015 15:35:40

    Ha ragione scossa, prova cosi , cioè quando entri in a10 poi in uscita la cella va in d10.

    Ciao Max
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim a As Variant
    a = Target.Address()
    MsgBox (a)
    If Target.Address(10, 1) = a Then
    
        Range("D10").Select
    End If
    
    End Sub
    



  • di scossa data: 24/01/2015 15:48:05

    cit. Mabolsie: "
    a = Target.Address
    If Target.Address() = a Then

    "

    Questo è privo di senso perché l'If sarà sempre vero


    cit. Mabolsie: "If Target.Address(10, 1) = a Then

    Questo pure è privo di senso perché è uguale al precedente, inoltre Address(10, 1) è orribile da vedere visto che i primi due argomenti vengono valutati come Vero (>0) o Falso (0) e per default sono considerato Vero.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di mabolsie (utente non iscritto) data: 24/01/2015 16:00:07

    Grazie scossa, infatti non funziona un tubo.

    Ciao Max



  • di mabolsie (utente non iscritto) data: 24/01/2015 16:04:52

    @scossa
    ... non avevo capito il valore degli argomenti di Address.

    Grazie Max



  • di mabolsie (utente non iscritto) data: 24/01/2015 16:10:04

    Forse ho capito quello che voleva fare Kipudda, allego nuovo codice

    p.s. scossa controlla

    Ciao Max
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    Dim b As String
    b = Range("A10").Address
    If ActiveCell.Address = b Then
    Range("d10").Select
    End If
    End Sub



  • di mabolsie (utente non iscritto) data: 24/01/2015 16:13:22

    ...senza variabili

    ciao
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If ActiveCell.Address = Range("A10").Address Then
    Range("d10").Select
    End If
    End Sub
    



  • di Vecchio Frac data: 24/01/2015 17:32:05

    So che ritenete più performante confrontare tra loro stringhe invece di utilizzare funzioni, ma io penso che Intersect è semanticamente più chiaro e intelliggibile.
    My 2 cent ;)
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Intersect(ActiveCell, Range("A10")) Is Nothing Then Exit Sub
        Range("d10").Select
    
    End Sub






  • di mabolsie (utente non iscritto) data: 24/01/2015 18:42:15

    ...soluzione più raffinata.

    Ciao Vecchio Frac

    Max



  • di scossa data: 24/01/2015 19:14:41

    cit. V.F.: "Intersect(ActiveCell, Range("A10"))"

    Perché usare ActiveCell quando c'è disponibile Target?

    E non dimentichiamoci che Range("d10").Select richiama l'evento Worksheet_SelectionChange ....


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 24/01/2015 21:47:50

    Sì, Activecell è proprio *sbagliato* perchè è proprio al Target che ci si deve riferire.
    Nella fretta dell'esempio ho scritto una stupidaggine ma il concetto è valido (come pure va sempre disabilitata la gestione degli eventi quando si intercettano gli eventi di select e change sul foglio) ^_^





  • di kipudda (utente non iscritto) data: 26/01/2015 09:26:50

    Grazie a tutti per l'aiuto! Ho provato l'ultima funzione postata da Mabolsie ma non gira come dovrebbeo. Cioè il cursore va sempre nella cella immediatamente successiva e non in quella desiderata. Ho provato anche quella di Vecchio Frac ma nulla da fare..



  • di Vecchio Frac data: 26/01/2015 13:52:34

    Ti ripropongo la mia, scritta come si deve (ma mutatis mutandis è identico al codice di max), con l'avvertenza che naturalmente va inserita nel codice del foglio interessato.
     
    'codice del Foglio1
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Intersect(Target, Range("A10")) Is Nothing Then Exit Sub
    
        Application.EnableEvents = False
        Range("D10").Select
        Application.EnableEvents = True
    
    End Sub






  • di scossa data: 26/01/2015 14:22:09

    cit. kipudda: "trovandomi sulla cella A10, al momento in cui mi sposto con il cursore sulla cella affianco (senza aver inserito alcun valore nella cella A10) mi riposiziona automaticamente sulla cella D10 (e non sulla cella B10)"

    Continuate a considerare come Target la cella A10, mentre deve essere la B10!


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
      If Not Intersect(Target, Range("B10")) Is Nothing And Me.Range("A10").Value = "" Then
        Application.EnableEvents = False
        Range("D10").Select
        Application.EnableEvents = True
      End If
    
    End Sub



  • di kipudda (utente non iscritto) data: 26/01/2015 17:57:25

    problema risolto! Grazie a tutti x l'aiuto!