在两个表

时间:2017-02-18 19:08:44

标签: excel vba excel-vba

问题:
我正在使用Excel 2010 VBA为相同的结构元素(例如" 123_789")和相同的错误代码(例如" ER005")之间找到不相同(非常长)的错误文本2桌。如果结果不相同,请在第一个表格的单元格中将背景颜色设置为黄色。

比较两个错误协议(新旧)以找出一个错误代码和结构元素的错误文本不同。

可以找到几个结构元素的一个错误代码。一个Structure元素可以有多个错误代码,但只有一行错误代码。

文字是可变的。

示例:
表1:

| StructureElement |错误代码| ERRORTEXT |
| --------- | ------- | -------- |
| 123_456 | ER001 |文字
| 123_789 | ER001 |文字
| 123_789 | ER005 | Textnew< -this是要着色的文本单元格 | 123_456 | ER005 |文本1
| 123_456 | ER006 |文本

表2:

| StructureElement |错误代码| ERRORTEXT |
| --------- | ------- | -------- |
| 123_456 | ER001 |文字
| 123_789 | ER001 |文字
| 123_789 | ER005 | Textold
| 123_456 | ER005 |文本1
| 123_456 | ER006 |文本

我将结构元素与错误代码和错误文本连接到每个表的一个大字符串并将其写入table1。 错误文本本身可能非常庞大(这就是为什么我要比较以找出差异)。

然后将新table1.Range1的每个单元格与整个新table1.Range2(来自table2)进行比较,并对任何不匹配进行着色。 遗憾的是,table1中的原始错误文本没有着色。

描述为Excel函数,它几乎可以

=IF(EXACT(A2&B2&E2;'Tab2'!A2&'Tab2'!B2&'Tab2'!E2);"";'Tab1'!$A$1)

但是术语
1)" A2& B2& E2"每一行都是循环(每个......下一个) 2)" ' Tab2'!A2&' Tab2'!B2&' Tab2'!E2"应该是一个范围,而不是比较相等的行 3)" "";' Tab1'!$ 1 $"如果没有匹配则应该为背景着色,否则不做任何事

我未完成的VBA解决方案到目前为止非常缓慢,例如450 Range1中的值将每个值与Range2中的所有550个值进行比较。欢迎提供更有效的解决方案。

这是我目前尚未优化的代码:

Sub CompareProtocollTexts()

    Dim column1 As String, column2 As String, column3 As String
    Dim range1 As Range, range2 As Range, c As Range, zelle, zellen

    column1 = 1 ' Column with Structure Element
    column2 = 2 ' Column with Error Code
    column3 = 3 ' Column with Error Text

    Worksheets("Table1").Select

    'first Table
    LastRow1 = Sheets("Table1").UsedRange.SpecialCells(xlCellTypeLastCell).Row
    For i = 2 To LastRow1
        Range("F" & i).FormulaR1C1 = "=CONCATENATE(Table1!R" & i & "C" & column1 & ", Table1!R" & Reihe & "C" & column2 & ", Table1!R" & Reihe & "C" & column3 & ")"
        Range("F" & i).Copy
        Range("F" & i).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Next i

    'second Table
    LastRow2 = Sheets("Table2").UsedRange.SpecialCells(xlCellTypeLastCell).Row
    For t = 2 To LastRow2
        Range("G" & t).FormulaR1C1 = "=CONCATENATE(Table2!R" & t & "C" & column1 & ", Table2!R" & Reihe & "C" & column2 & ", Table2!R" & Reihe & "C" & column3 & ")"
        Range("G" & t).Copy
        Range("G" & t).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Next t

    'now compare ranges in the new columns (F is 6; G is 7)
    Set wkTab1 = Worksheets("Table1")
    LastRowF = ActiveSheet.Cells(Rows.Count, 6).End(xlUp).Row
    LastRowG = ActiveSheet.Cells(Rows.Count, 7).End(xlUp).Row

    Set range1 = wkTab1.Range("F2:F" & LastRowF)
    Set range2 = wkTab1.Range("G2:G" & LastRowF)

    For Each zellen In range1
        For Each zelle In range2
            If zellen.Value = zelle.Value And zellen.Value <> "" Then
                zellen.Font.ColorIndex = xlColorIndexAutomatic
                zellen.Interior.ColorIndex = xlColorIndexAutomatic
                Exit For
            Else:
                'colorize non-identical positions
                zellen.Interior.ColorIndex = 6 '(green = 4 ; yellow = 6 ; red = 3)
                'currently missing: colorize other cell (if matches F4 then colorize C4) in same line
            End If
        Next
    Next

End Sub

1 个答案:

答案 0 :(得分:1)

此代码运行得更快。基本思想是集中使用内置Excel的强大方法,并且不需要任何中间连接。 在这里,我使用了CountIfs,从而获得了最佳效果。

Sub CompareProtocollTexts()
    Dim range1 As Range, range2 As Range, r As Range
    Application.ScreenUpdating = False

   With Sheets("Table1")
        Set range1 = .Range(.Cells(2, 22), .Cells(.Rows.Count, 9).End(xlUp))
    End With
    With Sheets("Table2")
        Set range2 = .Range(.Cells(2, 22), .Cells(.Rows.Count, 9).End(xlUp))
    End With

    For Each r In range1.Rows
        With range2
            If Application.CountIfs(.Columns(1), r.Cells(1).Value2, _
              .Columns(13), r.Cells(13).Value2, .Columns(14), r.Cells(14).Value2) = 0 Then _
                r.Interior.ColorIndex = 6
        End With
    Next
    Application.ScreenUpdating = True
End Sub