celle alternative



  • celle alternative
    di dax.simo data: 29/11/2017 10:10:05

    Ciao a tutti,

    sto diventando pazzo ad integrare una funzionalità su un foglio excel,
    mi provo a spigare anche se è molto sempice:

    ho celle "alternative" se scrivo su di una cella vorrei che venisse cancellato l'eventuale dato scritto della altra cella e viceversa

    ponendo che le 2 celle sono A1 e B1
    se scrivo in A1 cancello il valore scritto in B1 ,
    se scrivo in B1 cancello il calore scritto in A1

    ho provato ad utilizzare il codice Workbook_SheetChange
    ma appena inserisco le 2 condizioni looppa e si inchioda 

    nel secondo programma che ho inserito T_manuale e T_flex sono 2 routine nelle quali sono andato a pulire le 2 celle
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    '
    If Intersect(Target, Range("B9:E9")) Is Nothing Then Exit Sub
    Range("B12:K13").Value = ""
    
    end sub
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address(0, 0) = "F54" Then
            Call T_MANUALE
                Else
                    If Target.Address(0, 0) = "F62" Then
                        Call T_FLEX
                            End If
        End If
    End Sub



  • di Luca73 data: 29/11/2017 11:24:22

    Ciao
    Devi disattivare gli eventi scatenati automaticamente
    usando Application.EnableEvents vedi sotto
    Stai attento se ci sono degli exit sub in quanto altrimenti non li riattivi.
    Ciao
    Luca


     
    Sub nome()
    With Application
          .EnableEvents = False
    End With
    [...]
    With Application
          .EnableEvents = False
    End With
    end sub






  • di dax.simo data: 29/11/2017 11:33:04

    Ciao Luca,

    prima di tutto grazie per la risposta,
    avevo letto qualcosa a riguardo della gestione degli eventi ma ho ancora un dubbio sul come utilizzarlo in modo appropriato e sul suo reale funzionamento
    di seguito ho incollato le 2 routine richiamo con le call al verificarsi degli eventi (che però mi vanno in loop)

    dove devo inserire il tuo codice? mi puoi spiegare tecnicamente cosa fa?

    grazie mille

     
    Sub T_MANUALE()
    Range("F62").Value = ""
    Exit Sub
    End Sub
    
    Sub T_FLEX()
    Range("F54").Value = ""
    Exit Sub
    End Sub
    



  • di Mister_x (utente non iscritto) data: 29/11/2017 12:00:33

    ciao

    non sapendo che celle devi controllare questa sub() controlla il range A1:B10 tanto per darti uno spunto
    come da tua desrizione , se scrivo in A1 cancella quello di B1 e viceversa
    da inserire nel modulo del foglio

    ciao
     
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1:B10")) Is Nothing Then Exit Sub
     Application.EnableEvents = False
    If Target.Column = 1 Then
      Cells(Target.Row, 2).ClearContents
    Else
      Cells(Target.Row, 1).ClearContents
    End If
     Application.EnableEvents = True
    End Sub
    






  • di dax.simo data: 29/11/2017 12:44:25

    le celle che devo controllare sono F54 e F62

    provo a scrivere quello che immagino faccia la routine per vedere se ho capito:

    la macro si attiva ogni volta che cambia qualcosa nel foglio (è per quello che la salviamo nel foglio)
    nella parte : If Intersect(Target, Range("A1:B10")) Is Nothing Then Exit Sub
    chiude il programma se la modifica non è avvenuta nella zona specificata

    altrimenti esegue quello che viene dopo

    If Target.Column = 1 Then
    Cells(Target.Row, 2).ClearContents
    Else
    Cells(Target.Row, 1).ClearContents
    End If

    questo pezzo di codice non lo capisco
    GRazie mille




  • di Luca73 data: 29/11/2017 12:48:05

    Ciao dax.simo
    la soluzione più semplice è l'equivalente di quello che ti ha mostrato Mister_X (Ciao) ovvero disabilitare
    Application.EnableEvents appena dopo il sub exit e riabilitarlo alla fine.
    Inoltre bisognerebbe capire perchè hai deciso di usare due macro piccole T_MANUALE() e T_FLEX() invece di scrivere direttamente nella routine principale.
    Le richiami da qualche altra parte? e nel caso ti creano problemi?
    Ciao
    Luca






  • di dax.simo data: 29/11/2017 12:53:29

    le 2 macro le ho provate a parcheggiare in un modulo solo per test...
    lo stesso problema del loop lo avevo anche mettendo tutto nella private sub...

    mi potete spiegare il funzionamento della parte dopo il Application.EnableEvents = False

    grazie mille



  • di Mister_x (utente non iscritto) data: 29/11/2017 15:48:49

    ciao

    quindi in base ai tuoi dati

    le celle che devo controllare sono F54 e F62

    dobbiamo ribaltare la situazione e portare i controlli su F54 e F62 quindi lo riga escludendo la colonna

    PS il (Target) della cella si porta appresso tutto ( valore , formato, posizione, ecc.ecc)
    Application.EnableEvents vedi help cosa fa

    la sub quindi modificata e' cosi'

    ciao


     
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("F54,F62")) Is Nothing Then Exit Sub
     Application.EnableEvents = False
    If Target.Row = 54 Then
      Cells(62, Target.Column).ClearContents
    Else
      Cells(54, Target.Column).ClearContents
    End If
     Application.EnableEvents = True
    End Sub






  • di dax.simo data: 07/12/2017 08:59:02

    Ciao,

    riprendo il post per chiedervi un suggerimento.
    nel file che sto utilizzando (dove ho inserito la macro che mi avete suggerito)
    era presente nel foglio "Questa cartella di lavoro" la macro che vi allego

    in alcuni casi (copiando dati o scrivendo certe celle in diversi fogli) mi restituisce errore 1004 metodo intersect oggetto Globale

    ho anche provato ad inserire la macro dentro il foglio di lavoro dove dovrebbe lavorare (RE) dove è presente anche quella suggerita da voi, ma col risultato che smette di funzionare

    dove sto sbagliando?
    grazie mille

     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Intersect(Target, Sheets("RE").Range("B9:K9")) Is Nothing Then Exit Sub
    Range("B12:K13").Value = ""
    End Sub
    



  • di dax.simo data: 11/12/2017 14:20:48

    Ciao a tutti,

    vorrei integrare dentro il codice allegato un altro controllo che mi pulisca il contenuto della cella B12:K13 quando varia il contenuto della cella B9:k9

    grazie mille

     
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("F54,F62")) Is Nothing Then Exit Sub
     Application.EnableEvents = False
    If Target.Row = 54 Then
      Cells(62, Target.Column).ClearContents
    Else
      Cells(54, Target.Column).ClearContents
    End If
     Application.EnableEvents = True
    End Sub