跨页搜索和条件替换

时间:2018-03-06 22:26:16

标签: excel excel-formula

我是一名临时的Excel用户,熟悉基本的单元格公式和一些内置函数,但不知道如何解决这个问题。 我已经获得了两张工作簿。第一张工作表在一堆列上有超过10K行的数据。列D,G和H是感兴趣的。

G列和H列各有3个字符的符号,作为一对对应,例如G12,H12,G56和H56。符号不是唯一的,但是对是。 D列包含相同的单词TEST。所以我们有这样的事情:

--D--   --G--   --H--  
TEST    ABC     LMN  
TEST    ABC     XYZ  
TEST    GHI     LMN  
TEST    JKL     QRS  
TEST    LMN     JKM  
TEST    LMN     XYZ  
TEST    UVW     AMB  

第二张纸具有约2800行的两列A和B,包含相同类型的3字符符号对。它们没有订购,但我们知道Sheet 2上的每一对都在Sheet 1中的某个位置,例如

--A--   --B--  
GHI     LMN  
UVW     AMB  
ABC     XYZ  
LMN     XYZ  

对于Sheet 1上的每个符号对,我需要确定该对是否在Sheet 2上,如果是,则需要将D列中的相应TEST更改为DONE。结果将是:

--D--   --G--   --H--    
TEST    ABC     LMN  
DONE    ABC     XYZ  
DONE    GHI     LMN  
TEST    JKL     QRS  
TEST    LMN     JKM  
DONE    LMN     XYZ  
DONE    UVW     AMB  

有没有人知道一种相当简单的方法,可能有内置的Excel功能?这是一次性的事情,所以我不需要任何过于花哨的东西或者未来的证据。 丹

3 个答案:

答案 0 :(得分:2)

为此,您可以使用如下公式:

=IF(SUMPRODUCT((--(Sheet2!$A$1:$A$4&Sheet2!$B$1:$B$4=Sheet1!$E1&Sheet1!$F1)))>0,"Done","Test")`


test to see if match exists

您需要将Sheet1Sheet2更改为实际的工作表名称,并扩展$A$1:$A$4$B$1:$B$4的范围以匹配您的实际工作表值。

这个公式实质上是连接(即组合)两列数据(Sheet2!$A$1:$A$4Sheet2!$B$1:$B$4)并查找连接值(Sheet1!$E1Sheet1!$F1 )。如果找到,则公式返回 TRUE ;否则,它返回 FALSE

但是 ,您必须确保将--置于其中,以便将 TRUE / 转换为FALSE 分别 1 / 0 。由于SUMPRODUCT无法识别字符串,因此需要编号才能进行评估。然后将SUMPRODUCT包裹在IF函数中,您可以在适当的时候返回完成的请求值。

修改

正如@CallumDA指出的那样,你也可以用下面的公式来实现这个目的:

=IF(COUNTIFS(Sheet2!$A$1:$A$4,Sheet1!$E1,Sheet2!$B$1:$B$4,Sheet1!$F1)>0,"Done","Test")

两个公式都会做同样的事情(这是Excel的很酷的部分!),所以要么应该满足你的需要。我同意COUNTIFS看起来更友好一些,但我相信理解SUMPRODUCT公式如何运作,如果只是为了将来的知识,也是值得的。

答案 1 :(得分:0)

如果你可以使用VBA,那么这应该可行:

Option Explicit

Sub Test()

    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = ThisWorkbook.Worksheets(1)
    Set ws2 = ThisWorkbook.Worksheets(2)

    ' move data into a multi-dimensional array
    Dim arr1() As Variant, arr2() As Variant
    arr1 = ws1.Range("G1:H" & lastRow(ws1, "G")).Value
    arr2 = ws2.Range("A1:B" & lastRow(ws2)).Value

    Dim i As Long, x As Long

    'loop the arrays for matches
    For i = 1 To UBound(arr1)
        For x = 1 To UBound(arr2)
            If arr1(i, 1) = arr2(x, 1) And arr1(i, 2) = arr2(x, 2) Then
                ws1.Cells(i, "D").Value = "DONE"
            End If
        Next x
    Next i

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
    With ws
        lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
    End With
End Function

您可以将数据列放入每个工作表的单独数组中,然后循环数组。 i也会确定行号,因此很容易将值写入" D"柱。

如果您不熟悉VBA,请继续阅读:

  

如何访问VBE?
  当您进入工作簿时,可以通过按 Alt + F11 来访问VBE。

     

好的,所以我打开了VBE。现在我该如何应用这个Sub / UDF?
  在左侧窗格中,您将看到工作簿对象模块。这称为 Project Explorer 。您需要创建一个新模块,您可以通过right-clicking inside the Project Explorer > Insert > Module

来创建      

enter image description here

     

现在你可以将Sub / UDF粘贴到这个新模块中了,你已经完成了设置!

答案 2 :(得分:0)

感谢您使用@TotsieMae和@CallumDA这些解决方案。我在COUNTIFS中使用了替代公式,在我做了一个小改动之后它完美地工作了。

为了将公式传播到整个D列,Sheet 1单元格引用不能是绝对的,因为它们需要在每一行增加以使用正确的符号对。我使用的最终公式是:

单元格D1 = IF(COUNTIFS(Sheet2!$ A $ 1:$ A $ 4,Sheet1!E1,Sheet2!$ B $ 1:$ B $ 4,Sheet1!F1)> 0,“完成”,“测试”)

然后,将公式传播到列中会导致:
单元格D2 = IF(COUNTIFS(Sheet2!$ A $ 1:$ A $ 4,Sheet1!E2,Sheet2!$ B $ 1:$ B $ 4,Sheet1!F2)> 0,“完成”,“测试”)
单元格D3 = IF(COUNTIFS(Sheet2!$ A $ 1:$ A $ 4,Sheet1!E3,Sheet2!$ B $ 1:$ B $ 4,Sheet1!F3)> 0,“完成”,“测试”)