|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, premetto che so perfettamente di annegare in un bicchiere d'acqua, ma nonostante stia lavorando intorno a questa macro (vista nel 3d http://forum.aiutamici.com/yaf_postst91753_Excel-2007-Macro-per-rilevare-colonne-particolari.aspx) Sub Vuote12() ur = Range("a" & Rows.Count).End(xlUp).Row Ntab = Int(ur / 25) riga = 5 ctr = False For n = 1 To Ntab Set area = Cells(riga, 36).CurrentRegion colTab = area.Columns.Count + 35 If area.Rows.Count >= 14 Then For y = 36 To colTab Utab = Cells(riga + 23, y).End(xlUp).Row Set areatab = Range(Cells(riga + 1, y), Cells(riga + area.Rows.Count - 2, y)) areatab.Select For Each cl In areatab If cl.Value = "" Then cont = cont + 1 ctr = True Else ctr = False End If If ctr = True And Utab = riga And cont >= 12 Then areatab.Interior.ColorIndex = 3 End If If Not ctr Then If cont >= 12 Then Range(Cells(cl.Row - 1, cl.Column), Cells(cl.Row - 1 - (cont - 1), cl.Column)).Interior.ColorIndex = 3 cont = 0 Else: cont = 0 End If End If Next cl cont = 0 Set areatab = Nothing Next y End If riga = riga + 25 Set area = Nothing Next n End Subnon riesco ad adattarla alla mia attuale esigenza, che peraltro è assai più semplice... e di questo mi vergogno ( SIGH!!) Le specifiche sono (vedi QUESTO esempio): - deve lavorare in >=9 anziché >=12 - i 2 range (di altezza variabile) da scansionare interessano solo le colonne da X a AB (1^tabellina) e da AH a AL (2^tabellina), partendo da riga 2 - le tabelle sono sempre solo 2 (come nell'esempio, a variare è solo l'altezza e non la larghezza) Grazie assai, buon pomeriggio eZio
|
|
|
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve prova con questa: Sub Vuote9() ur = Range("a" & Rows.Count).End(xlUp).Row riga = 2 col = 24 ctr = False For n = 1 To 2 Set area = Cells(riga, col).CurrentRegion Set area = area.Offset(1, 1).Resize(area.Rows.Count - 1, area.Columns.Count - 2) coltab = col + area.Columns.Count - 1 If area.Rows.Count >= 9 Then For y = col To coltab Utab = Cells(Rows.Count, y).End(xlUp).Row Set areatab = Range(Cells(riga, y), Cells(area.Rows.Count + 1, y)) areatab.Select For Each cl In areatab If cl.Value = "" Then cont = cont + 1 ctr = True Else ctr = False End If If ctr = True And Utab = riga And cont >= 9 Then areatab.Interior.ColorIndex = 3 End If If Not ctr Then If cont >= 9 Then Range(Cells(cl.Row - 1, cl.Column), Cells(cl.Row - 1 - (cont - 1), cl.Column)).Interior.ColorIndex = 3 cont = 0 Else: cont = 0 End If End If Next cl cont = 0 Set areatab = Nothing Next y End If col = col + 9 Set area = Nothing Next n End Sub saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, innanzi tutto Grazie per le tue lodevoli rapidità ed attenzione. Da solo, credo che sia evidente confrontando le macro, non ce l'avrei MAI fatta a riscriverla. Ho provato la Sub che non restituisce errore, ma non colora di rosso la colonna >=9 che NON ha celle colorate. Usando l'esempio: -ho una coppia di tabelle in cui in col.Z vi sono 9 celle NON colorate (Z2:Z10), ma non vengono colorate di rosso; -in un'altra coppia di tabelle (di h.totale 14 righe, da riga 2 a 15) in col.AA vi sono 9 celle NON colorate (AA2:AA10), ma non vengono colorate di rosso. Non riesco a capirne il motivo (se vi fosse qualche errore dovuto a incongruenze verrebbe segnalato...). Ho corretto l'istruzione col = col + 9 prima di Set area = Nothing peché lavorava solo fino a col.AK anziché AL. Grazie assai, buon pomeriggio eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, innanzi tutto Grazie per le tue lodevoli rapidità ed attenzione. Da solo, credo che sia evidente confrontando le macro, non ce l'avrei MAI fatta a riscriverla. Ho provato la Sub che non restituisce errore, ma non colora di rosso la colonna >=9 che NON ha celle colorate. Usando l'esempio: -ho una coppia di tabelle in cui in col.Z vi sono 9 celle NON colorate (Z2:Z10), ma non vengono colorate di rosso; -in un'altra coppia di tabelle (di h.totale 14 righe, da riga 2 a 15) in col.AA vi sono 9 celle NON colorate (AA2:AA10), ma non vengono colorate di rosso. Non riesco a capirne il motivo (se vi fosse qualche errore dovuto a incongruenze verrebbe segnalato...). Ho corretto l'istruzione col = col + 9 prima di Set area = Nothing peché lavorava solo fino a col.AK anziché AL. Grazie assai, buon pomeriggio eZio salve noin funziona perchè la macro cerca celle vuote non celle colorate. Non mi pare di aver lettto di questo diverso particolare. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto: noin funziona perchè la macro cerca celle vuote non celle colorate. Non mi pare di aver lettto di questo diverso particolare.
è corretto, cerca celle in colonna NON colorate (h >=9), se le trova colora la porzione di colonna interessata di rosso. Forse prima mi sono espresso male io: nella coppia di tabelle c'è una colonna di 9 celle vuote (Z2:Z10), ma la macro non le colora. Confermo che la sub lavora fino alla fine, ma non colora. Grazie assai, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve nelll'immagine che hai postato il range z2:z10 non mi pare vuoto. forse mi sfugge qualcosa. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve se il range Z2:Z9 (tutte le righe della colonna della tabella) fosse vuoto, dovrai modificare questa riga: If ctr = True And Utab = riga And cont >= 9 Then in If ctr = True And Utab = riga - 1 And cont >= 9 Then saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, a10n11 ha scritto: se il range Z2:Z9 (tutte le righe della colonna della tabella) fosse vuoto, dovrai modificare questa riga: If ctr = True And Utab = riga And cont >= 9 Then in If ctr = True And Utab = riga - 1 And cont >= 9 Then
sostituito ;-)) E' una condizione che si può presentare. In questo ESEMPIO il foglio dopo il lavoro della macro: in col.Z ci sono 9 celle bianche (Z2:Z10), ma non sono state evidenziate di rosso. Grazie assai, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Ciao, a10n11 ha scritto: se il range Z2:Z9 (tutte le righe della colonna della tabella) fosse vuoto, dovrai modificare questa riga: If ctr = True And Utab = riga And cont >= 9 Then in If ctr = True And Utab = riga - 1 And cont >= 9 Then
sostituito ;-)) E' una condizione che si può presentare. In questo ESEMPIO il foglio dopo il lavoro della macro: in col.Z ci sono 9 celle bianche (Z2:Z10), ma non sono state evidenziate di rosso. Grazie assai, eZio Salve il problema è di interpretazione. Per me celle vuote si intendeva celle senza alcun valore, tu intendevi celle senza colore. questa dovrebbe essere la macro salvo ulteriori fraintendimenti. Sub NonColorate9() riga = 2 col = 24 ctr = False For n = 1 To 2 Set area = Cells(riga, col).CurrentRegion Set area = area.Offset(1, 1).Resize(area.Rows.Count - 1, area.Columns.Count - 2) coltab = col + area.Columns.Count - 1 If area.Rows.Count >= 9 Then For y = col To coltab Utab = Cells(Rows.Count, y).End(xlUp).Row Set areatab = Range(Cells(riga, y), Cells(area.Rows.Count + 1, y)) For Each cl In areatab If cl.Interior.ColorIndex = xlNone Then cont = cont + 1 ctr = True Else ctr = False End If If ctr = True And cl.Row = Utab And cont >= 9 Then Range(Cells(cl.Row, cl.Column), Cells(cl.Row - (cont - 1), cl.Column)).Interior.ColorIndex = 3 End If If ctr = True And Utab = riga - 1 And cont >= 9 Then areatab.Interior.ColorIndex = 3 End If If Not ctr Then If cont >= 9 Then Range(Cells(cl.Row - 1, cl.Column), Cells(cl.Row - 1 - (cont - 1), cl.Column)).Interior.ColorIndex = 3 cont = 0 Else: cont = 0 End If End If Next cl cont = 0 Set areatab = Nothing Next y End If col = col + 10 Set area = Nothing Next n End Sub saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, ora funziona ;-))
Precisazione, doverosa anche se evidente: i tuoi "fraintendimenti" sono, in realtà, nella loro totalità mie "inesattezze", dovute principalmente al fatto che l'universo in cui sono immerso è assai complesso, spesso rasente alla singolarità, quindi difficilmente comprensibile. Il fatto che nonostante queste caratteristiche tu riesca sempre a risolvere i miei problemi la dice assai più lunga di qualsiasi esposizione... In effetti c'è stato un passaggio che, nonostante gli esempi visivi, ha dato origine all'equivoco. Me ne scuso e chiedo venia. Sei il migliore in assoluto. Grazie infinite, buona serata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, sto "cercando di studiare" la bellissima macro, che per comodità di lettura riporto
Sub NonColorate9() riga = 2 col = 24 ctr = False For n = 1 To 2 Set area = Cells(riga, col).CurrentRegion Set area = area.Offset(1, 1).Resize(area.Rows.Count - 1, area.Columns.Count - 2) coltab = col + area.Columns.Count - 1 If area.Rows.Count >= 9 Then For y = col To coltab Utab = Cells(Rows.Count, y).End(xlUp).Row Set areatab = Range(Cells(riga, y), Cells(area.Rows.Count + 1, y)) For Each cl In areatab If cl.Interior.ColorIndex = xlNone Then cont = cont + 1 ctr = True Else ctr = False End If If ctr = True And cl.Row = Utab And cont >= 9 Then Range(Cells(cl.Row, cl.Column), Cells(cl.Row - (cont - 1), cl.Column)).Interior.ColorIndex = 3 End If If ctr = True And Utab = riga - 1 And cont >= 9 Then areatab.Interior.ColorIndex = 3 End If If Not ctr Then If cont >= 9 Then Range(Cells(cl.Row - 1, cl.Column), Cells(cl.Row - 1 - (cont - 1), cl.Column)).Interior.ColorIndex = 3 cont = 0 Else: cont = 0 End If End If Next cl cont = 0 Set areatab = Nothing Next y End If col = col + 10 Set area = Nothing Next n End Sub
Supponendo di dovere dare un range definito in altezza (numero di righe, es.da riga 2 a 21), quali variazioni dovrei apportare alle istruzioni della macro? Si riuscirebbe a mantenere quell'impianto compositivo oppure la macro andrebbe riscritta in toto? A intuito credo che il "centro di massa" del lavoro della macro siano le righe Set area = Cells(riga, col).CurrentRegion Set area = area.Offset(1, 1).Resize(area.Rows.Count - 1, area.Columns.Count - 2) Set areatab = Range(Cells(riga, y), Cells(area.Rows.Count + 1, y)) ma non so proprio come anbrebbero riscritte in modo esatto (il VBa non ammette ragionamenti a spanne)
Grazie assai, buona giornata eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
Salve Avendo un range definito le cose si semplificano. vedi come viene modificata la macro. Sub NonColorate9Mod() riga = 2 col = 24 ctr = False For n = 1 To 2 Set area = Range(Cells(riga, col), Cells(21, col + 4)) For y = col To col + 4 Set areatab = Range(Cells(riga, y), Cells(21, y)) For Each cl In areatab If cl.Interior.ColorIndex = xlNone Then cont = cont + 1 ctr = True Else ctr = False End If If ctr = True And cont >= 9 Then Range(Cells(cl.Row, cl.Column), Cells(cl.Row - (cont - 1), cl.Column)).Interior.ColorIndex = 3 End If If Not ctr Then If cont >= 9 Then Range(Cells(cl.Row - 1, cl.Column), Cells(cl.Row - 1 - (cont - 1), cl.Column)).Interior.ColorIndex = 3 cont = 0 Else: cont = 0 End If End If Next cl cont = 0 Set areatab = Nothing Next y col = col + 10 Set area = Nothing Next n End Sub saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, confrontando passo-passo le due macro ora mi è chiaro. Quanto è bello il VBa!! Grazie infinite, buon pomeriggio eZio
|
|
Guest |