我是excel VBA的新手,所以我对非常基础的编码表示歉意。基本上,我有一个表,其中包含标题,例如Age和Name。
我正在尝试编写代码以查找所有带有“年龄”的标头,然后将值复制到另一个单元格中,本质上将所有年龄段汇编在一个单独的表下。
Screenshot of my working sheet
我包含了一个searchAge
的{{1}}变量,""Age " & i"
在每个循环之后都会增加。然后将其放入findAge下的Find函数中。我面临的问题是i
所寻找的单元格始终为“年龄1”,并且当findAge
增加时不会更新为“年龄2”。
i
有人能对此有所启发吗?
谢谢!
答案 0 :(得分:0)
您的状况意味着您只会有1个i
... firstCellAddress = rngFound.Address
,而您的状况是Loop Until rngFound.Address = firstCellAddress
。
If Not rngFound Is Nothing Then
firstCellAddress = rngFound.Address '<--- THIS ##########
Do
Set rngFound = rngSearch.FindNext(rngFound)
MsgBox (rngFound.Offset(1, 0).Value & findAge.Value & i)
findAge.Offset(1, 0) = rngFound.Offset(1, 0).Value
i = i + 1
Loop Until rngFound.Address = firstCellAddress '<--- THIS ###########
End If
您应该在运行时只看到1个消息框。
我相信您希望循环使用 INSIDE ,因此i
迭代searchAge.
。.
searchAge = "Age " & i
Set findAge = rngSearch.Find(What:=searchAge, MatchByte:=False, SearchFormat:=False)
有人在帖子中格式化/缩进了您的代码,我相信这本质上是您的问题。如果适当缩进,您将看到循环内部的内容(循环以Do
开始,以Loop
结尾。
答案 1 :(得分:0)
我同意西里尔的观点。如果您正确缩进代码,您将看到问题。尝试以下方法:
Sub dothisagain()
Dim rngSearch As Range
Dim rngLast As Range
Dim rngFound As Range
Dim firstCellAddress As String
Dim findAge As Range
Dim searchAge As String
Dim i As Integer
'set the search range
Set rngSearch = ActiveSheet.Range("A1:R100")
'specify last cell in the range
Set rngLast = rngSearch.Cells(rngSearch.Cells.Count)
Set rngFound = rngSearch.Find(What:="Age", After:=rngLast, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If Not rngFound Is Nothing Then
firstCellAddress = rngFound.Address
i = 1
searchAge = "Age " & i
Set findAge = rngSearch.Find(What:=searchAge, MatchByte:=False, SearchFormat:=False)
Set rngFound = rngSearch.Find(rngFound)
MsgBox (rngFound.Offset(1, 0).Value & findAge.Value & i)
findAge.Offset(1, 0) = rngFound.Offset(1, 0).Value
i = i + 1
Do
firstCellAddress = rngFound.Address
Set rngFound = rngSearch.FindNext(rngFound)
searchAge = "Age " & i
Set findAge = rngSearch.Find(What:=searchAge, MatchByte:=False, SearchFormat:=False)
findAge.Offset(1, 0) = rngFound.Offset(1, 0).Value
i = i + 1
Loop Until rngFound.Address <> firstCellAddress
End If
End Sub