Vba Excel条件格式

Vba Excel条件格式,vba,excel,macros,conditional-formatting,Vba,Excel,Macros,Conditional Formatting,根据以下要求,我对excel中的宏有疑问 我正在努力实现的目标: 1:表1将包含我的数据输入(示例) 如图所示,表1包含5列和3行(第1行包含列名,第2行和第3行包含数据值) 2:我需要检查第1页中的列名是否与第2页中的值一致(第2页包含第1列中的以下值) 3:首先检查sheet1的第1行的任何值(在我的示例中为A、B、C、D、E的列名)是否与sheet2中的任何列名匹配(在我的示例中为A、E) 4:如果找到匹配项,请检查以下内容(在我的案例中,a列和E列已找到) 5:在这种情况下,我想标记对应

根据以下要求,我对excel中的宏有疑问

我正在努力实现的目标:

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

如图所示,表1包含5列和3行(第1行包含列名,第2行和第3行包含数据值)

2:我需要检查第1页中的列名是否与第2页中的值一致(第2页包含第1列中的以下值)

3:首先检查sheet1的第1行的任何值(在我的示例中为A、B、C、D、E的列名)是否与sheet2中的任何列名匹配(在我的示例中为A、E)

4:如果找到匹配项,请检查以下内容(在我的案例中,a列和E列已找到)

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

6:所以在我的示例中,第2行应该移到另一张表中,或者a和E下的值应该突出显示,或者整行移到第3张表中

我更多的是一个ETL人员和一个excel新手,但我试图通过宏来自动化它

我尝试过的方法

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

2:使用vlookup将这些值与sheet2值进行比较

3:每当找到匹配项时,使用相等操作比较单元格值并生成布尔返回值

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


附言:我不是在寻找一个人来编写整个代码,而是在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 我从最后一行迭代到第一行。这样,您可以在必要时删除行

'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
请参见图片以获取参考:


我不理解这句话:“就像在我的示例中,不允许与sheet1第1行相对应的值,因为A列和E列包含值,但允许第2行,因为它们不包含空值。”。我是否正确理解您的意思:如果在
表2中找到标题名称,您想将
表1
中整列的值更改为
NULL
?这很好。它将使用字母或数字作为列名(例如A、B、3、D、5、F)Hi Thomas,这非常适用于突出显示列E的无效数据,但是它似乎没有突出显示列A的值。据我所知,您是通过迭代从表1中提取的行号和从表2中提取的列号来引用目标单元格。对吗?做了以下操作如果c.Text=rData.Cells(1,j),则将j=1的rCheck中每个c的“代码”更改为rData.Columns.Count,如果c.Text=rData.Cells(1,j),则将target=rData.Rows(i).rData.Columns(j)设置为非空(target)然后“突出显示无效数据target.Interior.Color=vbRed”,以确保您的答案可以应用于没有列名称A、B等的数据。尽管有任何建议,但不起作用@Thomasinzina按要求工作!
'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