变量不会随着每个循环而变化

时间:2019-09-30 17:53:17

标签: excel vba

我是excel VBA的新手,所以我对非常基础的编码表示歉意。基本上,我有一个表,其中包含标题,例如Age和Name。

我正在尝试编写代码以查找所有带有“年龄”的标头,然后将值复制到另一个单元格中,本质上将所有年龄段汇编在一个单独的表下。

Screenshot of my working sheet

我包含了一个searchAge的{​​{1}}变量,""Age " & i"在每个循环之后都会增加。然后将其放入findAge下的Find函数中。我面临的问题是i所寻找的单元格始终为“年龄1”,并且当findAge增加时不会更新为“年龄2”。

i

有人能对此有所启发吗?

谢谢!

2 个答案:

答案 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
相关问题