2017-07-10 3 views
1

Ich versuche, einen Hervorhebungsprozess zu automatisieren, um zu zeigen, dass bestimmte Zeilen abgeschlossen sind. Dieser Prozess funktioniert gut, aber am Anfang meines Blattes versuche ich, dass der Code einen "Key" für das Blatt erstellt, um die verschiedenen Bedeutungen der Farben zu zeigen. Im Schlüssel werden die Farben Weiß, Grün und Rot als Beschriftungen für Nicht abgeschlossen (Weiß), Fertig (Grün) und Fehler/Unvollständig (Rot) verwendet. Grau wird auch für private Rohre verwendet. Ich versuche, die entsprechenden Labels mit ihrer Farbe zu färben, grün wie grün, rot wie rot usw. Ich habe einen Code dafür erstellt, der für die erste Zeile funktioniert, aber auf grün wird die grüne Zelle nicht als grün eingefärbt (es lässt es weiß) und auf "Rot" färbt es die Zelle als grün. Hier ist der Code ich verwende (ich entschuldige mich es schlecht ist, wie ich bin neu in Codierung):Excel 2010 VBA mit Einstellung Zellfarben

Sub SmartHighlight() 
Dim Counter As Integer 
Dim i As Integer 
Dim j As Integer 
Dim k As Range 
Dim Chkr As Integer 
Chkr = 0 
xTitleId = "Smart Highlighter" 
MsgBox "This macro analyzes the given pipe data to highlight completed sections." 
For Each k In ActiveSheet.UsedRange.Rows 
    Counter = 0 
    i = 8 
    For j = 0 To 3 
     If ActiveSheet.Cells(k.Row, i).Value = 0 Then 
      Counter = Counter + 1 
     End If 
     i = i + 1 
    Next j 
    If ActiveSheet.Cells(k.Row, 1) = "PIPE_ID" Then 
     ActiveSheet.Cells(k.Row, 15).Value = "KEY:" 
     ActiveSheet.Cells(k.Row, 16).Value = "White" 
     ActiveSheet.Cells(k.Row, 17).Value = "Not yet completed." 
     ActiveSheet.Cells(k.Row, 18).Value = "Grey" 
     k.Cells(k.Row, 18).Interior.ColorIndex = 15 
     ActiveSheet.Cells(k.Row, 19).Value = "Private." 
    ElseIf ActiveSheet.Cells(k.Row, 1) = "" And Chkr = 0 Then 
     ActiveSheet.Cells(k.Row, 16).Value = "Green" 
     k.Cells(k.Row, 16).Interior.ColorIndex = 4 
     ActiveSheet.Cells(k.Row, 17).Value = "Completed." 
     Chkr = Chkr + 1 
    ElseIf ActiveSheet.Cells(k.Row, 1) = "" And Chkr = 1 Then 
     ActiveSheet.Cells(k.Row, 16).Value = "Red" 
     k.Cells(k.Row, 16).Interior.ColorIndex = 3 
     ActiveSheet.Cells(k.Row, 17).Value = "Error/Incomplete." 
    ElseIf ActiveSheet.Cells(k.Row, 4) = "PRIVATE PIPE" Then 
     k.EntireRow.Interior.ColorIndex = 15 
    ElseIf Counter <> 4 Then 
     k.EntireRow.Interior.ColorIndex = 4 
    ElseIf Counter = 4 And ActiveSheet.Cells(k.Row, 14) = "" Then 
     k.EntireRow.Interior.ColorIndex = 3 
    End If 
Next k 



End Sub 

Und hier ist die Ausgabe in Excel: Click for Image

Wenn jemand kann mir die Färbung helfen korrigieren Fehler, der am meisten geschätzt würde. Vielen Dank!

+0

Bedingte Formatierung * könnte * für diese Anwendung einfacher sein ... –

+0

Danke für die Antwort E. Trauger! Ich versuche leider, dieses Makro in anderen Blättern zu verwenden, weshalb ich versuche, es mit VBA zu schreiben.Von dem, was ich weiß, gibt es keine Möglichkeit, bedingte Formatierung automatisch auf alle meine anderen Blätter zu übertragen (es gibt ziemlich viele), ohne sie erneut zu definieren. Letztendlich versuche ich, dieses Makro mit meiner Menübandleiste zu verbinden, damit ich es einfach einmal anklicken und mit dem nächsten fortfahren kann. – dashton

Antwort

2

Es ist unklar, warum Sie zwischen ActiveSheet.Cells und k.Cells wechseln?

ActiveSheet.Cells(k.Row, 18).Value = "Grey" 
    k.Cells(k.Row, 18).Interior.ColorIndex = 15 

In Ihrem Code der Range k repräsentiert eine einzelne Zeile in Daten Ihres Blattes der. Sie können einen Verweis auf eine einzelne Zelle in diesem Bereich mit Cells() erhalten, aber Sie müssen vorsichtig sein, den richtigen Index (es) zu verwenden, andernfalls werden Sie mit einer Zelle enden, die nicht einmal Teil von k ist.

Zum Beispiel, wenn k gesetzt 4 auf Ihrem Blatt rudern:

k.Cells(4).Address() 

ist D4, aber

k.Cells(k.Row,4).Address() 'same as k.Cells(4, 4).Address() 

ist D7, nicht D4

k.Cells(1, 4).Address() 

wäre D4.

+0

Das hat funktioniert! Vielen Dank. Das ist peinlich, aber ich habe Probleme zu verstehen, was genau k (oder der Unterschied zwischen k und ActiveSheet) in meinem Code ist. – dashton

+0

Meine Antwort ein wenig aktualisiert - sehen, ob das hilft. –

+0

Perfekt! Vielen Dank. – dashton

0

Ich würde Ihnen vorschlagen, eine Sub-Prozedur, die die Header/Schlüssel usw. mehr statische Informationen zu aktualisieren, wenn Sie das Makro ausführen.

Dies ist, was ich in einem Excel-Makro-Gadget, ein Stück des Unter tun endete, die die Kopfzeilen ziehen:

Sub PrepareHeaders(szSheetName) 
Sheets(szSheetName).Cells(iRow + 1, iCel) = "Add/Update" 
Select Case szSheetName 
    Case "Value Lists" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 1) = "Object Type Name Singular" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 2) = "Object Type Name Plural" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 3) = "ID" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 4) = "Real Object" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 5) = "Owner Type ID" 
     Sheets(szSheetName).Cells(iRow + 1, iCel + 6) = "Aliases" 
    End Select 
    Sheets(szSheetName).Rows(iRow + 1).Font.Bold = True 
    Sheets(szSheetName).Columns("A:Z").EntireColumn.AutoFit 
    Sheets(szSheetName).Cells(1, iCel).Select 
End Sub 

Zusätzlich können Sie Arten in Ihrem Excel-Blatt verwenden. Diese Stile können von VBA aus aufgerufen werden, und falls Sie das Farbschema ändern müssen, können Sie Ihren Stil ändern, um die Formatierung auf die gesamte Tabelle anzuwenden.

Sheets(szSheetName).Cells(iRow + 1, iCel + 5).Style = "Input" 

Eine weitere gute Sache ist es, Ihre Eingabe anzupassen und schließlich eine bestimmte Zelle auszuwählen.

Und noch eine Sache, möchten Sie vielleicht nach bedingter Formatierung suchen. Das könnte eine zusätzliche Funktion zur Verfügung stellen.

Verwandte Themen