2014-07-23 2 views
1

Я создал таблицу, которая автоматически обновляет свои данные по ценам из Интернета. Мне нужно написать код в VBA, который ищет цены (было бы хорошо, если бы это была только одна ячейка), чтобы достичь определенного номера, и как только он набирает этот номер, чтобы отправить уведомление по электронной почте на указанные адреса. У меня есть общее представление о том, как подойти к этому, но так как я новичок в VBA, я довольно утерян, когда дело доходит до ошибок, которые я получаю, и как их исправлять. Вот код, который я придумал до сих пор:Использование IF, VLookup для отправки автоматических писем в VBA

Private Sub Worksheet_Change(ByVal Target As Range) 

     If (VLookup(B248, B248, 1, False)) = 30 Then 
      Sub Send_Email_Using_VBA() 
    Dim Email_Subject, Email_Send_From, Email_Send_To, _ 
    Email_Cc, Email_Bcc, Email_Body As String 
    Dim Mail_Object, Mail_Single As Variant 
    Email_Subject = "Price Alert" 
    Email_Send_From = "[email protected]" 
    Email_Send_To = "[email protected]" 
    Email_Cc = "[email protected]" 
    Email_Body = "Price higher than XX" 
    On Error GoTo debugs 
    Set Mail_Object = CreateObject("Outlook.Application") 
    Set Mail_Single = Mail_Object.CreateItem(0) 
    With Mail_Single 
    .Subject = Email_Subject 
    .To = Email_Send_To 
    .cc = Email_Cc 
    .Body = Email_Body 
    .send 
    End With 
    debugs: 
    If Err.Description <> "" Then MsgBox Err.Description 


    End Sub 

Прошу прощения, если это полностью разделывали, и я оценил бы любой входной сигнал, это сводит меня вверх по стене.

Благодаря

+2

Каковы ошибки, которые вы получаете и на каких линиях? – Gareth

+0

Его подсветка (VLookup) и дающая мне ошибку компиляции: подфункция или функция не определены – user3869339

ответ

0

VLookup не является функция VBA, а функция рабочего листа, который может быть использован, как это:

Application.WorksheetFunction.VLookup() 

Вам необходимо включить некоторые обработки ошибок, хотя, как ошибка будет брошена, если совпадения не найдено.

0
Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Cells.Count = 1 Then 
    If Target = 30 Then 
     Call Send_Email_Using_VBA(Target.Offset(0, -1)) 
    End If 
End If 

End Sub 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 

Sub Send_Email_Using_VBA(strItem as variant) 

Dim Email_Subject As String, Email_Send_From As String, Email_Send_To As String, _ 
Email_Cc As String, Email_Bcc As String, Email_Body As String 
Dim Mail_Object, Mail_Single As Variant 

Email_Subject = "Price Alert" 
Email_Send_From = "[email protected]" 
Email_Send_To = "[email protected]" 
Email_Cc = "[email protected]" 
Email_Body = "Price of " & strItem & " higher than XX" 

On Error GoTo debugs 

Set Mail_Object = CreateObject("Outlook.Application") 
Set Mail_Single = Mail_Object.CreateItem(0) 

With Mail_Single 
    .Subject = Email_Subject 
    .To = Email_Send_To 
    .cc = Email_Cc 
    .Body = Email_Body 
    .send 
End With 

debugs: 
If Err.Description <> "" Then MsgBox Err.Description 

End Sub 

Как насчет этого? Прежде всего, Vlookup - это функция рабочего листа, а не функция VBA (некоторые функции оба). Таким образом, вы должны использовать его как

Application.worksheetfunction.vlookup(etc.) 

Однако, Target является ячейка, которая изменилась на листе, так что используйте это.

Операторы IF должны либо находиться на одной линии, либо должны заканчиваться символом «Конец If».

Чтобы вызвать другой элемент, используйте «Вызов», а не «Суб», так как это будет определять новый. Тогда вы должны сделать это.

Я предположил, что имя элемента находится в столбце слева от цены, поэтому я сделал переадресацию прохода содержимого ячейки слева от той, которая достигла 30, на ссылку отправки , Если вы этого не хотите, то вытащите его.

Я не тестировал электронную почту, но остальное должно работать.

Вы хотите только отправить электронное письмо один раз за элемент? Или один раз в общей сложности? Кроме того, что, если цена идет от, например, 29-31? Это произойдет?

+0

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

+0

Также на какой строке я указываю ячейку? Я вижу, что вы установили вызов для передачи содержимого, но я не вижу его в коде. – user3869339

+0

Целевая задача зависит от того, какая ячейка изменилась, поэтому, как только ячейка изменится, подпрограмма workheet_change проверяет, равно ли ей 30. Тогда, если это так, она передает ячейку слева на адрес электронной почты, который использует ее в элементе электронной почты. – user123965

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