Condividi:        

fermare macro a condizione

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

fermare macro a condizione

Postdi miko » 28/02/13 21:59

salve,
vorrei fermare una macro, chiamiamola TROVA, quando si verifica una condizione;
supponiamo di avere 100 righe, e di voler trovare un numero, ad esempio 325, nel range "G3:L103";
partendo dalla prima riga utile, la 3, cerco il numero 325;
supponiamo che si trovi alla riga 5;
memorizzo questo numero di riga: irows=5;
continuiamo con la ricerca dello stesso numero nelle righe successive;
supponiamo che successivamente il numero 325 si trovi alla riga 20;
memorizziamo anche questo numero di riga: frows=20
a questo punto fermiamo la macro TROVA in quanto deve intervenire una
altra macro che deve agire dalla riga 6 alla 20 nel range "G6:L20".
ho realizzato questa semplice macro:
Codice: Seleziona tutto
Sub TROVA()
Dim RNG As Range
Dim wk As Workbook
Dim sh1 As Worksheet

Set wk = ThisWorkbook
With wk
Set sh1 = .Worksheets("Foglio1")
End With
sh1.Select
UR = Worksheets("Foglio1").Range("G" & Rows.Count).End(xlUp).Row
Worksheets("Foglio1").Range("G3:L" & UR).Interior.ColorIndex = xlNone
PR = 3
Set RNG = Worksheets("Foglio1").Range("G" & PR & ":L" & UR)
NUM = 325
For Each C In RNG
If C.Value = NUM Then
C.Interior.ColorIndex = 3
End If
Next C
Range("A2").Select
End Sub

è evidente che la macro continua la ricerca del numero fino alla fine del range.
come faccio a fermare la macro quando trova per la seconda volta lo stesso numero?
devo poi memorizzare, come detto in precedenza, i numeri di riga dove si trovano
i numeri cercati poichè tali numeri di riga verranno utilizzati dalla seconda macro.
a questo proposito ho pensato alla cell.address ma non sono riuscito a risolvere il problema.
grazie e saluti
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: fermare macro a condizione

Postdi Flash30005 » 28/02/13 22:19

Potresti usare un Conteggio con una variabile che inizializzi all'inzio (Conta = 0)
Poi al verificarsi dell'evento assumerai
conta = conta + 1
e inserisci la condizione se Conta > 2 the Exit For

Penso che con questo spunto risolvi da solo
se non è così posta ancora

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 28/02/13 22:48

salve,
grazie Flash il tuo suggerimento è stato molto utile;
ho risolto il primo problema in questo modo:
Codice: Seleziona tutto
.....
Conta = 0
For Each C In RNG
If C.Value = NUM Then
C.Interior.ColorIndex = 3
Conta = Conta + 1
End If
If Conta > 1 Then Exit For
Next C
.....

ho solo modificato il numero dell' Exit For, valido nel mio caso.
la macro funziona
per il secondo problema come posso determinare e memorizzare i numeri di riga dove si trovano i numeri cercati?
questi numeri devo "trasportarli" in una altra macro.
ciao e grazie ancora
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi miko » 01/03/13 12:15

buongiorno a tutti,
facendo ricerche ho trovato queste due righe di codice
per determinare il numero di riga di una data cella:
Codice: Seleziona tutto
riga = ActiveCell.Row
MsgBox riga

in questo caso fornisce il numero di riga della cella attiva.
ho provato a sostituire con questa:
Codice: Seleziona tutto
riga = Cells.Interior.ColorIndex.Row

ma naturalmente ho errore.
sto cercando di determinare il numero di riga di una particolare cella,
ad esempio quando essa assume un colore, e non quando essa è attiva.
non trovo altro in internet;
forse sarebbe meglio un diverso tipo di approccio al problema per una sua soluzione,
ad esempio quando la cella contiene un preciso valore?
grazie anticipatamente per i vostri suggerimenti.
ciao
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi Flash30005 » 01/03/13 12:38

Se i colori delle celle non dipendono da una formattazione condizionale
allora puoi scansionare le celle con una macro e inserire la condizione
If cells(RR,CC).Interior.ColorIndex <> xlnone then
(xlnone significa nessun colore)
altrimenti se hai già dei colori prestabiliti la condizione sarà
If cells(RR,CC).Interior.ColorIndex = 3 then (3 è il colore rosso)

ciao

La scansione può essere effettuata anche con for each cell in "range", vedi l'help della funzione "For Each"
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 01/03/13 12:55

ciao,
avevo già realizzato una macro secondo le tue ultime indicazioni:
Codice: Seleziona tutto
Set RNG = Worksheets("ARCHIVIO").Range("G" & PR & ":L" & UR)
For Each c In RNG
If c.Interior.ColorIndex = 3 Then  '<<<<<<<<<<<<
c.Select
riga = ActiveCell.Row
MsgBox riga
End If
Next c

la cui linea evidenziata e simile a quelle da te suggerite.
quello che non riesco ad ottenere e:
memorizzare la prima riga in cui si trova la prima cella colorata:
ad esempio, riga iniziale = rigai=3
successivamente la macro deve trovare la seconda cella colorata e memorizzare il suo numero di riga:
ad esempio, riga finale= rigaf=10
quindi la macro si ferma.
sto provando varie linee di codice ma inutilmente.
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi Flash30005 » 01/03/13 13:17

Allora...
dimensiona un vettore
che acquisirà la/le righe che occorrono
esempio
Codice: Seleziona tutto
Conta = 0
Dim VC(2) As Integer
Set RNG = Range("G" & PR & ":L" & UR)
For Each C In RNG
If C.Interior.ColorIndex = 3 Then  '<<<<<<<<<<<<
Conta = Conta + 1
If Conta > 2 Then Exit For
VC(Conta) = C.Row
End If
Next C
'....
For CV = 1 To 2
MsgBox VC(CV)
Next CV

Come vedi il messggio box ti fornisce le due righe memorizzate "fuori dalla routine principale
Inoltre non è necessario fare la select cella cella per usare l'activecell ma puoi mettere direttamente C.row che ti fornisce il numero riga

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 01/03/13 17:36

buonasera,
ho provato la macro, ed ovviamente funziona.
ho notato però, facendo variare la seconda cella colorata,
una decina di righe di distanza tra una cella e l'altra
che impiega un pò di tempo per l'elaborazione.
come si potrebbe velocizzare il calcolo?
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi Flash30005 » 01/03/13 21:04

Non dipende certo dal vettore
semmai dal numero di celle che devi controllare
se aumenti n righe considera che devi moltiplicare per 6 il tempo in quanto hai 6 colonne (da G a L)
ma in ogni caso non dovrebbe essere un tempo lunghissimo

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 01/03/13 22:55

buonasera,
..in ogni caso non dovrebbe essere un tempo lunghissimo

in effetti hai ragione, la macro è velocissima;
ho commesso un errore di distrazione:
ho dimenticato di assegnare un valore alle due variabili
PR ed UR nella linea:
Codice: Seleziona tutto
...
Set RNG = Range("G" & PR & ":L" & UR)
...

perciò la macro anche se funzionante impiegava qualche attimo in più
per terminare l'elaborazione.
scusatemi per la inutile richiesta.
per completare l'argomento di questo post mi sono chiesto se è possibile,
in qualche modo, trasferire o richiamare il contenuto del vettore VC(2)
in una altra macro, ad esempio con qualcosa del tipo:
sub macro1
Dim VC(2) As Integer
...
VC(CV)
...end sub

sub macro2
vett= VC(CV) di macro1
io ho fatto in questo modo, con la macro1 ho "depositato" in due celle i valori di VC(CV),
per poi prelevarli con la macro2.
cercavo qualcosa di diverso e più "raffinato".
saluti e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi Flash30005 » 01/03/13 23:49

Rendi Public VC(2)
e togli il dimensionamento nella macro precedente
ora VC sarà disponibile in tutti i moduli
pertanto nella prima macro assumerà i valori di Vc(1) e Vc(2)
fai tutto ciò che devi fare
nella seconda macro è sufficiente che ricrei il ciclo for next da 1 a 2
per ottenere di nuovo le due variabili
come del resto avevo fatto separando con '... le due routine
per farti capire che da quel momento hai a disposizione i valori assegnati a Vc(1) e Vc(2)
rendendo public VC(2)
il gioco è fatto! :)

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 02/03/13 11:42

buon sabato a tutti,
grazie Flash per le tue ultime indicazioni;
tutto funziona perfettamente.
ho notato quanto descrivo di seguito e preciso, per chi è poco esperto di excel come me;
che se in un modulo si scrive Dim VC(2) As Integer, all'esteno delle macro,
nella sezione dichiarazioni generali, allora le due macro che coinvolgono il vettore VC(2)
devono trovarsi all' interno dello stesso modulo;
se invece nella stessa sezione generale si scrive Public VC(2) As Integer
allora le due macro possono trovarsi in moduli differenti.
credo sia corretto poichè in entrambe le situazioni tutto funziona.
saluti e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: fermare macro a condizione

Postdi Flash30005 » 02/03/13 14:27

Beh, credo che ciò segue la logica
Se dichiari VC all'interno di una macro essa sarà disponibile sempre e solo all'interno della macro ma non in un'altra macro anche se nello stesso modulo.
Dichiarandola Public è sempre disponibile in tutte le macro e moduli.
Essendo un vettore dimensionato e pubblico potrai ricavare i valori di ognuno con un for next da 1 a n (dimensione vettore: nel tuo caso 2), con una variabile creata appositamente "sul posto" come nel caso
Codice: Seleziona tutto
For CV = 1 To 2
MsgBox VC(CV)
Next CV

;)

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: fermare macro a condizione

Postdi miko » 06/03/13 18:51

buona sera a tutti,
grazie per aver sottolineato la ulteriore precisazione al riguardo
del dimensionamento e dichiarazione del vettore.
tutto funziona perfettamente.
ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "fermare macro a condizione":


Chi c’è in linea

Visitano il forum: Nessuno e 155 ospiti