uso di una cella target



  • uso di una cella target
    di luciano (utente non iscritto) data: 31/03/2014 11:33:54

    salve a tutti,
    come poso associare delle celle in modo che come seleziono un valore questo mi faccia partire una macro associata a quel valore?

    mi spiego nella cella e3 ho la possibilità di scegliere con un menù a tendina 4 valori ( 1,2,3,4)
    vorrei che come seleziono il valore 2 mi faccia partire la macro "selezione2" e cosi via per gli alti valori

    ho provato a fare questo mettendo nel foglio usato il target, ma mi da dei problemi, cioe' non so bene come usarlo.

    ho un' altra questione sempre per questa discussione, ma prima di farvela vedo se dalla risposta del primo quesito possa riuscire a cavarmela da solo.

    Grazie
     
    Private Sub Worksheet_change(ByVal Target As Range)
    
    ' If Not Application.Intersect(Target, Range(Cdati)) Is Nothing Then
    If Range("e3") = "1" Then Call selezione2
    If Range("e3") = "2" Then Call selezione2
    If Range("e3") = "3" Then Call selezione3
    If Range("e3") = "4" Then Call selezione4



  • di Vecchio Frac data: 31/03/2014 11:44:33

    Per come hai fatto tu sembra che vada bene (è una delle soluzioni beninteso, ma per il momento può essere accettabile).
    Noto solo un errore di battitura nel richiamare la prima condizione:
    If Range("e3") = "1" Then Call selezione2
    deve essere scritta i modo che chiami "selezione1":
    If Range("e3") = "1" Then Call selezione1

    Chiaramente poi (ed è importante dirlo) le diverse procedure "selezione1, 2, 3 e 4" devono essere accessibili e pubbliche; quindi le dovrai scrivere in un modulo e devono cominciare con "Public Sub" oppure solo "Sub" ("Sub selezione1()" , "Sub selezione2()", eccetera).
     
    Private Sub Worksheet_change(ByVal Target As Range)
    
        If Range("e3") = "1" Then Call selezione1
        If Range("e3") = "2" Then Call selezione2
        If Range("e3") = "3" Then Call selezione3
        If Range("e3") = "4" Then Call selezione4
    
    End Sub






  • di Lucas87 data: 31/03/2014 11:55:32

    Ciao
    Potresti aggiungere anche il codice sotto
    per limitare l'avvio della macro solo con la modifica della cella con il menù a tendina
     
    If Target.Address(0, 0) = "A3" Then  'sostituisci A3 con la cella in cui si trova il menù a tendina



  • di Zer0Kelvin data: 31/03/2014 11:59:06

    Ciao.
    Secondo me potresti, più convenientemente, inserire il nome dalla macro nella convalida (o menù a tendina, se preferisci) ed utilizzare il codice qui sotto.
    Il codice provvede a cancellare il contenuto della cella E3, nel caso tu voglia richiamare la stessa macro la volta successiva.
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       If (Not Intersect(Me.Range("E3"), Target) Is Nothing) And Target.Cells.Count = 1 Then
          If Target.Value <> "" Then
             Application.Run Target.Value
             Target.Value = ""
          End If
       End If
    End Sub



  • di Zer0Kelvin data: 31/03/2014 12:01:01

    Il vantaggio è che visualizzi il nome della macro che stai per lanciare, e che se devi aggiungere o togliere macro, non hai bisogno di modificare il codice, ma solo l'elenco dei nomi delle macro.



  • di Zer0Kelvin data: 31/03/2014 12:04:53

    PS: come specificato fa Vecchio Frac; le macro DEVONO trovarsi in un modulo standard ed essere "Public".



  • di luciano (utente non iscritto) data: 31/03/2014 12:17:15

    ciao e grazie a tutti intanto!
    nel frattempo che scrivevate le vostre risposte ho provato a fare altre prove e sono arrivato a questo codice:

    io vorrei che la "macro" partisse appunto solo quando modifico quella cella e forse con il codice qua sotto credo di esserci riuscito.(correggetemi se sbaglio ovviamente). almeno vedo che se scelgo uno dei valori dal menu a tendina mi fa partire la macro giusta, mentre se inserisco dei valori in altre celle non succede nulla.

    ora la domanda più complessa(per me si intende) è questa:

    ho altre 2 celle (j3,j5) nelle quali il menu a tendina viene generato in base alla scelta della cella e3 ( poichè va a mettere dei filtri in un altro foglio e genera la convalida in una colonna filtrata da selezionea, oppure selezioneb, oppure selezionec, oppure selezioned)

    come faccio in questo caso a far partire la macro quando la selezione e' uno dei valori filtrati?
    esempio in j3 potrei avere da scegliere anche 70 valori diversi dovuti già al filtraggio

    spero di essere stati chiaro, grazie!


     
    Private Sub Worksheet_change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("e3")) Is Nothing Then
     Dim cell As Range
        For Each cell In Range("e3")
            If cell.Value = "a" Then Call selezionea
            If cell.Value = "b" Then Call selezioneb
            If cell.Value = "c" Then Call selezionec
            If cell.Value = "d" Then Call selezioned
            Next
         



  • di luciano (utente non iscritto) data: 31/03/2014 12:55:06

    ho provato a mettere questo codice per le celle j3 e j5 pero se ad esempio vado nella cella j5 seleziono una voce dal menù a tendina alla fine mi parte in ogni caso sempre e solo progetto1 , mentre io vorrei che si avviasse la macro solo della cella(col valore selezionato) che ho scelto.
     
    For Each cell In Range("j3")
        If cell.Value = Target.Value Then Sheets("ruolo").Range("$A$3:$R$210588").AutoFilter Field:=4, Criteria1:=Target.Value: Call progetto1
                
             
        Next
        
        For Each cell In Range("j5")
        If cell.Value = Target.Value Then Sheets("ruolo").Range("$A$3:$R$210588").AutoFilter Field:=4, Criteria1:=Target.Value: Call progetto1
                
             
        Next



  • di luciano (utente non iscritto) data: 31/03/2014 12:57:30

    a volte gli errori più sciocchi.... avevo chiamato la stessa macro per entrambe le celle... ora faccio un po' di test ma sembra funzionare...



  • di Lucas87 data: 31/03/2014 13:00:26

    Dal tuo codice togli il
    for each....next
    perchè il range("e3") contiene solo la cella E3 quindi andrebbe a controllare solo quella rendendo inutile il ciclo.
    Per esperienza ho notato che il metodo intersect è pesante. Ti consiglio di sostituirlo con
    If Target.Address(0, 0) = "E3" Then

    Per il resto non ho capito la tua situazione. Ti conviene allegare un file o crearne uno simile in modo da capire.



  • di Vecchio Frac data: 31/03/2014 13:07:10

    @Zer0
    cit. "Secondo me potresti, più convenientemente, inserire il nome dalla macro nella convalida (o menù a tendina, se preferisci) ed utilizzare il codice qui sotto. "
    Mi hai preceduto nel ragionamento, ci sarei arrivato pian piano quando dicevo che per il momento era accettabile ^_^ ed è naturalmente una soluzione più completa.
    Come dice Zer0Kelvin infatti nel secondo post ("Il vantaggio è che ...") questa è una specie di applicazione di un meccanismo orientato agli oggetti ad un modello non ad oggetti. Col vantaggio di poter riutilizzare codice già scritto senza grandi modifiche (credo che si tratti di incapsulamento).





  • di luciano (utente non iscritto) data: 31/03/2014 13:17:56

    ciao Lucas, mi hai detto di levare il for ecc....next, ma come potrei anzi metterlo allora?


    ora provo come mi hai detto per evitare l'intersect

    ugualmente,per rispondere a Vecchio Frac, non ho capito come fare per inserire la macro nella convalida e poi utilizzare il codice come suggeritoù

    Grazie