Excel 条件格式

Excel Conditional Formatting

我有一个关于 excel 中的宏的查询,基于以下要求

我想要实现的目标:

1:Sheet 1 将包含我的数据输入(示例)

A   B   C   D   E
1   2   3   4   5
    3   5   5   

如图sheet1包含5列3行(第1行包含列名,第2行和第3行包含数据值)。

2:我需要检查 sheet 1 中的列名是否具有 sheet 2 中的值(sheet 2 在第 1 列中包含以下值)

A
E

3:首先检查 sheet1 的第 1 行的任何值(在我的示例中为列名,它们是 A、B、C、D、E)是否与 [= 中存在的任何列名匹配51=]2(在我的例子中是 A,E)

4:如果找到匹配项,请检查以下内容(在我的例子中,找到了 A 列和 E 列)。

5:在这种情况下,我想标记与这些列对应的值,也就是说,如果它们包含任何值,则应该标记它们(这可以突出显示或移到不同的 sheet) .只允许空值

6:所以在我的示例中,行 2 应该移动到不同的 sheet 中,或者 A 和 E 下的值应该突出显示,或者整行移动到 sheet 3

我更像是一名 ETL 人员和一名 excel 菜鸟,但我试图通过 macros.Looking 将其自动化,以寻求实现此功能的方法

我试过的方法

1:将 sheet1 中列名的值粘贴到新的 sheet3 中并粘贴为转置

2:使用 vlookup

将这些值与 sheet2 个值进行比较

3:每当找到匹配项时,使用相等运算比较单元格值并生成布尔值 return 值

好吧,在我继续之前,我想检查一下我的方法是否完全正确!! 感谢您的投入,伙计们

P.S:我不是在找人写整个代码,而是在 VBE 中处理上述场景的通用方法

你永远不会真正说出你想用数据做什么。此代码将突出显示无效单元格。

Sub HighlightInvalidData()
    Dim rData As Range, rCheck As Range, c As Range, target As Range
    Dim i As Long
    Set rData = Sheet1.Range("A1").CurrentRegion
    Set rCheck = Range(Sheet2.Range("A1"), Sheet2.Range("A" & Rows.Count).End(xlUp))

    For i = rData.Rows.Count To 2 Step -1

        For Each c In rCheck
            Set target = rData.Rows(i).Columns(c.Text)
            If Not IsEmpty(target) Then
                'Highlight Invalid Data
                target.Interior.Color = vbRed
            End If
        Next

    Next

End Sub

您可以高亮显示无效行,而不是使用

'Highlight Invalid Row
Sheet1.Rows(target.Row).Interior.Color = vbRed

我从最后一行迭代到第一行。这样,你就可以在需要的时候删除行了。

'Delete Row
target.EntireRow.Delete

试试这个:

Sub Demo()
    Dim lastRow As Long, colNum As Long, i As Long
    Dim inputRng As Range, checkRng As Range, rngFound As Range
    Dim inputWS As Worksheet, checkWS As Worksheet

    'assigning worksheets to variable        
    Set inputWS = ThisWorkbook.Sheets("Sheet1")
    Set checkWS = ThisWorkbook.Sheets("Sheet2")

    'setting the range of both worksheets
    Set inputRng = inputWS.Range("A1").CurrentRegion
    Set checkRng = checkWS.Range("A1:A" & checkWS.Cells(Rows.Count, "A").End(xlUp).Row)

    For Each cel In checkRng
        'find Sheet2 values in Row1 of Sheet1
        Set rngFound = inputWS.Rows(1).Find(cel.Value)
        If Not rngFound Is Nothing Then
            'get the column number if value found
            colNum = rngFound.Column
            lastRow = inputWS.Cells(Rows.Count, colNum).End(xlUp).Row
            'loop through the entire column to find non-empty cells
            For i = 2 To lastRow
                If Not IsEmpty(inputWS.Cells(i, colNum)) Then
                    inputWS.Cells(i, colNum).Interior.Color = vbRed
                End If
            Next i
        End If
    Next
End Sub

参考图片: