Страницы: 1
RSS
Получение данных из закрытого файла
 
В свое время для получения данных из закрытого файла мне рекомендовали использовать функцию Get_Value_From_Close_Book. У меня сложности по этой функции т.к. она возвращает О\ошибку типа "Значение". Я предположил что функция неверно находит путь к файлу и немного ее переделал:
Код
Function Get_Value_From_Close_Book(sPach As String, sWb As String, sShName As String, sAddress As String)
   Dim vData, objCloseBook As Object
   SW = sPach + "\" + sWb
   Set objCloseBook = GetObject(SW)
   vData = objCloseBook.Sheets(sShName).Range(sAddress).Value
   objCloseBook.Close False
   Get_Value_From_Close_Book = vData
End Function

Теперь название файла задается одним параметром а путь к файлу другим. При ввде данных в функцию она верно определяет искомое значение. Но при этом возвращает в ячейку ошибку с типом "Значение". не подскажете как поправить функцию для получения искомого результата. Заранее спасибо.
 
https://www.excel-vba.ru/chto-umeet-excel/kak-poluchit-dannye-iz-zakrytoj-knigi/#pq

А вообще намного проще - открываете файл, работаете с ним и закрываете. В чем фишка вытаскивать данные именно с закрытого файла для меня лично загадка.  
Изменено: Marat Ta - 13.04.2021 12:18:01
 
Marat Ta, к сожалению этот вариант не подходит. Придется открывать и закрывать большое количество документов. :(
 
Как я понял - эту рутинную работу будет выполнять макрос, а не вручную.

Если вам подходит этот вариант, то скину ссылку на форуме с подобной темой.
Изменено: Marat Ta - 13.04.2021 14:10:35
 
скажите мне зачем в процедуре, которая НЕ ОТКРЫВАЕТ ФАЙЛ
нужна строка
objCloseBook.Close False
и
если вы переменную назвали  objCloseBook это многообещающее название совсем не значит, что книга закрыта в это время (это самообман)
переменная objOpenBook ничем не хуже чем ваша objCloseBook, потому что не от названия переменной зависит открыта книга или закрыта, а от ее (книги) состояния

Пы.Сы.:
как только вы перестанете добывать данные из закрытых книг - у вас наладятся отношения с Excel, возможно, даже макросы начнут работать
Изменено: Ігор Гончаренко - 13.04.2021 15:03:13
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Как я понял, при выполнении этой функции файл открывается. По крайней мере, он появляется в проекте VBE.
В общем, не сильно это отличается от Workbooks.Open.
 
Ігор Гончаренко, информацию брал отсюда как получить данные не открывая книгу . Если заремить строку objCloseBook.Close False изменений в лучшую сторону не происходит. К сожалению.
 
alex_j, вам намекают, что даже вашей функцией - файл открывается, но вы этого не замечаете.
Метод Close - закрывает ранее открытый файл. То есть файл ранее был открыт кодом выше
Изменено: New - 13.04.2021 14:35:53
 
Цитата
alex_j: этот вариант не подходит. Придётся открывать и закрывать большое количество документов
И ЧТО? Электроэнергию бережёте?
Если что, макрос открывает/закрывает файлы ЗА ДОЛИ СЕКУНДЫ и оператор может даже НЕ УЗНАТЬ об этом
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
alex_j, а приложите файл из которого тянутся данные. И лист, и диапазон, значения которого нужно получить.
Выглядит так, будто ошибка в этом файле, а не в функции.
Изменено: МатросНаЗебре - 13.04.2021 14:37:46
 
МатросНаЗебре, Сейчас попробую. Из файла пересчет необходимо вытащить все данные в рабочий файл в виде столбца значений. Далее у меня идет преобразование данных в необходимый формат и дальнейшая их обработка. Т.к. Наименование файла и путь к нему может меняться я хотел подтягивать данные функцией.
Изменено: alex_j - 13.04.2021 15:14:38
 
И как вызываете функцию? Напишите значения для sPach, sWb, sShName, sAddress.
 
МатросНаЗебре, =Get_Value_From_Close_Book("C:\Users\ABMayorov\Documents\описания";J1;"лист1";A1)

Поле J1 содержит имя файла
Изменено: alex_j - 13.04.2021 15:28:18
 
А такой вараинт?
Код
Sub test()
    InsertToCell ActiveCell, "C:\Users\ABMayorov\Documents\описания", "Пересчет СДТ (1).xlsx"
End Sub

Sub InsertToCell(cl As Range, sPath As String, sWb As String)
    Dim wb As Workbook
    
    On Error Resume Next
        Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
    On Error GoTo 0
    
    If wb Is Nothing Then
    Else
        Dim sh As Worksheet
        On Error Resume Next
            Set sh = wb.Sheets(1)
        On Error GoTo 0
        
        With sh
            Dim x As Integer
            Dim y As Long
            Dim arr As Variant
            x = .Cells(1, .Columns.Count).End(xlToLeft).Column
            y = .Cells(.Rows.Count, 1).End(xlUp).Row
            If y = 1 And x = 1 Then y = 2
            
            arr = .Range(.Cells(1, 1), .Cells(y, x))
        End With
        
        wb.Close False
        
        cl.Resize(UBound(arr, 2), UBound(arr, 1)) = Application.Transpose(arr)
    End If
End Sub
Изменено: МатросНаЗебре - 13.04.2021 15:40:53
 
Цитата
alex_j написал:
=Get_Value_From_Close_Book("C:\Users\ABMayorov\Documents\описания";J1;"лист1";A1)
Полагаю, как минимум, вместо A1 должно быть "A1".
В примере из сообщения #11 имя листа должно быть "TDSheet".
И я так понимаю, Вы эту функцию вызываете для каждой ячейки. Это не оптимально. Нет, это капец, как не оптимально. Для каждой ячейки открывать из закрывать одну и ту же книгу.
Изменено: МатросНаЗебре - 13.04.2021 15:49:58
 
МатросНаЗебре, тогда должен работать и такой вариант:
Код
Sub InsertToCell(sPath As String, sWb As String)
    Dim wb As Workbook     - почему то горит как ошибка
    Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
    Dim CopyRange as Range: Set CopyRange = wb.Worksheets("Sheet1").Range("A1:r2")   - почему то тоже горит как ошибка
    Dim PasteRange As Range: Set PasteRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:B16")
    CopyRange.Copy
    PasteRange.PasteSpecial Paste:=xlPasteAll, Transpose:=True
    wb.Close False
    
End Sub

Хотя собирал вроде верно

К сожалению предложенный вами макрос не запускается
 
Цитата
alex_j написал:
Dim wb As Workbook     - почему то горит как ошибка
Здесь ошибки не вижу.

Цитата
alex_j написал:
wb.Worksheets("Sheet1").Range("A1:r2")   - почему то тоже горит как ошибка
А лист "Sheet1" есть?
Или можно заменить на такой вариант
Код
wb.Worksheets(1).Range("A1:R2") 
 
МатросНаЗебре,
скрин их excel
Подозреваю что ему не понравилось именно определение переменной wb
Скрытый текст
Изменено: alex_j - 13.04.2021 16:32:27
 
Удалите эту строку полностью. И заново наберите. Или скопируйте отсюда.
Код
Dim wb As Workbook
 
МатросНаЗебре, не помогло :(
Код
Sub InsertToCell(sPath As String, sWb As String)
    Dim wb As Workbook
    Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
    Dim CopyRange as Range: Set CopyRange = wb.Worksheets(1).Range("A1:R2")
    Dim PasteRange As Range: Set PasteRange = ThisWorkbook.Worksheets(1).Range("A1:B16")
    CopyRange.Copy
    PasteRange.PasteSpecial Paste:=xlPasteAll, Transpose:=True
    wb.Close False
End Sub
 
Ээээ. У меня этот код выполняется без ошибок.
Я сейчас какую-то глупость скажу. А закройте-откройте Excel.
 
МатросНаЗебре, не помогло. У меня вопрос: я макрос определил в Модуль1 рабочей книги. Возможно я не там его расположил?
 
Там ему самое место )
А замените имя переменной, например, на wb1.
 
МатросНаЗебре, изменение имени переменной не помогло. При попытке вызывать макрос по кнопке получаю ошибку не описаны аргументы (argument not optional)

на строки с переменной wb ошибка expected end of statement
Изменено: alex_j - 13.04.2021 17:23:01
 
На кнопку надо вешать макрос, вызывающий макрос.
Код
Sub ДляКнопки()
    InsertToCell "C:\Users\ABMayorov\Documents\описания", "Пересчет СДТ (1).xlsx"
End Sub

Sub InsertToCell(sPath As String, sWb As String)
   Dim wb As Workbook
   Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
   Dim CopyRange As Range: Set CopyRange = wb.Worksheets(1).Range("A1:R2")
   Dim PasteRange As Range: Set PasteRange = ThisWorkbook.Worksheets(1).Range("A1:B16")
   CopyRange.Copy
   PasteRange.PasteSpecial Paste:=xlPasteAll, Transpose:=True
   wb.Close False
End Sub
 
Ошибка была вызвана тем сто строки располагались не совсем та как хотел интерприт атор. Поправил. Сделал единым макросом на кнопку (запрашивает путь к файлу, имя файла берет из ячейки рабочего листа)
Код
Sub Дата()
Dim wb As Workbook
Dim sWb As String
sPath = InputBox("Укажите путь к файлу")
sWb = ThisWorkbook.Worksheets(1).Cells(1, 10).Value
Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
Dim CopyRange As Range: set CopyRange = wb.Worksheets(1).Range("A1:R2")
Dim PasteRange As Range: Set PasteRange = ThisWorkbook.Worksheets(1).Range("A1:B16")
CopyRange.Copy
PasteRange.PasteSpecial Paste:=xlPasteAll, Transpose:=True
wb.Close False
End Sub
теперь получаю ошибку что массив копировать не хочет :(
Люди добрые помогите победить этот иакрос!!! Пожалуйста!!!
Изменено: alex_j - 14.04.2021 08:27:10
 
alex_j, я походу с твоей проблемой сталкивался и решил кое-как :)  Мне требуется каждый раз в новый файл делать ВПР из матрицы, а открывать лазить в неё было ой как лень. Колхозно осуществил и магия макрорекордера
Скрытый текст

На этапе макрорекордера (моего ВПР) попробуй замени код и запиши рекордером из той своей ленивой закрытой книги, что тебе надо и перенести в новую.

Авось я угадал с твоей проблемой
 
Всем спасибо за проявленное участие в решение задачи. Утром голова думает все таки яснее. Задача решена разделением действий. Действия во внешней книге выделены в отдельный блок. если кому то будет интересно выкладываю рабочий макрос:
Код
Sub Дата()
Dim wb, ab As Workbook
Dim sWb As String
Dim sh As Worksheet
Set ab = ActiveWorkbook
sPath = InputBox("Укажите путь к файлу")
sWb = ThisWorkbook.Worksheets(1).Cells(1, 10).Value
Set wb = Workbooks.Open(sPath & "\" & sWb, False, True)
Set sh = wb.Worksheets(1)
With sh
Dim CopyRange As Range: set CopyRange = Range("A1:R2").Select
Selection.Copy
End With
ab.Worksheets(1).Range("A1:B16").PasteSpecial Paste:=xlPasteAll, Transpose:=True
wb.Close False
End Sub
 
На мой взгляд, вместо InputBox лучше использовать FileDialog.
И выделение диапазона, думаю, лишнее.
Код
Sub Дата()
    Dim wb, ab As Workbook
    Dim sWb As String
    Dim sh As Worksheet
    Set ab = ActiveWorkbook
    Set wb = ShowFileDialog()
    If Not wb Is Nothing Then
        wb.Worksheets(1).Range("A1:R2").Copy
        ab.Worksheets(1).Range("A1:B16").PasteSpecial Paste:=xlPasteAll, Transpose:=True
        wb.Close False
    End If
End Sub

Function ShowFileDialog() As Workbook
    Dim oFD As FileDialog
    Dim x, lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Title = "Выбрать файлы отчетов" 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .Filters.Add "Excel files", "*.xls*;*.xla*", 1 'устанавливаем возможность выбора только файлов Excel
'        .Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 1 'устанавливаем тип файлов по умолчанию
        .InitialFileName = "С:\Temp\Книга1.xlsx" 'назначаем папку отображения и имя файла по умолчанию
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If oFD.Show = 0 Then Exit Function 'показывает диалог
        'цикл по коллекции выбранных в диалоге файлов
        For lf = 1 To .SelectedItems.Count
            x = .SelectedItems(lf) 'считываем полный путь к файлу
            Set ShowFileDialog = Workbooks.Open(.SelectedItems(lf))  'открытие книги
            Exit For
        Next
    End With
End Function
Изменено: МатросНаЗебре - 14.04.2021 09:35:44
 
МатросНаЗебре, спасибо.
Страницы: 1
Наверх