Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2018, 12:19   #11
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от MaxxVer Посмотреть сообщение
Кому интересно - удалось таки решить задачу как хотел. Имена листов можно запросить не открывая книги (через ADODB), потом методом ExecuteExcel4Macro вытащить нужные данные так же не открывая книг. Работает быстро, на 6 файлов (в каждом более 30 листов), тратит не больше 2 секунд.

Выкладываю код, он правда под мои цели заточен, но принцип кто захочет поймёт..
Код:
    Dim sPath As String, sFile As String, sShName As String
    Dim sAddress As String, vData
    Dim fname As String
    Dim tn As String
    
    Dim Cnn As ADODB.Connection
    Dim rS As ADODB.Recordset

    sPath = TextBox247
    sFile = Dir(sPath & "*.xls")
    
    Do While sFile <> ""
        fname = sPath & sFile
        Set Cnn = New ADODB.Connection
        Set rS = New ADODB.Recordset
        Cnn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & fname & ";ReadOnly=1"
        Set rS = Cnn.OpenSchema(adSchemaTables)
        Do While Not rS.EOF
            tn = rS("TABLE_NAME")
            If Left(tn, 1) = "'" Then tn = Mid(tn, 2)
            
            If Len(tn) < InStr(1, tn, "$") + 2 Then
                tn = Left(tn, InStr(1, tn, "$") - 1)
                sShName = tn
                sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("C4").Address(ReferenceStyle:=xlR1C1)
                vData = ExecuteExcel4Macro(sAddress)
                If vData = TextBox201.value Then
                    TextBox3.Text = vData
                End If
                If vData = TextBox205.value Then
                    TextBox10.Text = vData
                End If
                If vData = TextBox203.value Then
                    TextBox5.Text = vData
                End If
                If vData = TextBox204.value Then
                    TextBox9.Text = vData
                End If
                If vData = TextBox207.value Then
                    TextBox15.Text = vData
                End If
                If vData = TextBox208.value Then
                    TextBox16.Text = vData
                End If
            End If
            rS.MoveNext
        Loop
        rS.Close
        sFile = Dir
    Loop
А можешь выложить пример? У меня та же проблема!!!
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 11.10.2018, 21:52   #12
alex777555
Пользователь
 
Регистрация: 30.07.2018
Сообщений: 19
По умолчанию

Цитата:
не открывая книги
хмм... видимо что-то поменялось в королевстве датском...
И слово .Open приобрело новое значение?!
Остаётся только проверить всё это при выключенном компе! А вдруг сработает!
alex777555 вне форума Ответить с цитированием
Старый 11.10.2018, 23:14   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

alex777555, Вы зря иронизируете..
погуглите.
например, https://www.excel-vba.ru/chto-umeet-...akrytoj-knigi/

ну, например, получить значение ячейки:
Код:
Sub Get_Value_From_Close_Book_Excel4Macro()
    Dim sPath As String, sFile As String, sShName As String
    Dim sAddress As String, vData
    sPath = "C:\Documents and Settings\" '"
    sFile = "Книга1.xls" '"
    sShName = "Лист1" '"
 
    sAddress = "'" & sPath & "[" & sFile & "]" & sShName & "'!" & Range("A1").Address(ReferenceStyle:=xlR1C1) '"
    vData = ExecuteExcel4Macro(sAddress)
End Sub
найдёте здесь Open ?


p.s. хотя, конечно, чудес не бывает, думаю, движок Excel сам прочитает файл и получит нужное значение.
Но прелесть в том, что сам Excel документ при этом явно открыт не будет.


p.p.s. извините за флуд. Автору топика я ничем помочь не могу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2018, 05:46   #14
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Можно получать данные, используя ExecuteExcel4Macro.
2. Можно организовать ссылку на закрытую книгу и получить требуемое значение.
И в том и в другом случае явного открытия книги-источника нет, но требуется указывать имя листа.
Если имя листа заранее не известно (о чем и говорит автор вопроса), то потребуется явное открытие книги (Open, GetObject и т.п.). Все эти методы требуют последующего закрытия проверяемых книг.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 12.10.2018, 14:54   #15
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Если имя листа заранее не известно (о чем и говорит автор вопроса), то потребуется явное открытие книги
Код из #10, процитированный в начале этой страницы, действительно позволяет получить список листов книги без открывания ее в Excel.
Более того, ADODB позволяет получить значение отдельной ячейки, в этом случае не нужно использовать ExecuteExcel4Macro: https://social.msdn.microsoft.com/Fo...odb-connection
Однако метод подключения ADODB к файлу Excel уже менялся при переходе к "ленточным" версиям Офиса и, возможно, еще поменяется в будущем. Так что код, работающий на всех версиях Офиса, должен включать проверку Application.Version, и будет несколько сложнее. А объектная модель Excel в части Workbook - Worksheet - Cell не менялась и вряд ли поменяется.
Поэтому если не гнаться за экстремальным быстродействием в ущерб надежности, лучше открывать файлы Excel в приложении Excel, а не где либо еще.
Кстати, насколько я понимаю, ADODB получает список "таблиц", который включает листы и "умные таблицы", и можно ли отличить одно от другого - не знаю.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 23.10.2018, 15:34   #16
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
1. Можно получать данные, используя ExecuteExcel4Macro.
2. Можно организовать ссылку на закрытую книгу и получить требуемое значение.
И в том и в другом случае явного открытия книги-источника нет, но требуется указывать имя листа.
Если имя листа заранее не известно (о чем и говорит автор вопроса), то потребуется явное открытие книги (Open, GetObject и т.п.). Все эти методы требуют последующего закрытия проверяемых книг.
В моём случае название книг известно и находятся в столбце А.
В таком случае можно извлечь с закрытой книги?
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 23.10.2018, 16:34   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от jungo Посмотреть сообщение
В таком случае можно извлечь с закрытой книги?
скорее всего - нет.
а напомните, пожалуйста, чем вызвано такое упорное желание прочитать именно из закрытых книг? Если книги есть, к ним есть доступ, они могут быть открыты, то почему не прочитать из ОТКРЫТЫХ книг (Открыть, прочитать, закрыть)?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2018, 13:31   #18
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
скорее всего - нет.
а напомните, пожалуйста, чем вызвано такое упорное желание прочитать именно из закрытых книг? Если книги есть, к ним есть доступ, они могут быть открыты, то почему не прочитать из ОТКРЫТЫХ книг (Открыть, прочитать, закрыть)?
Serge_Bliznykov

Просто потому что их очень много... (100>).
Так как варианта с закрытыми книгами мне не удалось получить, буду рад варианту с открытием:
1. Название книги в столбце А
2. Все книги в одной и той же папке
3. В каждой книге ВСЕГДА только один лист

Нужно в столбец B , напротив каждой книги записать название его листа.

Можете помочь?
Jungo must die!!! (C) Bill Gates.
jungo вне форума Ответить с цитированием
Старый 13.11.2018, 13:45   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от jungo Посмотреть сообщение
Просто потому что их очень много... (100>).
да хоть тысяча. Вас беспокоит то, что скрипт во время работы "устанет" ?
или время работы скрипта должно быть строго в ограниченное время?


Цитата:
Сообщение от jungo Посмотреть сообщение
Можете помочь?
думаю, что да.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.11.2018, 17:17   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от jungo Посмотреть сообщение
Нужно в столбец B , напротив каждой книги записать название его листа.
попробуйте такой макрос:
Код:
Sub Кнопка1_Щелчок()
Dim i As Long, LastRow As Long, FN As String, FNamePath As String
Dim wbSrc As Workbook, shSrc As Worksheet

LastRow = ThisWorkbook.Worksheets("Лист1").Cells(Rows.Count, 1).End(xlUp).Row
FNamePath = ThisWorkbook.Path & "\"

On Error Resume Next
Application.ScreenUpdating = False
For i = 1 To LastRow
  FN = FNamePath & ThisWorkbook.Worksheets("Лист1").Cells(i, "A").Value
  Set wbSrc = Workbooks.Open(FN, ReadOnly:=True)
  Set shSrc = wbSrc.Worksheets(1)
  
  ThisWorkbook.Worksheets("Лист1").Cells(i, "B").Value = shSrc.Name
  
  wbSrc.Close False
Next
Application.ScreenUpdating = True

MsgBox " Готово!"
End Sub
p.s. собственно либо поместите это макрос в свою книгу,
где на "Лист1" в столбце A перечислены имена файлов (только имен, БЕЗ директории),
либо в макросе измените книгу и имя листа.
Файл должен находится там же, где находятся файлы.


p.p.s. код тупой и грубый, написал как мог...
Уверен, что тут есть форумчане, которые легко смогут его переписать красиво.
если это нужно
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьединение листов из закрытых книг Extril Microsoft Office Excel 31 28.11.2013 12:55
Получение имён, отправка ID. Как правильно обработать? Jopses JavaScript, Ajax 0 02.02.2013 02:54
Макрос аля ВПР для формирования свода из закрытых книг MaxxVer Microsoft Office Excel 15 28.08.2012 12:02
Получение данных из множества закрытых книг книг hardkain Microsoft Office Excel 1 27.09.2011 20:18
копирование листов из закрытых книг mephist Microsoft Office Excel 4 10.07.2009 17:18