我是一名临时的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功能?这是一次性的事情,所以我不需要任何过于花哨的东西或者未来的证据。 丹
答案 0 :(得分:2)
为此,您可以使用如下公式:
=IF(SUMPRODUCT((--(Sheet2!$A$1:$A$4&Sheet2!$B$1:$B$4=Sheet1!$E1&Sheet1!$F1)))>0,"Done","Test")`
您需要将Sheet1
和Sheet2
更改为实际的工作表名称,并扩展$A$1:$A$4
和$B$1:$B$4
的范围以匹配您的实际工作表值。
这个公式实质上是连接(即组合)两列数据(Sheet2!$A$1:$A$4
和Sheet2!$B$1:$B$4
)并查找连接值(Sheet1!$E1
和Sheet1!$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
:现在你可以将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,“完成”,“测试”)
等