Переменная не меняется с каждым циклом - PullRequest
0 голосов
/ 30 сентября 2019

Я новичок в Excel VBA, поэтому я прошу прощения за очень элементарный уровень кодирования. В основном у меня есть таблица с заголовками, такими как Age и Name.

Я пытаюсь написать код, чтобы найти все заголовки с «Возрастом» и скопировать значения в другую ячейку, компилируя все возрасты в отдельной таблице.

Снимок экранамоего рабочего листа

Я включил переменную searchAge, равную ""Age " & i", с i, увеличивающейся после каждого цикла. Затем это помещается в функцию Find в findAge. Проблема, с которой я сталкиваюсь, заключается в том, что ячейка, которую находит findAge, всегда имеет значение «Возраст 1» и не обновляется до «Возраст 2» при увеличении i.


    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

    i = 1

    'set the search range
    Set rngSearch = ActiveSheet.Range("A1:R100")

    'specify last cell in the range
    Set rngLast = rngSearch.Cells(rngSearch.Cells.Count)

    searchAge = "Age " & i
    Set findAge = rngSearch.Find(What:=searchAge, MatchByte:=False, SearchFormat:=False)

    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
        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
    End If
End Sub

Может кто-нибудь пролить свет на это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Я согласен с Кириллом. Если вы сделаете отступ в своем коде правильно, вы увидите проблемы. Попробуйте это вместо:

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
0 голосов
/ 30 сентября 2019

Ваше состояние означает, что у вас будет только 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окно сообщения, когда это выполняется.


Я полагаю, что вы хотите этот ВНУТРИ вашего цикла, поэтому i повторяется для searchAge. ..

searchAge = "Age " & i
Set findAge = rngSearch.Find(What:=searchAge, MatchByte:=False, SearchFormat:=False)

Кто-то отформатировал / отступил ваш код в посте, который, по моему мнению, является вашей проблемой. Вы бы увидели, что было внутри вашего цикла, если бы вы сделали соответствующий отступ (цикл начинается с Do и заканчивается Loop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...