Ошибка выполнения VBA 13 с использованием Msgbox

Я очень новичок в VBA и имею только базовый уровень знаний.

Я пытался создать макрос для перекрестной ссылки данных на одном листе на несколько других листов в одной рабочей книге. Если запись найдена, я бы хотел, чтобы появилось окно msgbox, чтобы предупредить пользователя о местонахождении данных.

После многих часов поиска в Интернете и объединения кусков кода это то, что у меня есть

Sub search()
Dim ws As Worksheet, found As Range
Dim TextToFind(1 To 20) As String
Dim iText As Long

TextToFind(1) = "Jade Smith"
TextToFind(2) = "Bob Collins"
TextToFind(3) = "Jemima Smythe"

For Each ws In ThisWorkbook.Worksheets
    With ws
        If .Name <> "Blacklisted Candidates" Then 'Do not search blacklist candidates!
            iText = 1
            Do While iText <= UBound(TextToFind)
                If TextToFind(iText) <> "" Then 'Do not search blank strings!
                    Set found = .UsedRange.Find(what:=TextToFind(iText), LookIn:=xlformulas, LookAt:=xlPart, MatchCase:=False)

                    If Not found Is Nothing Then
                        MsgBox "Proxy Candidate Found at " & found.Address
                    Else
                        MsgBox "No Proxy Candidates Found ", vbOKOnly, "Success!"
                    End If
                    iText = iText + 1
                End If
            Loop
        End If
   End With
Next ws

End Sub

Однако этот код не находит значения из других листов.

при тестировании я просто получаю msgbox, когда данные не найдены, даже если там есть тестовые данные.

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


person Lbrin    schedule 06.09.2016    source источник
comment
почему у тебя * в конце?   -  person Shai Rado    schedule 06.09.2016
comment
изменить *MsgBox ("Proxy Candidate Found at " And rngX.Address) на MsgBox "Proxy Candidate Found at " & rngX.Address   -  person Shai Rado    schedule 06.09.2016
comment
Вы пропустили какой-то код? У @litelite есть правильный ответ. Ошибка 13, но ваш цикл Do не имеет возможности выйти. Также If Rng Is found Then должно быть If Not Rng Is Nothing Then.   -  person Comintern    schedule 06.09.2016
comment
@Comintern В if есть goto, который он использует, чтобы выйти из бесконечного цикла.   -  person litelite    schedule 06.09.2016
comment
@Коминтерн правда, я прочитал это быстро. Его код никогда не закончится...   -  person litelite    schedule 06.09.2016


Ответы (2)


Вы пытаетесь использовать бинарный оператор And для двух строк. Вероятно, вы хотели использовать & вместо объединения строк.

Документация :

(Документы предназначены для VB.Net, но они работают одинаково на обоих языках)

Итак, чтобы исправить это, замените

MsgBox ("Proxy Candidate Found at " And rngX.Address)

By

MsgBox ("Proxy Candidate Found at " & rngX.Address)
person litelite    schedule 06.09.2016
comment
Скобки лишние. И они также могут укусить вас сзади - см. always-use-parentheses#t=201609061647521040081">это сбивает с толку, почему бы просто не использовать круглые скобки всегда?. - person Mathieu Guindon; 06.09.2016
comment
Документация по Office VBA для & находится здесь, а для Andздесь - person Vincent G; 07.09.2016

отредактировано для учета поиска в ячейке, содержимое которой получено из формулы

чтобы обобщить все, что уже было указано в комментариях и litelite, и добавить несколько 0,02 цента, вот рабочий код

Option Explicit

Sub search()
    Dim ws As Worksheet, found As Range
    Dim TextToFind(1 To 20) As String
    Dim iText As Long

    TextToFind(1) = "xxxx"
    TextToFind(2) = "xxxx"
    TextToFind(3) = "xxxxx"

    For Each ws In ThisWorkbook.Worksheets
        With ws
            If .name <> "Blacklisted Candidates" Then 'Do not search blacklist candidates!
                iText = 1
                Do While iText <= UBound(TextToFind)
                    If TextToFind(iText) <> "" Then 'Do not search blank strings!
                        Set found = .UsedRange.Find(what:=TextToFind(iText), LookIn:=xlFormulas, LookAt:=xlPart, MatchCase:=False)

                        If Not found Is Nothing Then
                            MsgBox "Proxy Candidate Found at " & found.Address
                        Else
                            MsgBox "No Proxy Candidates Found ", vbOKOnly, "Success!"
                        End If
                        iText = iText + 1
                    End If
                Loop
            End If
       End With
    Next ws
End Sub
person user3598756    schedule 06.09.2016
comment
Спасибо, ребята, теперь я больше не получаю сообщение об ошибке. однако я проверил это после того, как вручную вставил текстовую строку, которую я ищу. хотя на самом деле он не находит текстовую строку. кто-нибудь из вас может помочь? - person Lbrin; 07.09.2016
comment
необходима дополнительная информация: обновите свой вопрос примерами минимального набора данных, воспроизводящих проблему. кроме того, укажите, содержат ли искомые ячейки постоянные значения или результаты формулы - person user3598756; 07.09.2016
comment
Я обновил вопрос сейчас, если у кого-то есть какие-либо идеи, это будет оценено! спасибо за вашу помощь до сих пор! - person Lbrin; 07.09.2016
comment
Я видел в отредактированном вами вопросе, что ячейки для поиска в хосте содержат формулу конкатенации. поэтому см. отредактированный ответ, где я только что заменил xlValues на xlFormulas. - person user3598756; 07.09.2016
comment
@Lbrin, ты прошел через это? - person user3598756; 07.09.2016
comment
Спасибо, я не знаю, почему он не работает, я обновил его, как вы предложили, но все равно ничего :/ - person Lbrin; 07.09.2016
comment
что означает все еще ничего? обновите свой вопрос примерами минимального набора данных, воспроизводящих проблему. - person user3598756; 07.09.2016