› Sviluppare funzionalita su Microsoft Office con VBA › colora riga in base al testo specifico
-
AutoreArticoli
-
buongiorno a tutti,
torno con un nuovo problema: ho un file, dove ho inserito i mesi dell'anno (schede gennaio...febbraio...). ho impostato che l'anno è dinamico, nel senso che se seleziono l'anno nella cella Sheets("Home").Range("B33"), cambiano i vari giorni giorni della settimana (lunedì... martedì...) nei vari mesi.
Il problema nasce adesso: vorrei che si colorassero in maniera diversa i weekend (sabato/domenica), quindi le celle sulla riga del giorno sabato e domenica (come vedete nelle schede dei vari mesi). infatti inserendo l'anno non si aggiornano.
vorrei assegnarlo alla macro che cè sulla scheda Home, Tasto per trasformare i Weekend, oppure direttamente inserendo l'anno si trasformano tutti i mesi con i weekend colorati (con un Private change)
spero che qualcuno possa aiutarmi nel mio problemino. vi ringrazio anticipatamente del vostro prezioso aiuto!
ringrazio
saluti e a presto
Marco
Allegati:
You must be logged in to view attached files.Allora, seleziona l'area dove ci sono le date, una volta selezionata l'area apri il menu Home e selezioni "formattazione Condizionale" dalla finestra che si apre selezioni"Utilizza una formula per formattare le cell selezionate" inserisci questa formula
=SE(O(GIORNO.SETTIMANA(C14)=7;GIORNO.SETTIMANA(C14)=1);VERO;FALSO)e dopo selezioni il colore che piu ti garba, quedta procedura pe tutti i fogli
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ciao
secondo me il SE non serve
basta
=O(GIORNO.SETTIMANA(C14)=7;GIORNO.SETTIMANA(C14)=1)
in quanto è una operazione booleana (OR) tra due confronti che restituiscono un valore logico (vero/falso)
oppure per semplificare ulteriormente
=GIORNO.SETTIMANA(C14;2)<6
Ciao Eccoti anche un esempio (un po' bruttino per certi aspetti)
che fa quello che chiedi.
Fammi sapere
Sub ColoraWE() Dim Vettore(1 To 12) As String Dim Index As Integer Dim Foglio As Worksheet Dim CellaW As Range For Index = 1 To 12 Vettore(Index) = Format("01/" & Index & "/2000", "mmmm") Next Index For Each Foglio In ActiveWorkbook.Sheets Foglio.Activate For Index = 1 To 12 If Foglio.Name = Vettore(Index) Then For Each CellaW In Foglio.Range(Range("C14"), Range("C14").End(xlDown)) CellaW.Select With Range(CellaW, CellaW.Offset(0, 10)).Interior If ((Right(CellaW.Text, 3) = "sab") Or (Right(CellaW.Text, 3) = "dom")) Then .Color = 14806254 Else .Pattern = xlNone End If End With Next CellaW End If Next Index Next Foglio End Subbuonasera a tutti!!
siete dei fenomeni!!! 🙂 grazie mille delle soluzioni, ho potuto provare sia quella con la formula, che quella con la macro e come sempre siete riusciti a risolvermi il problema!
vi ringrazio davvero tanto, e vi auguro una buona serata
alla prossima
Marco
CellaW.Select
E' un'istruzione inutile e rallenta l'esecuzione
Ciao
VF hai perfettamente ragione.
Le istruzioni
Foglio.Activate e CellaW.Select
vanno cancellate o commentate ( chiedo scusa per non averlo fatto)
Le avevo inserite per una mera questione di debug e verifica del programma
Ciao
Luca
Senza voler essere saccente, ma solo per condivisione dell'informazione (o per ricordarla casomai già fosse nel vostro patrimonio), ricordo che esiste già il vettore MonthName in VBA per ottenere la versione localizzata dei nomi dei mesi.
Quindi il codice
For Index = 1 To 12 Vettore(Index) = Format("01/" & Index & "/2000", "mmmm") Next Indexè validamente sostituibile con MonthName(i) dove i va da 1 a 12 e restituisce il nome esteso del mese indicato dall'indice. Per cui
MonthName(1) = "gennaio" MonthName(2) = "febbraio" e così viaCiao Questa proprio non la sapevo.
Pertanto
Sub ColoraWE() Dim Index As Integer Dim Foglio As Worksheet Dim CellaW As Range For Each Foglio In ActiveWorkbook.Sheets Foglio.Activate For Index = 1 To 12 If Foglio.Name = MonthName(Index) Then For Each CellaW In Foglio.Range(Range("C14"), Range("C14").End(xlDown)) CellaW.Select With Range(CellaW, CellaW.Offset(0, 10)).Interior If ((Right(CellaW.Text, 3) = "sab") Or (Right(CellaW.Text, 3) = "dom")) Then .Color = 14806254 Else .Pattern = xlNone End If End With Next CellaW End If Next Index Next Foglio End SubOttimo Luca allora ti invito anche a modificare
If ((Right(CellaW.Text, 3) = "sab") Or (Right(CellaW.Text, 3) = "dom")) Thenaffinché il test non venga fatto su un testo ma sul valore della cella giorno (è sabato o domenica?). Esiste una funzione apposita 🙂
Per due motivi:
- il confronto con l'uguale è troppo secco (e se invece di "sab" ci fosse "SAB" ?)
- la manipolazione di stringhe è più inefficiente del confronto con valori numerici
Sempre se hai voglia di stare dietro a queste paturnie ovviamente. Il tuo codice funziona benissimo (funzionava anche senza MonthName sia chiaro)
Ciao
Hai ragione VF,
Quando scrissi che il codice era un po' bruttino era proprio per questi aspetti...
L'ho buttato giù di corsa....
L'altro problema ' che mi hanno passato alla 2016 e non ho più l'help offline ma solo quello via internet e faccio fatica a cercare le funzioni che non conosco.
Ecco la nuova proposta.
Comunque,
Grazie
Sub ColoraWE() Dim Index As Integer Dim Foglio As Worksheet Dim CellaW As Range For Each Foglio In ActiveWorkbook.Sheets 'Foglio.Activate For Index = 1 To 12 If Foglio.Name = MonthName(Index) Then For Each CellaW In Foglio.Range(Range("C14"), Range("C14").End(xlDown)) 'CellaW.Select With Range(CellaW, CellaW.Offset(0, 10)).Interior If Weekday(CellaW, vbMonday) > 5 Then 'If ((Right(CellaW.Text, 3) = "sab") Or (Right(CellaW.Text, 3) = "dom")) Then .Color = 14806254 Else .Pattern = xlNone End If End With Next CellaW End If Next Index Next Foglio End SubCiao
Luca
Ecco la nuova proposta.
Più compatta e più leggibile 🙂
non ho più l'help offline
Anch'io sulla versione 2013 soffro di questo problema. Quando non mi va internet è proprio il momento in cui mi serve l'help 🙂
-
AutoreArticoli
