【问题标题】:Color Cells in a Worksheet Based on Data From Another Worksheet in Same Workbook根据同一工作簿中另一个工作表中的数据为工作表中的单元格着色
【发布时间】:2012-07-09 23:47:11
【问题描述】:

我有以下名为 Data 的工作表:

在同一个工作簿中,我还有另一个名为 Employee Database 的工作表。

在 Excel 中,如果“员工电子邮件地址”是" 不在员工数据库中?

换句话说,我正在尝试使 Employee Database 工作表看起来像这样:

我刚刚给出了一个示例,实际上我有超过 10,000 个单元格的数据可以执行此操作。我开始手动执行此操作,并意识到这将花费我很长时间。

我想知道是否有一个宏可以在 Excel 中执行此操作?

非常感谢您的帮助!我有上面截图的示例工作簿可供下载: http://www.mediafire.com/?dttztp66dvjkzn8

【问题讨论】:

  • 是的,你可以写一个宏来检查。你有没有尝试过?
  • 是的,我使用 CTRL+F 搜索电子邮件地址,如果 Excel 告诉我没有找到匹配项,我将它们突出显示为红色。问题是这需要很长时间。一个小时后,我搜索了 100 多个。我有超过 10,000 个细胞要检查,所以按照我目前的速度,我需要几天的时间。

标签: excel excel-2007 excel-2010 vba


【解决方案1】:

您可以在不使用 VBA 的情况下执行此操作,但需要对 Data 工作表上的数据稍作更改。

我不推荐在 Excel 中使用“数据透视表”或“小计”式的数据存储方式,在这种方式中,您在一列中输入主键只需要一次,然后在旁边填写相关数据直到下一个主键。

与合并的单元格一样,这只会在您以后想要重新组织数据时导致问题。

这就是我所做的:

填写数据表上缺少的电子邮件地址

突出显示单元格 A2 一直到列 A 到列 B 中数据的末尾。因此,如果您在单元格B2:B100 中有公司名称,但只有来自A2:A98 的电子邮件,则应突出显示A2:A100。这是因为我们在每行可用数据中填写了电子邮件地址。

转到编辑 » 查找和选择 » 转到特殊,选择Blanks 并点击OK

现在选择空白,输入= (向上箭头),然后按Ctrl+Enter。 A 列中的空白单元格将填写缺少的电子邮件地址。突出显示 A 列,复制并粘贴值。

为电子邮件创建动态命名范围

Employee Database 工作表上,在“引用”框中使用以下公式创建一个名为“电子邮件”的命名范围:

=OFFSET('Employee Database'!$C$1,1,0,COUNTA('Employee Database'!$C:$C)-1,1)

添加条件格式

Data 工作表上,突出显示A2:C whatever(例如:A2:C20000),然后转到首页 » 样式 » 条件格式 strong> 并使用以下公式:

=ISNA(MATCH($A2,Emails,0))

选择您想要的配色方案并点击OK。以下是它在我的计算机上的一些示例数据:

有一些小的限制:

  • 您不能再将Data 工作表上的 A 列留空。
  • Employee Database 工作表上的数据行之间不能有空白行。这是由于动态范围的工作方式造成的。

好处

这种方法的好处是,IMO,巨大的。

  • 您可以在员工数据库表中添加或删除行,突出显示将自动调整。例如:如果我添加 d@gmail.com 并删除 c@nbc.com,Data 表上的格式会立即更新。

  • 您不必更改现有的工作表结构(除了填写缺失的数据并添加范围名称)。无需额外的工作表。
  • 您的工作簿可以保持无 VBA(如果还没有的话)。

【讨论】:

    【解决方案2】:

    这是你正在尝试的吗?这将创建一个带有输出的新工作表“Desired Result”。将其粘贴到模块中。

    Option Explicit
    
    Sub Sample()
        Dim wsData As Worksheet, wsDB As Worksheet, wsO As Worksheet
        Dim lRow As Long, i As Long
        Dim clrRng As Range
    
        Set wsData = Sheets("Data")
        Set wsDB = Sheets("Employee Database")
        Set wsO = Sheets.Add
    
        On Error Resume Next
        Application.DisplayAlerts = False
        Sheets("Desired Result").Delete
        Application.DisplayAlerts = True
        On Error GoTo 0
    
        With wsO
            .Name = "Desired Result"
            wsData.Cells.Copy .Cells
    
            lRow = .Range("B" & .Rows.Count).End(xlUp).Row
    
            For i = 2 To lRow
                If .Range("A" & i).Value = "" Then .Range("A" & i).Value = .Range("A" & i - 1).Value
            Next i
    
            For i = 1 To lRow
                If Application.WorksheetFunction.CountIf(wsDB.Columns(3), .Range("A" & i).Value) = 0 Then
                    If clrRng Is Nothing Then
                        Set clrRng = .Rows(i)
                    Else
                        Set clrRng = Union(clrRng, .Rows(i))
                    End If
                End If
            Next i
    
            If Not clrRng Is Nothing Then clrRng.Interior.ColorIndex = 3
    
            For i = lRow To 2 Step -1
                If .Range("A" & i).Value = .Range("A" & i - 1).Value Then .Range("A" & i).ClearContents
            Next i
        End With
    End Sub
    

    【讨论】:

    • 天哪,成功了!!!是的!你真的为我节省了几天的查找和替换!非常非常感谢你!!!!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多