Excel VBA:比较两个Excel工作表并根据工作表2中的额外数据有条件地格式化

时间:2016-11-17 18:05:47

标签: excel vba excel-vba

我正在创建一个仪表板视图,该视图将具有由文件上的其他工作表确定的格式。

仪表板将有一个复选框,指示它将从哪个表中读取。我还在制作第一张纸。

基本上,仪表板的名称放在工作表的不同部分,第二个工作表在电子表格中具有相应的名称,如时尚。

我正在尝试编写基本上将名称范围与第2页上的名称列表进行比较的内容,如果名称匹配,我希望它读取第2页上名称旁边的数字并计算然后格式化表1上的名称。这是示例代码

Dim processes As Range
Dim applications As Range
Dim appCount As Range
Dim k As Integer

Set process = Worksheets("Dashboard").Range("A4:F17")
Set applications = Worksheets("Application").Cells(2, 1)
Set appCount = Worksheets("Application").Cells(2, 2)

k = 0

For I = 1 To process.Rows.Count
    For j = 1 To process.Columns.Count
        If process.Cells(I, j) = applications.Offset(k, 0) Then
            If appCount.Offset(k, 0) >= 40 Then
                process.Cells(I, j).Interior.ColorIndex = 37
            Else
                If appCount.Offset(k, 0) >= 20 Then
                    process.Cells(I, j).Interior.ColorIndex = 32
                Else
                    If appCount.Offset(k, 0) <= 19 Then
                        process.Cells(I, j).Interior.ColorIndex = 27
                    End If
                End If
            End If
        End If
        k = k + 1
    Next j
Next I

基本上我希望它匹配名称并比较表2中下一个单元格中的值,以确定表单1上名称的格式。

感谢能够提供帮助的任何人。我尝试运行时遇到错误。运行时错误'438':对象不支持此属性或方法。

2 个答案:

答案 0 :(得分:2)

我建议使用条件格式,如下所示:

enter image description here

您需要的公式如下:

=40<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other")
=20<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other")
=0<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other")

请注意,规则的顺序很重要,您应该从以= 40&lt;。

开头的那个开始。

答案 1 :(得分:0)

好吧,如果您想使用VBA,请注意您的代码的主要问题不是特定于语言,而是您没有正确使用算法。目前,您仅将流程11与应用程序1进行比较,然后仅将流程1 2与应用程序2进行比较,...将流程m n与应用程序14×m + n进行比较。为了保持思维简单,您应该有第三个循环来迭代所有应用程序行,如下所示:

Private Sub Worksheet_Activate() ' Or Private Sub Worksheet_Change(ByVal Target As Range)
    Dim processes As Range
    Dim applications As Range
    Dim appCount As Range
    Dim k As Integer

    Set process = Worksheets("Dashboard").Range("A4:F17")
    Set applications = Worksheets("Application").Cells(2, 1)
    Set appCount = Worksheets("Application").Cells(2, 2)

    For i = 1 To process.Rows.Count
        For j = 1 To process.Columns.Count
            For k = 0 To applications.End(xlDown).Row - 2
                If process.Cells(i, j) = applications.Offset(k, 0) Then
                    If appCount.Offset(k, 0) >= 40 Then
                        process.Cells(i, j).Interior.ColorIndex = 37
                    ElseIf appCount.Offset(k, 0) >= 20 Then
                        process.Cells(i, j).Interior.ColorIndex = 32
                    ElseIf appCount.Offset(k, 0) <= 19 Then
                        process.Cells(i, j).Interior.ColorIndex = 27
                    End If
                End If
            Next k
        Next j
    Next i
End Sub

正如您所看到的,我将它放入了事件处理程序中。这样,只要您转到相关工作表,它就会更新颜色。或者,您可以将其绑定到Worksheet_Change,因此只要您的流程图上发生更改(更频繁的更新但需要更多CPU时间),它就会更新。

请注意,对于大型数据集,此算法不是最佳的,但您应该使用两阶段方法:(1)将所有application-applicationCount对或甚至应用程序格式化指令对收集到Scripting.Dictionary中,以及(2)迭代所有进程的单元格,在字典中查找应用程序并根据它应用格式。这样会更有效率,因为搜索字典所需的时间与日志(应用程序)而不是应用程序成比例。