PDA

Visualizza versione completa : Gestione macro da bottone


omancino
01-12-2014, 10.08.35
Avrei bisogno di creare 2 macro (da associare a bottoni) per
1- eseguire una routine che modifica lo stato di alcune celle
2- bloccarla a piacimento (con reset delle celle allo stato iniziale).

In rete non ho trovato nulla si semplice per il mio livello di conoscenza: suggerimenti?
Grazie

Alexsandra
01-12-2014, 20.25.52
cosa intendi per modifica dello stato delle celle?

colore di fondo, formattazione, dimensioni ???

omancino
02-12-2014, 10.33.47
Ho già recuperato in rete una macro che fa lampeggiare le celle in questione
Il mio problema sta' nella necessità di bloccare (da bottone) l'esecuzione di tale macro e "resettare" il formato delle celle alla condizione iniziale.
Banalizzando, riesco ad attivare la macro senza problemi, ma non riesco a fermarla...:dntknw:
La macro in oggetto è:

Sub lampo()
Static FLASH As Boolean
Dim DELTAt As Date
DELTAt = "00:00:01"
CELLA = "A1"
FOGLIO = "Foglio1"
For I = 3 To 100
If Cells(I, 10).Value <> "" And Cells(I, 10).Value >= 31 Then
Select Case FLASH
Case True
Sheets(FOGLIO).Cells(I, 3).Interior.Color = RGB(255, 200, 210) 'ROSSO CHIARO
Case Else
Sheets(FOGLIO).Cells(I, 3).Interior.Color = RGB(255, 0, 0) 'ROSSO
End Select
Else
Cells(I, 3).Interior.ColorIndex = xlNone 'Nessun colore
End If
Next
FLASH = Not (FLASH)
Application.OnTime Now + TimeValue(DELTAt), "lampo"
End Sub

Alexsandra
03-12-2014, 00.52.33
con quel codice io non vedo niente.
se tu vuoi far lampeggiare la data nella cella A1 del foglio attivo puoi fare così

Per avviare il lampeggio associ a un pulsante la macro Inizia e per fermarla associ all'altro pulsante la macro ferma. questo il codice completo

Dim colore As Integer, flag As Boolean

Sub inizia()
colore = 0
flag = True
tempo
End Sub

Sub Lampeggio()
If flag = True Then
Sheets("foglio1").Range("A1") = Now
Sheets("foglio1").Range("A1").Font.Color = RGB(255, colore, colore)
cambiaC
tempo
Else
End If
End Sub

Function tempo()
Application.OnTime Now + 0.000006, "Lampeggio"
End Function

Sub ferma()
flag = False
End Sub

Public Sub cambiaC()
colore = 200 - colore
End Sub

omancino
03-12-2014, 17.55.44
Alexandra, la tua soluzione è efficace, ma non riesco ad adeguarla alla mia macro. In particolar modo, non riesco ad integrare il ciclo For I = 3 To 100
If Cells(I, 10).Value <> ..... che è fondamentale per il mio lavoro.
Continuo a provarci, ma non ne vengo a capo:wall:

Alexsandra
03-12-2014, 21.47.09
dal tuo codice si vede che scorri le righe a partire dalla riga 3 fino alla riga 100 con un ciclo For e se nella colonna 10 della riga processata c'è un valore maggiore o uguale a 31 allora vuoi far lampeggiare data e ora nella cella della stessa riga ma alla colonna 3

C'è un qualche problema, in quanto mentre stai eseguendo il ciclo For non riesci a far lampeggiare il dato inserito in quanto il lampeggio è un continuo scambio tra routine sfruttando l'effetto del cambiamento di colore in un breve intervallo di tempo.

La soluzione potrebbe essere di far eseguire PRIMA il ciclo For e inserire nella colonna 3 la data per i valori maggiori o uguali a 31 rilevati nella colonna 10 e successivamente prendere tutto il range e farlo lampeggiare. Ovviamente se nella colonna 10 si trova un valore inferiore a 31 non viene trascritto niente nella colonna 3

Una soluzione come questa è soddisfacente per le tue esigenze??

omancino
04-12-2014, 13.19.21
Alexandra grazie per l'attenzione e la pazienza. Provo a spiegarmi meglio: la macro dovrebbe verificare il contenuto di un campo calcolato (differenza tra campo data pre-inserito e un altro in cui viene inserita la data odierna (tramite funzione OGGI)). Se tale valore supera i 31 gg, deve lampeggiare la sola cella a colonna 3 che GIA' contiene un identificativo della transazione "scaduta".
A tutto questo, dovrei aggiungere una macro (ed associarci un bottone) che mi consenta di eliminare il lampeggiamento dopo avere verificato quanto mi serviva.
Ti allego un file con esempio dove la macro di lampeggiamento funziona ma non riesco a disattivarla e le celle lampeggianti rimangono colorate "fisse" ad una successiva riapertura.

Alexsandra
04-12-2014, 21.58.30
guardo il codice :)

Alexsandra
05-12-2014, 00.41.02
prova a vedere se va bene così. questo il codice

Dim colore As Integer, flag As Boolean

Sub Lampeggio()
For i = 3 To 10
If Cells(i, 10).Value > 31 Then
Sheets("foglio1").Cells(i, 3).Interior.Color = RGB(255, colore, colore)
End If
Next
If flag = True Then
cambiaC
tempo
Else
End If
End Sub

Sub init()
colore = 30
flag = True
tempo
End Sub

Function tempo()
Application.OnTime Now + 0.000006, "Lampeggio"
End Function

Sub cambiaC()
colore = 218 - colore
End Sub

Sub ferma()
flag = False
End Sub


parti con la sub init che associ al pulsante, mentre per stoppare assegni ad altro pulsante la macro ferma

omancino
05-12-2014, 15.43.27
Praticamente perfetto. Un ultimo dettaglio: volendo "ripulire" le celle colorate prima di uscire dal file ho utilizzato le seguenti istruzioni:

Sub Cancella()
For i = 3 To 100
Sheets("foglio1").Cells(i, 3).ClearFormats
Next
End Sub

Che ne pensi?
Grazie infinite! :act::Oh-yea:

P.S. una curiosità: a cosa serve esattamente l'istruzione
colore = 218 - colore
e perché hai impostato colore=30 nella routine di init?

Alexsandra
05-12-2014, 22.17.37
dato che stai operando con il foglio attivo e sai qual'è l'intervallo potresti semplificare con

ActiveSheet.Range("C3:C100").ClearFormats

Per creare l'effetto del lampeggio si deve cambiare colore alle celle in un breve lasso di tempo, infatti c'è una continua chiamata tra due routine (tempo e Lampeggio), mentre con la routine cambiaC si cambia il colore. per cui nella sub di partenza (init) viene fissato il valore della variabile colore a 0

e con l'istruzione ....= RGB(255, colore, colore) fissiamo il colore delle celle, e questa istruzione inserendo il valore della variabile colore la possiamo anche scrivere = RGB(255, 0, 0), che è il codice esadecimale del colore rosso e nella routine cambiaC viene eseguito un calcolo matematico, essendo il valore di colore = a 0, l'istruzione colore = 218 - colore può essere scritta anche come colore = 218 - 0, per cui si ottiene colore = 218

quando la routine tempo riporta il flusso del programma nella routine Lampeggio la variabile colore diventa = RGB(255,218,218) che è il codice esadecimale del rosso chiaro. in pratica nella routine init fissi il tipo di colore che vuoi usare (rosso, verde giallo etc.) inserendo il corrispettivo numerico del colore (0-1-3 etc.) e nella routine cambiaC inserisci il secondo valore del codice esadecimale che scegli come secondo colore

RunDLL
07-12-2014, 02.43.12
La programmazione non è una cosa banale.

omancino
09-12-2014, 09.54.26
@alexsandra (questa volta ho scritto bene il tuo nickname..:() Grazie per l'efficacia delle soluzioni e il dettaglio delle spiegazioni.:act:
@RunDLL hai perfettamente ragione, per questo sto' cercando il salto di qualità dal mero utilizzo delle funzioni standard di Excel alla programmazione.
:Oh-yea:

Alexsandra
09-12-2014, 21.29.57
.... sto' cercando il salto di qualità dal mero utilizzo delle funzioni standard di Excel alla programmazione.
:Oh-yea:

non so se hai visto, ma nella sezione guide c'è un corso con molti argomenti, magari ti può aiutare con certi comandi o situazioni che si possono verificare http://forum.wintricks.it/showthread.php?t=155252

se scorri verso il fondo c'è anche un programma completo, guardati il codice.

omancino
10-12-2014, 10.48.49
Grazie!