2015-05-29 10 views
9

Ho visto molti utenti fare domande cercando di cambiare i colori delle celle utilizzando le funzioni definite dall'utente. Ho sempre avuto l'impressione che non fosse possibile farlo. La mia comprensione era che una funzione definita dall'utente non può cambiare nessuna proprietà di una cella tranne il valore della cella che contiene la formula. I sottotitoli sono ciò che cambia le cellule stesse.Funzione definita dall'utente per cambiare il colore di una cella

Tuttavia, quando si gioca con del codice per testarlo, ho scoperto che non è sempre il caso.
Utilizzando il codice semplice:

Function ColorCell(rng As Range) 
If rng.Value = 1 Then 
    ColorCell = False 
Else 
    ColorCell = True 
    rng.Interior.ColorIndex = 3 
End If 
End Function 

Se entro la funzione in una cella, ho raggiungere i risultati previsti, non le cellule cambiano i colori. Tuttavia, se si utilizza il pulsante Formule> Inserisci funzione e si passa alla formula per inserirla in questo modo, lo fa il colore alle celle di destinazione.
Cell Color Function

Com'è possibile, e perché la funzione si è comportata diversamente quando è stata immessa in modi diversi?

EDIT: questa è stata testata utilizzando Excel 2007

+0

Non conosco la risposta a questo, ma si noti che se si modificano i valori della cella, non sarà cambiare la colorazione anche nel caso in basso. Quindi se cambi cella A11 a 1 la cella rimane rossa. – OpiesDad

+0

Corretto, non c'è alcun aggiornamento della funzione stessa. Tranne se si torna indietro e riutilizzare "Inserisci funzione", * * aggiorna il valore/colore. – TMH8885

+3

'Ho scoperto che non è sempre il caso. Vero :) Hai visto [This] (http://stackoverflow.com/questions/23433096/using-a-udf-in-excel-to-update-the- foglio di lavoro) –

risposta

2

uso di questo codice ... basta sostituire il nome del foglio e cerco

Sheets("sheet_name").range(j:j).clear 

for j=2 to 15 
if Sheets("sheet_name").Cells(j, 1).value=1 then 

else 

Sheets("sheet_name").Cells(j, 1).Interior.ColorIndex = 3 
next j 
0

Io uso Worksheet_Change evento per rilevare il cambiamento del valore di campo di lavoro. Esempio. Voglio fare qualcosa quando l'intervallo A1: A5 è cambiato. Io uso sotto l'evento.

Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range(<Your working range>)) Is Nothing Then 'Define range that you want to do 
     'Statement here 
     ... 

    End If 
End Sub 

Quando il valore dell'intervallo è stato modificato. Eseguirà il tuo codice.

E altro modo. Usa formattazione condizionale.

0

Come tutti noi scopriamo prima o poi, nelle funzioni utente non è possibile accedere ai sottotitoli che cambiano direttamente le cose nel foglio di calcolo.

Ma provate questo:

Dim ColorMeTarget As Range, ColorMeVal As Long 

Public Function ColorMe(ByVal TargetRange As Range, ByVal ColVal As Long) 
    Set ColorMeTarget = TargetRange 
    ColorMeVal = ColVal 
    ColorMe = ColVal 
End Function 

Public Sub ColorMeSub() 
    Application.OnTime Now + TimeValue("00:00:05"), "ColorMeSub" 
    If ColorMeTarget.Interior.Color <> ColorMeVal Then ColorMeTarget.Interior.Color = ColorMeVal 
End Sub 

Se si esegue il sub prime, che verrà costantemente la scansione delle variabili statiche ColorMeTarget e ColorMeVal per vedere se c'è un cambiamento. La funzione ColorMe imposterà questi valori. È necessario un codice aggiuntivo nel caso in cui ColorMeTarget non sia ancora inizializzato.

Se si diventa più intelligenti, è possibile fare in modo che la funzione verifichi prima che sia effettivamente apportata una modifica e aggiunga le nuove richieste di colorazione a una pila. Il tuo sottotitolo ricorrente può quindi "recuperare", soprattutto se hai molte funzioni come questa.

È quindi possibile aggiungere alla funzione/macro anche tutti i tipi di controlli aggiuntivi - EVEN STUFF NON COPERTI DALLE VERSIONI PIÙ RECENTI DI 'FORMATIZZAZIONE CONDIZIONATA' !!! SÌÌ!!!!

Qualcosa da provare: in alcuni dei miei macro automatici, sono in grado di impostare OnTime tramite una funzione ma non riesco a farlo funzionare qui. Sarebbe più pulito avere la funzione impostata su OnTime e non avere un sub ricorrente che necessiti di inizializzazione.

0

potrebbe anche provare il metodo non-script di auto-colorazione una cella in base alle condizioni della cella (aka Formattazione condizionale):

highlight desired range & click "conditional formatting from the toolbar

use either an established rule or make a new rule

note options on rule types; I selected one to simply format the range based on cell contents. You can format based on a formula as well. Set the conditions to test ... in this case I said the condition is when a cell value is more than 5. Then click on format and set the desire format whether it be a font change or shading of the cell, etc. Here I selected to shade the cell a color of green when above 5 Here is the result. You can delete the contents of the cells without deleting the conditional formatting set for the cells.

Problemi correlati