Для каждого цикла не работает, как ожидалось - PullRequest
0 голосов
/ 27 мая 2019

У меня есть два листа в Excel, один - это доска с несколькими ячейками с числами внутри, а другой - ссылки (которые имеют номера на предыдущей доске), и мне нужно написать в той же строке ссылок, где находятся ячейкирасположен.
изображение первой доски, где находятся ссылки
изображение листа Excel, в котором я должен написать местоположение каждой ссылки
код моей VBA

Пример:

enter image description here

Файл arm8.png - это доска, а local.png - это место, где я пишуде локализации ячеек

Option Explicit

Sub ciclo()

    Dim FindString As String
    Dim Rng As Range
    Dim matrixVal As Range

    Set matrixVal = Sheets("Localizações").Range("B1")
    FindString = matrixVal

    For Each Rng In matrixVal

        If Trim(FindString) <> "" Then

            With Sheets("Arm8").Range("A1:J10")

                Set Rng = .Find(What:=FindString, _
                                After:=.Cells(.Cells.Count), _
                                LookIn:=xlValues, _
                                LookAt:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False)

                If Not Rng Is Nothing Then
                    'Application.Goto Rng, False
                    'MsgBox Rng.Column & " - " & Rng.Row
                Else
                    MsgBox "Nothing found"
                End If

            End With

            With Sheets("Localizações")
                .Range("C1:C9").Value = Rng.Column
                .Range("D1:D9").Value = Rng.Row
            End With

        End If

    Next Rng

End Sub

Я ожидал, что выходные данные в local.png будут столбцом C и D

2 - 9
2 - 7
2 - 8
2 - 4
5 - 4
7 - 4
5 - 9
9 - 7
9 - 0

1 Ответ

1 голос
/ 27 мая 2019

Во-первых, как я уже сказал в своем комментарии, это:

Set matrixVal = Sheets("Localizações").Range("B1")

устанавливает matrixVal как одну отдельную ячейку (точнее, B1), поэтому в вашем цикле For-Each нет циклов, кроме этой отдельной ячейки, поэтому он будет выполняться только один раз.

Во-вторых, FindString необходимо обновить внутри цикла, иначе вы будете искать одно и то же значение снова и снова.

Наконец, вы не должны обновлять переменную Rng внутри цикла, потому что вы уже используете ее для циклического перемещения по диапазону. Вам нужна вторая переменная типа Range.

Ваш код должен выглядеть так:

 Sub ciclo()

    Dim FindString As String
    Dim Rng As Range
    Dim cell As Range
    Dim matrixVal As Range

    Set matrixVal = ThisWorkbook.Worksheets("Localizacoes").Range("B1:B9")

    For Each cell In matrixVal
        FindString = cell.Value

        If Trim(FindString) <> "" Then

            With ThisWorkbook.Worksheets("Arm8").Range("A1:J10")

                Set Rng = .Find(What:=FindString, _
                                After:=.Cells(.Cells.Count), _
                                LookIn:=xlValues, _
                                LookAt:=xlWhole, _
                                SearchOrder:=xlByRows, _
                                SearchDirection:=xlNext, _
                                MatchCase:=False)

                If Not Rng Is Nothing Then
                    With ThisWorkbook.Worksheets("Localizacoes")
                        .Cells(cell.Row, "C").Value = Rng.Column
                        .Cells(cell.Row, "D").Value = Rng.Row
                    End With
                Else
                    MsgBox "Nothing found"
                End If

            End With

        End If

    Next cell

End Sub
...