Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


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

Цитата:
Сообщение от 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, 22:52   #12
alex777555
 
Регистрация: 30.07.2018
Сообщений: 4
Репутация: 10
По умолчанию

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

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, 06:46   #14
SAS888
Профессионал
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,150
Репутация: 1063
По умолчанию

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

Цитата:
Сообщение от 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
Казанский вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обьединение листов из закрытых книг 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


17:22.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru