Macro che seleziona una cella al verificarsi di una determinata condizione

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
Andrea Grassi
00martedì 17 maggio 2016 22:54
Salve a tutti, ho un foglio di lavoro dove testo, in base ad un criterio specifico, due serie di numeri.
La prima serie viene inserita nella colonna A, questa viene controllata tramite delle funzioni e, se si verifica una condizione favorevole, la cella X41 (inizialmente settata a 0) diventa 1.
Questa cella funziona come un interruttore e può assumere i valori:
0 = nessuna condizione verificata
1= una condizione favorevole verificata
2 = più di una condizione verificata / errore, nel sistema che utilizzo non è accettato il verificarsi di più condizioni favorevoli contemporaneamente, quindi bisogna cancellare i dati nella colonna A e inserirne dei nuovi.

La seconda serie di numeri viene inserita nella Colonna B a partire dalla riga 2, questa, tramite un' altro criterio specifico, viene analizzata e restituisce un risultato finale

Detto questo, per fare un po una panoramica di quello che utilizzo, mi servirebbe creare una macro sempre attiva sul foglio che nel momento in cui la cella X41 assume il valore 1, deve selezionarsi la cella B2.

Ho provato a scrivere la macro, ma non avendo nessuna base di VBA mi sono un po arrangiato con quello che ho trovato in rete, e alla fine ci sono riuscito con questo codice:


Private Sub Worksheet_Change(ByVal Target As Range)

controllo = Foglio1.Cells(41, 24).Value
If controllo = 1 Then
Range("B2").Select
End If

End Sub


Mi andrebbe bene se non fosse per il fatto che la cella X41 continua ad essere sempre settata ad 1 per tutto il controllo della serie 2, ovvero quella inserita nella colonna B, questo perchè i numeri inseriti nella colonna A continuano ad essere presenti e generano una condizione favorevole, quindi dopo aver inserito il primo numero nella cella B2 e premendo INVIO la selezione dovrebbe passare alla cella B3, ma ciò non accade perchè X41 è ancora settato a 1 e quindi la selezione torna su B2.

La domanda è: c'è un modo per disattivare la macro nel momento in cui si è verificata?
Oppure c'è un modo per farla riattivare al successivo cambiamento della cella X41?
es.:
X41 = 0
si verifica la condizione favorevole tramite i numeri inseriti nella colonna A e X41 = 1
La macro si attiva, seleziona la cella B2 e poi si disattiva
La macro si riattiverà nel momento in cui avviene il prossimo cambiamento di X41 = 0

Considerate che una volta ricevuto l'esito finale dal controllo della seconda serie di numeri, ho una macro che mi cancella tutti i numeri inseriti nella colonna A e nella colonna B e di conseguenza il valore di X41 torna a 0

Ringrazio anticipatamente
patel45
00mercoledì 18 maggio 2016 07:52
la macro che hai scritto entra in funzione per qualsiasi cambiamento di qualsiasi cella, puoi invece controllare l'indirizzo della cella o delle celle
Private Sub Worksheet_Change(ByVal Target As Range)
if target.address = "$X$41" or altra condizione then
  controllo = Foglio1.Cells(41, 24).Value
  If controllo = 1 Then
    Range("B2").Select
  End If
end if
End Sub 
Andrea Grassi
00mercoledì 18 maggio 2016 11:28
Grazie patel45 per avermi risposto, ho provato il codice che mi hai suggerito ma non gira, la funzione target.address = "$X$41" non risente del cambiamento della cella X41.
Ho provato a scrivere questo codice per verificare, ed effettivamente non succede nulla:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$X$41" Then 'or altra condizione
MsgBox "OK, FUNZIONA!"
'controllo = Foglio1.Cells(41, 24).Value
'If controllo = 1 Then
' Range("B2").Select
' End If
End If
End Sub

Suggerimenti?
Andrea Grassi
00mercoledì 18 maggio 2016 11:40
Facendo alcune prove, ho notato che la funzione target.address non tiene conto dei cambiamenti che avvengono nella cella di riferimento tramite la formula che la cella stessa contiene.

es.
X41 = somma (A1:A10)

se la cella X41 cambia perchè sono stati inseriti dei numeri nel range A1:A10 la funzione target.address non ne tiene conto.

Se la variazione della cella X41 avviene manualmente la funzione rileva il cambiamento correttamente.

Idee?
patel45
00mercoledì 18 maggio 2016 12:40
Re:
If target.address = "$X$41" then serve soltanto a uscire dalla sub se il cambiamento interessa un'altra cella.
L'evento change si verifica soltanto in caso di modifica manuale, nel tuo caso devi provare l'evento Calculate
Andrea Grassi
00mercoledì 18 maggio 2016 15:01
non avendo basi di VBA mi risulta difficile provare calculate, qualcuno può aiutarmi?

Avrei in parte ovviato con questo codice che mi seleziona sempre la prima cella libera nella colonna B, rimane sempre il fatto che la la macro fintanto che X41 resta settato a 1 rimane attiva

Private Sub Worksheet_Change(ByVal Target As Range)

lr1 = Foglio1.Cells(Rows.Count, "B").End(xlUp).Row + 1
controllo = Foglio1.Cells(41, 24).Value
If controllo = 1 Then
Foglio1.Range("B" & lr1).Select
End If

End Sub

patel45
00mercoledì 18 maggio 2016 17:02
allega un file di esempio con anche la descrizione di cosa vuoi ottenere
Andrea Grassi
00giovedì 19 maggio 2016 00:46
Ho scritto tutto nell'allegato
patel45
00giovedì 19 maggio 2016 09:32
troppo contorto per me
Andrea Grassi
00domenica 22 maggio 2016 00:21
contorto? mah.. sarà!
Comunque ho risolto arrangiandomi con variabile aggiuntiva.

Grazie comunque
federico460
00lunedì 23 maggio 2016 09:35
ciao Andrea

condividere è il nostro modo di operare [SM=g27823]

questa è la macro che intercetta il cambiamento del valore cella anche da formula.


Dim oldE2
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E2").Precedents) Is Nothing And _
Range("E2").Value <> oldE2 Then
lr1 = Foglio1.Cells(Rows.Count, "B").End(xlUp).Row + 1
controllo = Foglio1.Cells(2, 5).Value
If controllo = 1 Then
Foglio1.Range("B" & lr1).Select
End If
oldE2 = Range("E2").Value
End If
End Sub



e in allegato il file

contorto? mah.. sarà!
Comunque ho risolto arrangiandomi con variabile aggiuntiva.

Grazie comunque



se avevi la risposta dovevi condividerla

pazienza ciao [SM=x423030]


Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 00:52.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com