2011-12-12 17 views
8

Sto provando la formattazione condizionale su un foglio. Ho bisogno di riempire le celle con un determinato colore secondo la seguente istruzione condizionale:Formattazione condizionale usando la funzione AND()

=AND((INDIRECT(ADDRESS(4;COLUMN()))>=INDIRECT(ADDRESS(ROW();4)));(INDIRECT(ADDRESS(4;COLUMN()))<=INDIRECT(ADDRESS(ROW();5)))) 

Quando provo le dichiarazioni in AND() la funzione a parte, sembrano funzionare, ma quando li ho messi insieme nel funzione Non vedo alcun evento di formattazione.

Ecco uno sfondo: La riga 4 della "colonna corrente" ha una data (DATE1) al suo interno. Esistono anche date sulle colonne D ed E della "riga corrente" (DATE2 e DATE3). Quindi, vorrei riempire la cella con un colore se DATE1 è tra DATE2 e DATE3.

Non riesco a capire perché la formula non funzioni. Ogni aiuto è molto apprezzato.

Update (13 dic 2011):

ho implementato una funzione che io chiamo dalle cellule ho bisogno di questa funzionalità. La funzione restituisce valori interi. Quindi la formattazione condizionale utilizza solo gli interi nelle celle. In questo modo, la formattazione condizionale è meno complicata. Sto passando INDIRECT (ADDRESS (ROW(); COLUMN())) nella funzione che implemento. Quindi, ho tutte le informazioni di cui ho bisogno quando lavoro su celle relative e/o assolute. Sarebbe bello sapere un modo più semplice per passare la cella corrente come intervallo nella funzione.

Nota: ActiveCell non sembra funzionare per me. Usa i dati dalla cella che viene selezionata al momento dell'esecuzione della funzione. Non è quello che sto cercando. Ovviamente potrei passare la cella stessa (come in A4, B7, ecc.) Ma non sono sicuro che sia davvero importante in termini di prestazioni.

Grazie a tutti voi che avete risposto alla mia domanda.

risposta

28

Stavo avendo lo stesso problema con AND() rompendo la formattazione condizionale. Mi è capitato di provare a trattare l'AND come moltiplicazione, e funziona! Rimuovi la funzione AND() e moltiplica i tuoi argomenti.Excel tratterà i booleani come 1 per vero e 0 per falso. Ho appena testato questa formula e sembra funzionare.

=(INDIRECT(ADDRESS(4,COLUMN()))>=INDIRECT(ADDRESS(ROW(),4)))*(INDIRECT(ADDRESS(4,COLUMN()))<=INDIRECT(ADDRESS(ROW(),5))) 
+0

Non ho provato la soluzione, ma ha senso. Ci proverò il prima possibile. –

+0

@davient Entrambe le tue modifiche erano sbagliate. Innanzitutto, la funzione di indirizzo prende la riga come primo argomento. Riga 4 IS riga "D". Quello che hai dato è la colonna 4 e 5 sulla riga corrente. Inoltre, la formattazione condizionale applica le regole sulle celle. Per evidenziare un'intera riga, la regola dovrebbe essere valutata su true per l'intera riga. Come per gli operatori logici, False ha un valore di 0 e True ha un valore di 1. TRUE - TRUE = 1 - 1 = FALSE non è un'operazione OR valida. Inoltre, TRUE/FALSE = 1/0 = ERRORE non è un'operazione AND valida. Ho verificato che questo è il modo in cui funziona in Excel. – James

+1

Aveva lo stesso problema, questa risposta funziona bene. – perry

0

Ciò è probabilmente dovuto alle funzioni column() e row(). Non sono sicuro di come vengono applicati nella formattazione condizionale. Prova a creare una nuova colonna con il valore di questa formula e quindi utilizzala per le tue esigenze di formattazione.

+0

Grazie per la risposta. Ci proverò e riferirò. –

+0

Ho finito per implementare la formula in una funzione in cui restituisco numeri interi per motivi diversi. È stato piuttosto facile ottenere DATE2 e DATE3 utilizzando qualcosa come Cells (ActiveCell.Row, 4) .Value. Ma quando si tratta di ottenere DATE1, Cells (4, ActiveCell.Column) .Value non sembra fare il trucco. Forse è perché, la funzione che ho scritto non viene chiamata ogni volta che aggiorno DATE2 o DATE3? Sono bloccato in un punto in cui questo a volte funziona e talvolta non ha idee? –

+0

Hai dichiarato la tua funzione con Application.Volatile? – ivan

3

È possibile utilizzare una formula molto più semplice. Ho appena creato una nuova cartella di lavoro per testarla.

Column A = Date1 | Column B = Date2 | Column C = Date3 

Evidenziare Colonna A e immettere la formula di formattazione condizionale:

=AND(A1>B1,A1<C1) 
+0

Grazie per la risposta, ma non è possibile inserire DATE1 sulla stessa riga degli altri. –

+0

Mancato quel po 'mi dispiace. Quindi è lo stesso vero per ogni riga? Il valore DATE1 si trova nella stessa colonna 4 righe sotto? Sto facendo fatica a visualizzare i tuoi dati. Puoi allegare il foglio di lavoro o uno screenshot? –

+0

In fila, ci sono due date DATE2 (inizio) e DATE3 (fine). E poi, a partire dalla riga 10, ogni cella in quella riga ha una data nella riga 4 della colonna corrispondente. Proverò ad allegare uno screenshot più tardi oggi. –

0

COLUMN() e ROW() non funziona in questo modo perché esse sono applicate alla cella che li sta chiamando. Nella formattazione condizionale, sarà necessario esplicito anziché implicito.

Per esempio, se si desidera utilizzare questo formattazione condizionale su un inizio serie sulla cella A1, si può provare:

`COLUMN(A1)` and `ROW(A1)` 

Excel si adatterà automaticamente la formattazione condizionale per la corrente della cella .

+0

Grazie per la risposta. Ho finito per aggiornare il valore nella cella in modo che la formattazione condizionale venga eseguita in base ai valori della cella. –

+0

felice che tu abbia finalmente trovato una soluzione. Puoi postarlo come una risposta e accettarlo in modo che l'argomento sia in qualche modo chiuso - vedi http://stackoverflow.com/faq#howtoask – JMax

+0

Quando avrò finito di completarlo, lo farò. Ci sono ancora hickups. Ad esempio, la funzione ActiveCell restituisce la cella selezionata mentre esegue uno script. Il che non ha alcun senso. Pertanto sto cercando qualcosa che restituisca la cella corrente in cui viene eseguita la funzione. Tornerò presto con una risposta ... –

1

Ho avuto un problema simile con una formula meno complicato:

= If (x > A & x <= B) 

e ha scoperto che ho potuto rimuovere il AND e unire le due confronti con +

= (x > A1) + (x <= B1)  [without all the spaces] 

Spero che questo aiuti altri con confronti meno complessi.

0

Attualmente sono responsabile di un'applicazione Excel con un sacco di codice legacy. Uno dei pezzi più lenti di questo codice stava eseguendo il ciclo di 500 righe in 6 colonne, impostando formule di formattazione condizionale per ciascuna. Le formule sono per identificare dove il contenuto della cella non sono vuoto, ma non fanno parte di un intervallo denominato, quindi, riferendosi due volte per la cellula stessa, originariamente scritto come:

=AND(COUNTIF(<rangename>,<cellref>)=0,<cellref><>"") 

Ovviamente le spese generali sarebbero molto ridotti aggiornando tutte le celle in ogni colonna (intervallo) contemporaneamente. Tuttavia, come osservato in precedenza, utilizzando l'indirizzo (ROW(), COLONNA(), n) non funziona in questa circostanza, vale a dire questo non funziona:

=AND(COUNTIF(<rangename>,ADDRESS(ROW(),COLUMN(),1))=0,ADDRESS(ROW(),COLUMN(),1)<>"") 

ho sperimentato a lungo con una cartella di lavoro vuota e potrebbe non trovare aggirare questo, usando varie alternative come ISBLANK. Alla fine, per aggirare il problema, ho creato due funzioni definite dall'utente (utilizzando una punta che ho trovato altrove su questo sito):

Public Function returnCellContent() As Variant 

    returnCellContent = Application.Caller.Value 

End Function 

Public Function Cell_HasContent() As Boolean 

    If Application.Caller.Value = "" Then 
    Cell_HasContent = False 
    Else 
    Cell_HasContent = True 
    End If 

End Function 

La formula condizionale è ora:

=AND(COUNTIF(<rangename>,returnCellContent()=0,Cell_HasContent()) 

che funziona bene.

Questo ha velocizzato il codice, in Excel 2010, da 5 a 1 secondo. Poiché questo codice viene eseguito ogni volta che i dati vengono caricati nell'applicazione, questo risparmio è significativo e notevole per l'utente. È anche molto più pulito e riutilizzabile.

Ho avuto il tempo di postare questo perché non sono riuscito a trovare alcuna risposta su questo sito o altrove che coprono tutte le circostanze, mentre sono sicuro che ci sono altri che potrebbero trarre beneficio dall'approccio di cui sopra, potenzialmente con un numero molto maggiore di celle da aggiornare.

0

Stessi problemi degli altri segnalati - utilizzando Excel 2016. Rilevato che quando si applicavano le formule condizionali alle tabelle ; AND, moltiplicando le condizioni e aggiungendo le condizioni non riuscite. Ho dovuto creare personalmente la logica VERO/FALSO:

=IF($C2="SomeText",0,1)+IF(INT($D2)>1000,0,1)=0 
Problemi correlati