Активировать рабочий лист из Outlook VBA - PullRequest
1 голос
/ 02 апреля 2019

На ПК с Windows 10 я использую Office профессиональный плюс 2013-32 бит, включая Outlook и Excel. У меня есть макрос в Outlook, который отправляет электронные письма.

Этот макрос использует две рабочие книги: одну в качестве источника данных, а другую в качестве журнала.

У меня проблемы с активацией листа источника данных. Я не получаю сообщение об ошибке VBA, но при тестировании обнаруживается, что активация не удалась.

См. Строку: varTest = ActiveSheet.Name. Вот некоторые части макроса:

 Public objEmailWorkbook         As Excel.Workbook
 Public objEmailWorksheet        As Excel.Worksheet
 Public objLogWorkbook           As Excel.Workbook
 Public objLogWorksheet          As Excel.Worksheet
Sub Send_Emails()
 Dim objExcelApp                 As Excel.Application
 Dim strLogFullName              As String
 'Instantiate an instance of the Excel application.
 Set objExcelApp = CreateObject("Excel.Application")
 strXlsPathName = Environ("USERPROFILE") & "\Documents\"
 strLogFileName = "email_log.xlsx"
 strLogFullName = strXlsPathName & strLogFileName
 'Instantiate the Log Workbook object
 Set objLogWorkbook = objExcelApp.Workbooks.Open(strLogFullName, True, False)
 'There's only one worksheet in the Log workbook.  Identify the Log sheet name.
 strLogSheetName = objLogWorkbook.Sheets(1).Name
 'Instantiate the Log Worksheet object
 Set objLogWorksheet = objLogWorkbook.Sheets(strLogSheetName)
 objLogWorksheet.Activate

 'Instantiate the eMail Address Workbook object
 strEmailFileName = "emailTest.csv"
 strEmailFullName = strXlsPathName & strLogFileName
  'Instantiate the Email Worksheet object
 Set objEmailWorkbook = objExcelApp.Workbooks.Open(strEmailFullName, True, False)
 'There is only one sheet within a workbook.
 'Determine the eMail address sheet name.
 strEmailSheetName = objEmailWorkbook.Sheets(1).Name

 'Instantiate the eMail address worksheet object
 Set objEmailWorksheet = objEmailWorkbook.Sheets(strEmailSheetName)
 objEmailWorksheet.Activate
 '***Other Processing Code Here
 '***lngLastSheetCol and strSheetFieldName values are set here
 'Re-activate objEmailWorksheet
 '***The following ACTIVATE command doesn't appear to work
 objEmailWorksheet.Activate
 varTest = ActiveSheet.Name
 'Define rngSearchText as the header row in the worksheet
 Set rngSearchText = ActiveSheet.Range(Cells(1, 1), Cells(1, lngLastSheetCol))
 With rngSearchText
   'Find the column in the worksheet for strSheetFieldName
   Set rngFoundText = .Find(What:=strSheetFieldName, LookAt:=xlWhole, _
                                         MatchCase:=False, SearchFormat:=False)
   If Not rngFoundText Is Nothing Then
     lngFoundTextCol = rngFoundText.Column
   End If
 End With
Exunt:
Set objEmailWorksheet = Nothing
Set objEmailWorkbook = Nothing
Set objLogWorksheet = Nothing
Set objLogWorkbook = Nothing
Set objExcelApp = Nothing
Set rngSearchText = Nothing
Set rngFoundText = Nothing

End Sub

Команда objEmailWorksheet.Activate никогда не работает. Когда я шагаю по коду, varTest имеет значение «log». Я знаю, что значение листа EMail - "emailTest".

Поскольку рабочий лист электронной почты не активирован, следующий поиск не даст правильных результатов.

Есть ли другой способ активировать рабочий лист или иным образом решить проблему?

1 Ответ

4 голосов
/ 02 апреля 2019

Необходимо указать приложение Excel objExcelApp

varTest = objExcelApp.ActiveSheet.Name

Я рекомендую всегда активировать Option Explicit: в редакторе VBA перейдите на Инструменты Параметры Требуется объявление переменной .

, но вместо этого я рекомендую следующее

'objEmailWorksheet.Activate 'you don't need activate at all
'varTest = objEmailWorksheet.Name 'this line is not needed too

Set rngSearchText = objEmailWorksheet.Range(objEmailWorksheet.Cells(1, 1), objEmailWorksheet.Cells(1, lngLastSheetCol))

Укажите для каждые Range и Cells, в рабочей таблице которых указан диапазон или ячейка.В противном случае Excel не может этого знать.Если вы делаете это, вам никогда не нужно .Activate каких-либо листов вообще.

Возможно, вам будет полезно прочитать Как избежать использования Select в Excel VBA .То же самое для .Activate следует избегать везде, где это возможно.


Также эти 3 строки

 strLogSheetName = objLogWorkbook.Sheets(1).Name
 Set objLogWorksheet = objLogWorkbook.Sheets(strLogSheetName)
 'objLogWorksheet.Activate 'don't need to activate!

можно просто уменьшить до 1 строки

 Set objLogWorksheet = objLogWorkbook.Sheets(1)

и эти 2 строки

strEmailSheetName = objEmailWorkbook.Sheets(1).Name
Set objEmailWorksheet = objEmailWorkbook.Sheets(strEmailSheetName)

можно просто уменьшить до 1 строки

Set objEmailWorksheet = objEmailWorkbook.Sheets(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...