全部。我是VBA和MS EXCEl 2010的新手。我刚刚开始在EXCEL中使用宏模块,几乎没有经验。
我想要做的是如下所述。首先在sheet1的某个范围内搜索值记录,然后对于我找到的每个单元格,找到该行并在该行中拉出另一个单元格值。使用此值在sheet2中的范围内执行另一次搜索。我会在我的代码之后指出我遇到的问题。这是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中搜索的键,以及RangeSheet2中的value2。上面的代码遍历我在sheet 1中为value1找到的每条记录,并在Sheet2中进行另一次搜索。
现在让我们假设value1 = 1,value2 = 2007,并且在表1中有5条包含value1的记录。问题来自于这行代码“ColumnIndex = .Find(value2).Column”。
据推测,对于所有五个找到的记录,在执行“Set Found = .FindNext(Found)”之后,Found的值应始终为1。但是,在我添加了这个ColumnIndex代码之后,Found的值设置为2007,这对我来说太奇怪了。谁知道问题是什么?任何帮助将不胜感激。我真的需要保持Found行为“正常”,如我所愿。
如果有任何不清楚的地方,请告诉我
答案 0 :(得分:3)
.Find/.Findnext
会记住上次设置。因此,始终建议完全指定参数。特别After:=
参数。它还会记住你的上一个搜索词是什么,What:=
以下是如何使用.Find/.Findnext
也不要将Value2
用作变量。这是一个保留字。我没有使用Value1
和Value2
,而是使用以下代码中的sSearch1
和sSearch2
假设你的表格看起来像这样
现在试试这段代码
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
这是我们得到的结果。