【发布时间】:2019-06-01 13:11:02
【问题描述】:
我想创建一个 vba 脚本,它将在 Outlook 中创建一个邮件以找到地址(来自 excel)。搜索应基于 Outlook 中选定的邮件(特定字符串 - ID)。我知道如何在 vba 脚本中创建电子邮件,但我不知道如何从 Outlook vba 中打开和搜索 excel 中的数据。 下面是一些代码。
Sub SMSKI()
Dim objOL As Outlook.Application
Dim objItem As Object
Dim objFwd As Outlook.MailItem
Dim strAddr As String
Dim xlApp As Object
Dim sourceWB As Workbook
Dim sourceWS As Worksheet
On Error Resume Next
Set myItem = Application.CreateItem(olMailItem)
Dim rng1 As Range
Dim strSearch As String
Set xlApp = CreateObject("Excel.Application")
Set objOL = Application
Set objItem = objOL.ActiveExplorer.Selection(1)
With xlApp
.Visible = True
.EnableEvents = False
End With
strFile = "C:\Users\User\Desktop\SMS.xlsx" 'Put your file path.
Set sourceWB = Workbooks.Open(strFile, , False, , , , , , , True)
Set sourceWH = sourceWB.Worksheets("SalesForm")
sourceWB.Activate
If Not objItem Is Nothing Then
strAddr = objItem.Body
If strAddr <> "" Then
' Set objFwd = objItem.CreateItem(olMailItem)
' objFwd.To = strAddr
vText = Split(strAddr, Chr(13))
strAddr = Right(Left(vText(0), 9), 8)
strAddr = Left(strAddr, Len(strAddr) - 8)
vText = Split(strAddr, " ")
vText = Split(strAddr, Chr(58))
strSearch = Right(Left(vText(0), 9), 8)
myItem.Subject = Right(Left(vText(0), 9), 8)
Set rng1 = Range("C:C").Find(strSearch, , sourceWB.xlValues, sourceWB.xlWhole)
myItem.SentOnBehalfOfName = "mail@bla.com"
myItem.To = ?
myItem.Cc = ""
'myItem.Subject = FindWord(strAddr, 1)
' objFwd.Sent = False
myItem.Display
' objFwd.Body = ""
myItem.HTMLBody = "reboot"
Else
MsgBox "Could not extract address from message."
End If
End If
Set objOL = Nothing
Set objItem = Nothing
Set objFwd = Nothing
End Sub
修改后的代码 此代码打开 SMS.xlsx 但不从邮件中搜索特定 id。(显然不复制) 如何更改此代码以实现我想要的?
Option Explicit
Sub TestGetValueFromExcel()
Dim ReturnedValue As String
Dim SearchValue As Variant
Dim objOL As Outlook.Application
Dim objItem As Object
Dim objFwd As Outlook.MailItem
Dim strAddr As String
Dim vText As Variant
Dim myItem As Object
Dim WbkSrc As Workbook
Dim WshtSrc As Worksheet
Dim xlApp As New Excel.Application
On Error Resume Next
Set myItem = Application.CreateItem(olMailItem)
Set objOL = Application
Set objItem = objOL.ActiveExplorer.Selection(1)
With xlApp
.Visible = True ' Slows execution but helpful during debugging
.EnableEvents = False
Set WbkSrc = .Workbooks.Open(FileName:=Environ("UserProfile") & "\Desktop\SMS.xlsx")
End With
With WbkSrc
Set WshtSrc = .Worksheets("SalesForm")
End With
If Not objItem Is Nothing Then
strAddr = objItem.Body
If strAddr <> "" Then
' Set objFwd = objItem.CreateItem(olMailItem)
' objFwd.To = strAddr
vText = Split(strAddr, Chr(13))
strAddr = vText(2)
strAddr = Left(strAddr, Len(strAddr) - 8)
vText = Split(strAddr, Chr(58))
myItem.Subject = Right(Left(vText(0), 9), 8)
SearchValue = Right(Left(vText(0), 9), 8)
ReturnedValue = GetValueFromExcel(WshtSrc, CStr(SearchValue))
myItem.SentOnBehalfOfName = "mateusz.cymerman@snt.pl"
myItem.To = ReturnedValue
myItem.CC = ""
myItem.Display
myItem.HTMLBody = "reboot"
WbkSrc.Close SaveChanges:=False
Set WbkSrc = Nothing
Else
MsgBox "Nothing Selected."
End If
With xlApp
.EnableEvents = False
.Quit
End With
Set objOL = Nothing
Set objItem = Nothing
Set objFwd = Nothing
Set xlApp = Nothing
End If
End Sub
Function GetValueFromExcel(ByRef Wsht As Worksheet, ByVal SearchValue As String) As String
Dim Rng As Range
With Wsht
Set Rng = .Columns("B").Find(What:=SearchValue, After:=.Range("B1"), LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, _
SearchFormat:=False)
If Rng Is Nothing Then
' SearchValue not found
GetValueFromExcel = ""
Else
' Return value in column C of row containing SearchValue
GetValueFromExcel = .cells(Rng.Row, "C")
End If
End With
End Function
【问题讨论】: