2016-04-26 14 views
0

Ich arbeite an einem Frontend, um Daten in einem Kalender anzuzeigen. Die Daten werden aus einer zweiten Tabelle in einer anderen Arbeitsmappe abgerufen. Ich habe die Daten aus der Quelltabelle übernommen und kann die tatsächlichen Werte bedingt formatieren, aber die Kalenderdaten können nicht die gleiche bedingte Formatierung haben. Nur die Hälfte jedes Datums im Kalender zu formatieren ist unglaublich unattraktiv, und ich möchte die oberste Zelle jedes Paares mit der untersten Zelle vergleichen.Ändern Sie die Zellenfarbe so, dass sie dem bedingten Format der benachbarten Zelle entspricht

Image of calendar

Da die bedingte Formatierung ist eine Maske, ein Versuch, Zellenfarbe von VBA nicht erfolgreich war zu kopieren. Wenn Sie den Code Range("I2").Interior.Color = Range("I3").Interior.Color verwenden, wird die Farbe I2 der Farbe I3, die keine Hintergrundfarbe hat, angepasst, da Excel das bedingte Format verarbeitet.

Es gibt zwei alternative Lösungen, aber ich bin auf der Suche, sie zu vermeiden:

  1. ich eine Reihe von Einzeln bedingten Format zu den Zellen mit dem Datumswert und den Gradienten Effekt manuell erstellen anwenden kann . Dies verliert etwas von der Wirkung des 3-Farbverlaufs jedoch darin, dass es etwas langsamer ist, auf einen Blick zwischen Zellen zu unterscheiden.

  2. Ich kann VBA verwenden, um manuell die Farbe zu berechnen, die auf jede Zelle angewendet werden sollte . Während dies die gleiche Wirkung wie das, was ich bin suchen würde, erwarte ich, dass die Berechnungen und Codierung länger als für ein einfaches Projekt dauert.


Gibt es eine Möglichkeit, die bedingte Formatierung unten auf Zellen anzuwenden, die nur neben den Werten sind?

Conditional format applied

Bearbeiten/Die gewünschte Formatierung wie folgt aussehen würde, es sei denn es berechnet werden würde und nicht manuell angelegt:

enter image description here

+0

Wenn ich richtig verstehe, ich glaube, die Lösung 2 ist die beste Wahl:/ – findwindow

+0

@findwindow - ich ein Bild hinzugefügt, um zu klären, was ich zu erreichen war auf der Suche nach, wenn das, was Sie mit Referenzierung wurden Verständnis korrekt ". Ich schätze die zweite Meinung, auch wenn sie meinen Verdacht bestätigt. – Fritz

Antwort

0

Während ich weiß nicht, ob das Original gestellte Frage möglich ist, , Ich habe die alternative Lösung # 2 abgeschlossen:

Verwenden Sie VBA, um manuell die Farbe zu berechnen, auf die angewendet werden soll jede Zelle.

Auf der Kalenderseite habe ich eine Schaltfläche (Formularsteuerung) hinzugefügt und ein Makro erstellt, das beim Klicken ausgeführt wird. Das Makro aktualisiert die Berechnungstabelle, die die angezeigten Tageswerte steuert, mit dem Eingabewert und berechnet dann die für die obere Hälfte des Kalenderquadrats erforderliche Verlaufsfarbe. Die aktuelle Tabelle sieht wie folgt aus:

Finished screenshot

Ich hielt die bedingte Formatierung in der unteren Hälfte des Platzes zu färben, aber es kann auch von der VBA Seite behandelt werden.

Der Code für das Schaltflächenmakro lautet wie folgt;

Sub loadDetails_Click() 

Dim area1colMin As Integer 
Dim area1colMax As Integer 
Dim area2colMin As Integer 
Dim area2colMax As Integer 
Dim rowMin As Integer 
Dim rowMax As Integer 

area1colMin = 6 
area1colMax = 12 
area2colMin = 14 
area2colMax = 20 
rowMin = 3 
rowMax = 29 

' Insert input value into calculation spreadsheet, making sure 
' values/conditional formatting calculation waits until the code is ran. 

ThisWorkbook.Sheets("VBACalcPage").Range("A6").Value = ThisWorkbook.Sheets("SingleItemLookup").Range("C1").Value 

colorArea area1colMin, area1colMax, rowMin, rowMax 
colorArea area2colMin, area2colMax, rowMin, rowMax 

End Sub 

Das Makro ruft zweimal die Funktion colorArea() auf;

Public Function colorArea(minC As Integer, maxC As Integer, minR As Integer, maxR As Integer) 

Dim tempCellValue As Integer 
Dim cnstPosR As Integer 
Dim cnstPosG As Integer 
Dim cnstPosB As Integer 
Dim cnstNegR As Integer 
Dim cnstNegG As Integer 
Dim cnstNegB As Integer 
Dim colorTempRed As Integer 
Dim colorTempGreen As Integer 
Dim colorTempBlue As Integer 
Dim intPosCap As Integer 
Dim intNegCap As Integer 
Dim colorPushRed As Integer 
Dim colorPushGreen As Integer 
Dim colorPushBlue As Integer 


cnstPosR = 79 
cnstPosG = 129 
cnstPosB = 189 
cnstNegR = 192 
cnstNegG = 80 
cnstNegB = 77 
intPosCap = 1000 
intNegCap = -1000 

For column = minC To maxC 
    For row = minR To maxR 
     If row Mod 2 = 1 Then 
      tempCellValue = Cells(row, column).Value 
      If tempCellValue > 0 Then 
       colorTempRed = cnstPosR 
       colorTempGreen = cnstPosG 
       colorTempBlue = cnstPosB 
      Else 
       colorTempRed = cnstNegR 
       colorTempGreen = cnstNegG 
       colorTempBlue = cnstNegB 
      End If 
      If tempCellValue > 1000 Then tempCellValue = 1000 
      If tempCellValue < -1000 Then tempCellValue = -1000 

      colorPushRed = 255 - ((255 - colorTempRed) * Abs(tempCellValue/1000)) 
      colorPushGreen = 255 - ((255 - colorTempGreen) * Abs(tempCellValue/1000)) 
      colorPushBlue = 255 - ((255 - colorTempBlue) * Abs(tempCellValue/1000)) 

      Cells(row - 1, column).Interior.Color = RGB(colorPushRed, colorPushGreen, colorPushBlue) 
     End If 
    Next row 
Next column 

End Function 
Verwandte Themen