Excel VBA函数查找 – 两个值的同时出现

我一直在使用VBA中的用户定义函数来查找某个数。 对于背景而言,“原始”是一张工作表,指的是在列B中具有stream派并且在列C中具有艺术家ID的工作表。我正在工作的工作表具有两种stream派的组合:第一列A,第二列B 。

无论如何,我试图build立的function应该做以下几点:以string作为两个input。 检查“raw”中的stream派列表是否与第一个input匹配。 然后,获取该ID并find与ID和第二个input相匹配的单元格。 如果find一个,请在运行计数中添加一个。 无论是否find,移动到下一场比赛。 该函数将返回一个整数,表示两个stream派拥有相同艺术家ID的次数。

现在,我的函数返回#VALUE ..没有语法错误,没有编译错误。 只是返回值的错误。 我已经看了一遍,疯狂search,我只是不明白。 我是VBA的新手,所以也许我只是错过了一些非常明显的东西,或者我定义了错误的东西。 无论哪种方式,我只需要另一双眼睛来查看它。 任何改善build议都非常感谢,所以提前感谢您的时间和帮助!

这是代码。 我知道这不是最漂亮的,但它很短,逻辑应该是有道理的。

Public Function cocount(c1 As String, c2 As String) As Integer Dim rng As Range Dim rng2 As Range Dim cell As Range Dim cell1 As Range Dim ID As Integer Dim Count As Integer rng = Worksheets("Raw").Range("B2:B183579") rng2 = Worksheets("Raw").Range("C2:C183579") Count = 0 For Each cell In rng If cell.Value = c1 Then ID = cell.Offset(0, 1).Value For Each cell1 In rng2 If cell1.Value = ID And cell1.Offset(0, -1).Value = c2 Then Count = Count + 1 End If Next cell1 End If Next cell cocount = Count End Function 

编辑:感谢您查看我的问题,并愿意帮助(并感谢Rdster尝试解决scheme)。 我上传了原始数据和组合的图片,尽pipe它不会让我embedded图像。 原始数据 组合列表

无论如何,我会尝试再次解释我的问题。 在stream派的组合列表中,每行包含两个stream派。 我想知道这两个stream派在原始数据表中共享相同的艺术家ID的次数。 原始数据中有181,000多个组合,183,000多行。 因此,该function需要高效 – 即使在其他语言中,我也不是非常擅长。

在这里输入图像说明 在这里输入图像说明

这可以使用内置的几个不同的Excel工作表函数来实现。

使用COUNTIFS的Excel公式

定义两个dynamic的命名范围,将自己resize以适应数据。 Gendre_2是相对于Gendre_1定义的,这确保了范围是相同的大小。

Gendre_1 = OFFSET(Raw!$ A $ 1,1,0,COUNTA(Raw!$ A:$ A)-1,1)

Gendre_2 = OFFSET(Raw!$ A $ 1,1,1,COUNTA(Raw!$ A:$ A)-1,1)

= COUNTIFS(Gendre_1,A2,Gendre_2,B2)

参考: ExcelJet – Excel COUNTIFS函数

COUNTIFS计算与提供的条件相匹配的范围内的单元格数量。 与COUNTIF函数不同的是,COUNTIFS可以应用一组以上的标准,且具有多个范围。 范围和标准成对应用,只有第一对是必需的。 对于每个附加条件,您必须提供另一个范围/条件对。 最多允许127个范围/标准对。

VBA

 Public Function cocount(c1 As String, c2 As String) As Double Dim rng As Range, rng2 As Range With Worksheets("Raw") Set rng = .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) Set rng2 = rng.Offset(0, 1) cocount = WorksheetFunction.CountIfs(rng, c1, rng2, c2) End With End Function 

如果我理解正确,你正在尝试计算c1和c2 = B#和C#的次数,其中#是同一行。

 Public Function cocount(c1 As String, c2 As String) As Integer Dim Count As Integer, iRow as Integer Count = 0 For iRow = 2 to Sheets("Raw").Cells(Rows.Count, "B").End(xlUp).Row If Cells(iRow, "B") = c1 And Cells(iRow,"C") = c2 Then Count = Count + 1 End If Next iRow cocount = Count End Function 

检查 “raw”中的stream派列表 是否与第一个input匹配然后,获取该ID并find 与ID和第二个input相匹配的 单元格

尝试这个:

 Public Function cocount(FirstKey$, SecondKey$, FirstRng As Range, SecondRng As Range) As Long Dim FirstAccurance As Range, ID$ Set FirstAccurance = FirstRng.Find(FirstKey, , xlValues, xlWhole, xlByRows, xlNext, 0) ID = Cells(FirstAccurance.Row, SecondRng.Column).Value2 cocount = WorksheetFunction.CountIfs(SecondRng, ID, FirstRng, SecondKey) End Function 

testing:

在这里输入图像说明