La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Buongiorno, tempo fa ho chiesto aiuto per lo stesso problema in base al valore di una cella, oggi ho la necessità di cambiare il colore in base ad una parola contenuta nella cella. Ho provato a cambiare la macro allegata, sostituendo il valore 0 con la parola ma non ottengo risultati, come potrei ovviare? Vi allego copia della macro che mi avete creato.
Grazie
rivate Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim i As Integer
For i = 5 To Sheets.Count
With ActiveSheet.Tab
If Range("J38").Value = "" Then
.Color = vbWhite
ElseIf Range("J38").Value = 0 Then
.Color = vbRed
ElseIf Range("J38").Value < 0 Then
.Color = vbYellow
ElseIf Range("J38").Value > 0 Then
.Color = vbGreen
End If
End With
Next i
End Sub
Mah, non faccio mai questo tipo di cose. Ma una mi salta all'occhio: la prima istruzione è Private o rivate?
Nel secondo caso aggiungi P all'inizio.
Invece di usare If ElseIf End If usa le istruzioni
Select Case Range("J38").Value
Case Is = ""
fai la prima cosa
Case Is = 0
fai la seconda cosa
Case Is < 0
fai la terza cosa
Case Is > 0
fai la quarta cosa
End Select
Tutto più chiaro e leggibile. E magari funziona pure.
@emme perdonami, forse non mi sono spiegato io. La macro allegata è quella che uso normalmente, completa della "P" e funziona correttamente. Io volevo fare in modo che, nel caso in cui nella cella compaia una parola, cambi il colore della linguetta. "Bovinamente" ho sostituito lo 0 con la parola che deve far cambiare il colore ma, non sono riuscito, perchè, sicuramente, sbaglio in qualche cosa. La "P" manca per mancanza di attenzione nella fase di copia e incolla su questo forum.
Grazie
Sostituisci a 0 la parola che vuoi testare. 0 o testo il ciclo Select Case / Case Is = / End Select è sicuramente più chiaro e con migliori prestazioni rispetto a If / Else If / End If. Inoltre non c'è limite al numero di comparazioni che si possono effettuare. Chiaramente se non è un numero le istruzioni > o < non hanno molto senso.
@emme praticamente, se ho capito bene
Private Sub Workbook_Sheetchange (ByVal sh As Object, ByVal target As Range)
Dim i As Integer
For i = (nr. fg da cui iniziare) to Sheets.Count
With ActiveSheet.Tab
Select Case Range ("___").Value
Case Is = (parola codice)
.Color = (colore)
Case Is = (parola codice)
.Color = (colore)
Case Is = (parola codice)
.Color = (colore)
Case Is = (parola codice)
.Color = (colore)
End Select
End With
Next i
End Sub
Se è corretto, cambia colore delle linguette solo in rosso, cambiando la parola codice resta invariato il rosso.
Corretto, a patto ovviamente che Range punti sempre alla stessa cella in ogni foglio (es.: sempre B14)
Allego il file a cui faccio riferimento, lo utilizzo per altre attività, i fogli vanno da un minimo di 10 ad un max di 355, perciò il colore è necessario per andare a colpo sicuro. Quello che vorrei è che andando a variare lo stato della pratica nel foglio "quaderno", lo stato viene copiato sul foglio di riferimento (quaderno foglio 1 = foglio 1 del file) e di conseguenza cambi il colore della linguetta in base al valore (parola) inserito. Con la macro da te fornita, sicuramente sbaglio io in qualcosa, la inserisco su "questa cartella di lavoro" e non cambia il colore della linguetta. O meglio, cambia il colore della linguetta del foglio "quaderno" che deve restare invariata. Dove sbaglio?
Grazie
Appena posso darò un'occhiata al progetto.
Ciao a tutti,
Hai allegato il file ma non hai spiegato esattamente quello che vuoi ottenere...
Nel codice trovato in "Questa_cartella_di_lavoro" perchè utilizzi il ciclo For...Next per tutti i fogli se poi non utilizzi la variabile i ???
Se vuoi che in ogni foglio, modificando la cella P1, vari anche il colore del "tab" del foglio:
Private Sub workbook_sheetChange(ByVal sh As Object, ByVal target As Range) If Not Intersect(target, Range("P1")) Is Nothing Then With ActiveSheet.Tab Select Case Range("P1").Value Case "VERIFICARE" .Color = vbRed Case "in FIRMA" .Color = vbYellow Case "CONCLUSA" .Color = vbGreen Case "stanza VUOTA" .Color = vbgrey Case Else .Color = vbWhite End Select End With End If End Sub
ho usato Not Intersect per non far partire il codice se non quando la cella P1 viene coinvolta.
Quando ci son varie condizioni, per una questione puramente pratica, è meglio utilizzare Select Case anziché If annidati.
Ricordati sempre di usare l'indentazione nel codice altrimenti risulta illeggibile.
Prova e nel caso facci sapere se il risultato è quello che volevi.
P.S.
in questo modo però vengono inclusi anche i primi fogli (DATI DA QUADERNO, ANAGRAFE, etc...)
sarebbe il caso di aggiungere una condizione per escludere tali fogli
Buongiorno, quello che desidero faccia è, per esempio:
- nel foglio QUADERNO, cella H1, cambio lo stato della pratica in base alla lavorazione;
- la cella H3 cambia colore (formattazione condizionale);
- il valore della cella "Quaderno H1" viene riportata nella cella P1 di ogni foglio di riferimento, in questo caso il foglio è 130-202;
il problema nasce qui, vorrei che la linguetta cambi colore in base allo stato riportato nella cella P1 del foglio stesso.
ho provato a cambiare i codici della macro che utilizzo per un altro tipo di cambio colore (in base al valore =>< di 0) ma, come hai notato non sono capace (se vai indietro di mail vedi a cosa mi riferisco)
ora ho copiato fedelmente il tuo ma, non funziona. Per quanto riguarda i fogli precedenti alle "stanze" in realtà sono 10.
Grazie
ora ho copiato fedelmente il tuo ma, non funziona.
Quello che ti ho scritto, basandomi sul codice già presente, interviene quando modifichi la cella P1 dei vari fogli.
Ma da quel che hai scritto, quello che vuoi ottenere ha tutta un'altra logica.
perché, anche se copiato dalla cella di un altro foglio, non si tratta, comunque, di una variazione di stato della cella? A me va bene come viene riportato il dato nella cella, l'unica cosa che chiedo è il cambio di colore della targhetta...
Visto che il tutto è gestito dal foglio QUADERNO, non ti serve verificare tutte le volte ogni foglio e modificare costantemente i colori... quindi niente cicli.
Puoi sfruttare l'evento Workbook_SheetActivate in modo che ogni volta che attivi un foglio (in questo caso dopo il terzo foglio, visto che ai primi tre non devi modificare il colore della tab), in base al proprio "indice" (foglio1, 2, 3, etc...) si controlli nella riga 1 del foglio QUADERNO, a partire dalla colonna H, e si verifichi quello che c'è scritto per poter modificare il colore della tab del foglio attivo.
Ho usato l'indice del foglio perchè nel foglio QUADERNO non è specificato il nome di nessun foglio ma hai invece scritto: FG1, FG2, etc...
Nel modulo di classe di "Questa_cartella_di_lavoro":
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim OriginSh As Worksheet Dim ActStatus As Variant If ActiveSheet.Index > 3 Then Set OriginSh = ThisWorkbook.Worksheets("QUADERNO") ActStatus = UCase(OriginSh.Range("H1").Offset(0, ActiveSheet.Index - 4)) Range("P1").Value = ActStatus With ActiveSheet.Tab Select Case ActStatus Case "VERIFICARE" .ColorIndex = 3 'vbRed Case "IN FIRMA" .ColorIndex = 6 'vbYellow Case "CONCLUSA" .ColorIndex = 4 'vbGreen Case "STANZA VUOTA" .ColorIndex = 16 'vbgrey Case Else .Color = 2 'vbWhite End Select End With End If End Sub
N.B.
se i colori che utilizzi son quelli "base", puoi usare .ColorIndex al posto di .Color ed usare i numeri anziché il "nome del colore", visto che non tutti i colori hanno il loro corrispettivo nome in VBA.
Quando fai confronti con delle stringhe di testo, assicurati anche che non ci siano differenze tra minuscolo e maiuscolo, per questo ho usato Ucase; in alternativa puoi specificare Option Compare Text in cima al modulo.
Se utilizzi il VBA, dovresti cercare di evitare le formule... Le formule nelle celle P1 dei vari fogli le avresti dovute modificare manualmente, mentre con il codice puoi cambiare colore alla tab ed allo stesso tempo modificare il valore della cella P1.
Ti riallego il file...
perché, anche se copiato dalla cella di un altro foglio, non si tratta, comunque, di una variazione di stato della cella?
No, l'evento scatta col foglio attivo non con la modifica di una cella di un'altro foglio tramite formula.