Откройте приложение в окне Excel и скопируйте, чтобы открыть книгу

Использование Outlook VBA – я хотел бы открыть вложение в конкретном экземпляре excel, а затем скопировать листы из этого приложения в открытую книгу.

Я использовал несколько фрагментов кода из ( Сохранение вложений Outlook с датой в имени файла и Проверка, чтобы открыть, открыт ли Excel (из другого приложения Office 2010), чтобы сохранить вложение из электронной почты, а затем найти окно Excel, которое мне нужно откройте его – оба работают в изолированных макросах проверки outlook.

Проблема в том, что я не могу связать две части вместе в рабочий код, в конце всего этого у меня есть:

Option Explicit Private Declare Function newFindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function AccessibleObjectFromWindow& Lib "oleacc" _ (ByVal hwnd&, ByVal dwId&, riid As newGUID, xlWB As Object) Private Const newOBJID_NATIVEOM = &HFFFFFFF0 Private Type newGUID lData1 As Long iData2 As Integer iData3 As Integer aBData4(0 To 7) As Byte End Type Sub AttachmentToExcel() Dim obj As Object Dim msg As Outlook.MailItem Dim objAtt As Object, iDispatch As newGUID Dim sPath As String, sFileName As String, sFile As String, filewithoutExt As String Dim attachFileName As String, DealID As String Dim srcWorkbook As Object sPath = "\\eu.insight.com\users\mklefass\Data\Desktop\" sFileName = "Test Workbook.xlsx": filewithoutExt = "Test Workbook.xlsx" sFile = sPath & sFileName Set obj = GetCurrentItem If TypeName(obj) = "MailItem" Then Set msg = obj DealID = FindDealID(msg.Subject) For Each objAtt In msg.Attachments If Right(objAtt.FileName, 4) = ".txt" Then attachFileName = "C:\Users\mklefass\Desktop\tmp\" & objAtt.FileName & ".tsv" objAtt.SaveAsFile attachFileName Set objAtt = Nothing End If Next ' Find window that has our main workbook open Dim dsktpHwnd As Long, hwnd As Long, mWnd As Long, cWnd As Long, wb As Object newSetIDispatch iDispatch dsktpHwnd = GetDesktopWindow hwnd = newFindWindowEx(dsktpHwnd, 0&, "XLMAIN", vbNullString) mWnd = newFindWindowEx(hwnd, 0&, "XLDESK", vbNullString) While mWnd <> 0 And cWnd = 0 cWnd = newFindWindowEx(mWnd, 0&, "EXCEL7", filewithoutExt) hwnd = newFindWindowEx(dsktpHwnd, hwnd, "XLMAIN", vbNullString) mWnd = newFindWindowEx(hwnd, 0&, "XLDESK", vbNullString) Wend '~~> We got the handle of the Excel instance which has the file If cWnd > 0 Then '~~> Bind with the Instance Debug.Print AccessibleObjectFromWindow(cWnd, newOBJID_NATIVEOM, iDispatch, wb) '~~> Work with the file Set srcWorkbook = wb.accParent.Application.Workbooks.Open(attachFileName) 'srcWorkbook.Worksheets(sheetNr).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) srcWorkbook.Close Set srcWorkbook = Nothing End If End If End Sub Private Sub newSetIDispatch(ByRef ID As newGUID) With ID .lData1 = &H20400 .iData2 = &H0 .iData3 = &H0 .aBData4(0) = &HC0 .aBData4(1) = &H0 .aBData4(2) = &H0 .aBData4(3) = &H0 .aBData4(4) = &H0 .aBData4(5) = &H0 .aBData4(6) = &H0 .aBData4(7) = &H46 End With End Sub 

SetIDispatch, Findwindowex, accessobjectfromwindow определены в Check, чтобы увидеть, открыт ли Excel (из другого приложения Office 2010) и совпадают в моем коде.

Последняя строка не удалась, с ошибкой 438 времени выполнения: Object не поддерживает это свойство или метод. Это говорит мне о том, что я, вероятно, лаяю неправильное дерево – я боюсь, что я не знаю, к какому дереву стремиться!

Заранее спасибо.

Две проблемы: AccessibleObjectFromWindow возвращает объект Window а метод Open является членом Application.Workbooks ; и заголовок окна не имеет расширения файла.

Итак, чтобы решить первый вопрос:

 Set srcWorkbook = wb.Application.Open(attachFileName) 

должен стать:

 Set srcWorkbook = wb.Parent.Application.Workbooks.Open(attachFileName) 

А для второго в некоторых установках Excel:

 cWnd = FindWindowEx(mWnd, 0&, "EXCEL7", "Test Workbook.xlsx") 

может потребоваться стать:

 cWnd = FindWindowEx(mWnd, 0&, "EXCEL7", "Test Workbook") 

Примечание для будущих читателей: похоже, это зависит от версий Windows и Excel, и включите ли вы «Скрыть известные расширения файлов» в опциях проводника Windows.

Наконец, кажется, что имена окон должны быть указателями (только в 64-битном Office):

 Dim dsktpHwnd As Long, hwnd As Long, mWnd As Long, cWnd As Long, wb As Object 

должен стать:

 Dim dsktpHwnd As LongPtr, hwnd As LongPtr, mWnd As LongPtr, cWnd As LongPtr, wb As Object 
  • Как экспортировать всю почтовую форму из определенной папки из Outlook в Excel
  • Ошибка отклонения метода VBA .Attachments.Add
  • Получение единой записи в Outlook Outlook для экспорта макроса vba на основе имени
  • Удалить текст до и после определенной строки по электронной почте (до определенного слова)
  • Вставить текст, гиперссылку и таблицу в тело письма
  • Сканировать выделенные ячейки (ы) для конкретного текста и пересылать почту правильному получателю (получателям)
  • Excel VBA для обработки и пересылки писем, вызывающих ошибку «Недостаточно памяти»
  • Открыть файл из Outlook в Excel и сохранить в другом формате в зависимости от отправителя
  • Вывод в Excel из Outlook с помощью VBA
  • Вставить конкретный диапазон excel в обзорную встречу
  • Как скопировать диапазон из excel в outlook, игнорируя первый столбец, где применим фильтр?
  • Interesting Posts

    Ошибка открытия файла Excel из C # .Net (VS2010)

    Использование класса Pre-Made Stringbuilder

    Удаление строк с нулями в них для нескольких наборов данных с тысячами строк

    Пакет не существует: отдельные классы

    Сравнение хэшей MD5 между файлами XLSX с идентичным контентом

    Как получить диапазон ячеек в определенном размере массива

    Vba, Excel, Изменение базы калькуляции в выпадающем списке и очистка ячейки, когда другие пустые

    Pandas: сравнение даты с добавлением столбцов на основе значений в строках

    Excel VBA для выбора конкретных рабочих листов из ячеек, чтобы сохранить как 1 pdf

    запись данных, хранящихся в массиве, на несколько листов excel с использованием PHP

    Java Apache POI – добавление формулы для целой строки

    Экспорт таблицы таблиц Ruby on Rails в файл .xls

    Ошибка выполнения 5 Иногда в VBA Создание сводной таблицы

    У меня проблемы с использованием reDim в VBA, не могу понять, как это работает

    извлечь номер строки результата функции

    Давайте будем гением компьютера.