Excel VBA查找函数副作用?

所有。 我是VBA和MS EXCEl 2010的新手。我刚开始玩EXCEL的macros模块,几乎没有任何经验。

我试图做的是如下描述。 首先searchsheet1范围内的值logging,然后对于find的每个单元格,find该行并在该行中提取另一个单元格值。 使用此值在sheet2范围内执行另一个search。 我会指出我的代码后,我有问题。 这是pesudcode。

Dim Found As Range With RangeInSheet1 Set Found = .Find(value1) If Not Found Is Nothing Then firstAddress = Found.Address Do With RangeInSheet2 ColumnIndex = .Find(value2).Column End With Set Found = .FindNext(Found) Loop While Not Found Is Nothing And Found.Address <> firstAddress End If End With 

value1是我用来在RangeSheet1中search的键,而RangeSheet2中是value2。 上面的代码遍历我在sheet1中为value1find的每个logging,并在Sheet2中执行另一个search。

现在让我们说value1 = 1,value2 = 2007,并且在表1中有5个包含value1的logging。问题出现在这行代码“ColumnIndex = .Find(value2).Column”中。

假设对于所有五个find的logging,在“Set Found = .FindNext(Found)”被执行之后,Found的值应该总是1。 但是,在我添加这个ColumnIndex代码之后,Found的值被设置为2007,这对我来说很奇怪。 任何人都知道问题是什么? 任何帮助将不胜感激。 我真的需要保持发现行为“正常”,如我所愿。

如果有什么不清楚的地方,请告诉我

.Find/.Findnext记得最后的设置。 因此总是build议完全指定参数。 特别是After:=参数。 它也会记住你最后的search词What:=

这是一个演示如何使用.Find/.Findnext

也不要使用Value2作为variables。 这是一个保留字。 而不是使用Value1Value2 ,我在下面的代码中使用sSearch1sSearch2

让我们说你的床单是这样的

在这里输入图像说明

现在试试这个代码

 Sub Sample() Dim ws1 As Worksheet, ws2 As Worksheet Dim rngWs1 As Range, rngWs2 As Range Dim aCell As Range, bCell As Range, cCell As Range, dCell As Range, eCell As Range, cl As Range Dim sSearch1, sSearch2 Set ws1 = ThisWorkbook.Sheets("Sheet1") Set rngWs1 = ws1.Range("A1:A10") Set ws2 = ThisWorkbook.Sheets("Sheet2") Set rngWs2 = ws2.Cells With ws1 For i = 1 To 10 sSearch1 = .Range("A" & i).Value Set aCell = .Range("A" & i) If Len(Trim(sSearch1)) <> 0 Then Set aCell = rngWs1.Find(What:=sSearch1, After:=aCell, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not aCell Is Nothing Then sSearch2 = aCell.Offset(, 1).Value With ws2 Set bCell = rngWs2.Find(What:=sSearch2, After:=.Range("A1"), LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not bCell Is Nothing Then Debug.Print "For " & sSearch1 & ", " & sSearch2 & " Found in " & bCell.Address Set cCell = bCell Do Set bCell = rngWs2.FindNext(After:=bCell) If Not bCell Is Nothing Then If bCell.Address = cCell.Address Then Exit Do Debug.Print "For " & sSearch1 & ", " & sSearch2 & " Found in " & bCell.Address Else Exit Do End If Loop End If End With End If End If Next End With End Sub 

这是我们得到的结果。

在这里输入图像说明