Страницы: 1
RSS
Как выбрать созданную, но не сохраненную книгу excel
 

Коллеги, добрый день!

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

Есть открытая, но не сохраненная, книга «Книга1», созданная посторонней программой.

Необходимо скопировать диапазон ячеек из этой книги на лист в книгу с макросами и закрыть книгу1.

 
Как вариант - выполнить макрос в приложении этой книги, и при активной этой книге - и соответственно первым делом в коде запоминать в переменную активную книгу.
 
Код
Function GetNotSavedWB() As Workbook
    Dim wb As Workbook
    For Each wb In Workbooks
        If wb.Path = "" Then
            Set GetNotSavedWB = wb
            Exit For
        End If
    Next
End Function
 
Цитата
vvlad1962 написал:
Есть открытая, но не сохраненная, книга «Книга1», созданная посторонней программой
В этом случае, без привязки к каким либо данным внутри - нет гарантии что это будет именно та книга. Проверьте, кто при таком создании является автором thisworkbook.author . Если не пользователь, то сравнив с Application.User можно сделать вывод что автоматически создано.
По вопросам из тем форума, личку не читаю.
 
thisworkbook.author - Администратор.
Описанная функция эту несохраненную книгу не видит.
 
Цитата
vvlad1962 написал:
Описанная функция эту несохраненную книгу не видит
а Вы уверены, что эта книга создана и открыто в том же экземпляре Excel, из которого макрос вызывается? Попробуйте из неё скопировать ячейки и вставить в книгу с кодом через Специальную вставку. Если вставка будет работать как обычно - значит обе книги в одном экземпляре. Если вставка предложит вставить как исключительно как Текст(в разных форматах) - то в разных.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Похоже, что в другом экземпляре Excel. Побороть можно?
 
Код
Option Explicit
#If VBA7 Then
  Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _
    ByVal hwnd As LongPtr, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long  Private Declare PtrSafe Function FindWindowExA Lib "user32" ( _
    ByVal hwndParent As LongPtr, ByVal hwndChildAfter As LongPtr, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As LongPtr
#Else
  Private Declare Function AccessibleObjectFromWindow Lib "oleacc" ( _
    ByVal hwnd As Long, ByVal dwId As Long, riid As Any, ppvObject As Object) As Long  Private Declare Function FindWindowExA Lib "user32" ( _
    ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As Long
#End If
Sub Test()
  Dim wb As Workbook
  Set wb = GetNotSavedWbFromAnotherApp
  Debug.Print wb.FullName
  
End Sub
Function GetNotSavedWbFromAnotherApp() As Workbook
    Dim wb As Workbook
  Dim xl As Application
  For Each xl In GetExcelInstances()
    'Debug.Print "Handle: " & xl.ActiveWorkbook.FullName
    For Each wb In Workbooks
        If wb.Path = "" Then
            Set GetNotSavedWbFromAnotherApp = wb
            Exit For
        End If
    Next
  Next
End Function
Public Function GetExcelInstances() As Collection
  Dim guid&(0 To 3), acc As Object, hwnd, hwnd2, hwnd3
  guid(0) = &H20400
  guid(1) = &H0
  guid(2) = &HC0
  guid(3) = &H46000000  Set GetExcelInstances = New Collection
  Do
    hwnd = FindWindowExA(0, hwnd, "XLMAIN", vbNullString)
    If hwnd = 0 Then Exit Do
    hwnd2 = FindWindowExA(hwnd, 0, "XLDESK", vbNullString)
    hwnd3 = FindWindowExA(hwnd2, 0, "EXCEL7", vbNullString)
    If AccessibleObjectFromWindow(hwnd3, &HFFFFFFF0, guid(0), acc) = 0 Then
      GetExcelInstances.Add acc.Application
    End If
  Loop
End Function
 
а книга точно открыта на Вашем компьютере и не удаленным рабочим столом?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Огромное спасибо!
Осознал свою ошибку, понял, что нужно делать. Все получилось.
Страницы: 1
Наверх