2015-07-30 9 views
3

Я работаю над макросом Excel VBA, который получает электронное письмо клиента с другого листа.Excel VBA VLookup - Ошибка 13 - «Несоответствие типа»

Я получаю ошибку 13 «Тип Рассогласование» от ВПР:

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 обусловленно мне нужно отправить автоматические электронные письма клиентов)

Любая помощь apreciated!

+1

Ошибка типа 13 в этой точке обычно указывает, что значение не удалось найти. Вы отлаживали и что такое значение 'client_name' в точке ошибки? Запустите 'Debug.Print char (39) & client_name & chr (39)' непосредственно перед vlookup и проверьте окно Immediate, чтобы увидеть, есть ли ведущие/конечные пробелы в источнике и/или цели. – Jeeped

+0

Значение верное, я получаю имя клиента, но по какой-то причине VLookup не может прочитать это значение ... –

+0

Не должно быть 'Application.WorksheetFunction.VLookup (...)'? Кроме того, если вы назвали Range («A1: D130»), вы можете просто поместить текст в VLookup, вы также можете сделать этот динамический диапазон имен так, чтобы вы не беспокоились о размере изменений диапазона. – PatricK

ответ

3

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

Кроме того, объявление переменных внутри цикла сжигает мои глаза. Пожалуйста, не делайте этого. То же самое относится ко всему, что вы можете на самом деле сделать в OUTSIDE, например настройке диапазона 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 

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

EDIT:

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

+0

Спасибо, я сделал еще один шаг. Извините за переменные внутри цикла hehe. Итак, что мне теперь делать? emailadress возвращает ошибку 2024 в результате. –

+0

Nevermind! Оно работает. Благодаря! –

0

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

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

Cheers,

Паскаль

http://multiskillz.tekcities.com

Смежные вопросы