WedX - журнал о программировании и компьютерных науках

Excel VBA VLookup — ошибка 13 — несоответствие типов

Я работаю над макросом Excel VBA, который получает электронную почту клиента с другого листа.

Я получаю ошибку 13 "Несоответствие типов" из VLookup:

For Each c In Range("D3:D130").Cells

    If c > 500 Then

      Dim emailadress As String
      Dim client_name As String
      Dim lookup_mail As Range

      Set lookup_mail = Sheets("MAILS").Range("A1:D130")

      client_name = Range("A" & (c.Row)).Value

      emailadress = Application.VLookup(client_name, lookup_mail, 4, False)

Если я сделаю это таким образом, он отлично работает:

      emailadress = Application.VLookup("John Doe", lookup_mail, 4, False)

Итак, я предполагаю, что что-то не так с тем, как я «заявляю»? имя клиента. Что странно, потому что, когда я вывожу client_name в MsgBox, оно появляется отлично.

(Я использую VBA, потому что мне нужно отправлять автоматические электронные письма клиентам)

Любая помощь приветствуется!

30.07.2015

  • Ошибка типа 13 в этой точке обычно указывает на то, что значение не может быть найдено. Вы отлаживали и каково значение client_name в момент ошибки? Запустите Debug.Print char(39) & client_name & chr(39) непосредственно перед vlookup и проверьте окно Immediate, чтобы увидеть, есть ли начальные/конечные пробелы в источнике и/или цели. 30.07.2015
  • Значение правильное, я получаю имя клиента, но ВПР по какой-то причине не может прочитать это значение... 31.07.2015
  • Разве это не должно быть Application.WorksheetFunction.VLookup(...)? Кроме того, если вы назвали диапазон (A1: D130), вы можете просто поместить текст в VLookup, вы также можете сделать этот именованный диапазон динамическим, чтобы не беспокоиться об изменении размера диапазона. 31.07.2015
  • Какова цель If c > 500 Then? Вы имеете в виду значение в c (c.Value)? 31.07.2015

Ответы:


1

Я предполагаю, что не ваш ВПР вызывает ошибку несоответствия типов, а присваивает возвращаемое значение строке. Возможно, ваша функция ВПР пытается присвоить строке значение ошибки, что приводит к несоответствию типов. Вместо этого попробуйте использовать вариант.

Кроме того, объявление переменных внутри цикла вызывает у меня раздражение. Пожалуйста, не делайте этого. То же самое относится ко всему, что вы можете сделать ВНЕ цикла, например, установить диапазон lookup_mail.

Dim emailadress As Variant
Dim client_name As String
Dim lookup_mail As Range
Dim c As Range

Set lookup_mail = Sheets("MAILS").Range("A1:B3")

For Each c In Range("D3:D130").Cells
  If c.Value > 500 Then
    client_name = Range("A" & (c.Row)).Value
    emailadress = Application.VLookup(client_name, lookup_mail, 4, False)
  End If
Next

Таким образом, ваш код будет работать, но ваша переменная адреса электронной почты может содержать ошибку. Проверь это.

РЕДАКТИРОВАТЬ:

Если вы используете application.worksheetfunction.vlookup, это может работать лучше. Если Vlookup выдает ошибку, она просто возвращает ошибку в VBA, а не пытается вернуть ее в переменную.

30.07.2015
  • Спасибо, я сделал шаг вперед. Извините за переменные внутри цикла, хе-хе. Так что мне теперь делать? адрес электронной почты возвращает ошибку 2024 в результате. 31.07.2015

  • 2

    Вы можете попробовать это, это может сработать, если ваш диапазон или значение исходит из базы данных с плохим форматированием строк или чисел:

    emailadress = Application.VLookup(WorksheetFunction.Text(client_name), lookup_mail, 4, False)
    

    Ваше здоровье,

    Паскаль

    https://multiskillz.tekcities.com

    30.07.2015
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]