Тема: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Помогите решить проблему:
-есть много .XLS файлов с которых надо взять информацию
При открытии-взятие информации -закрытии  происходит мерцание экрана
как сделать, чтобы инф-ия бралась для VBA без активизации книги из которой, она берется

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

В экселе есть свойство ScreenUpdating (true или false) Как запускать из автокада - не знаю, никогда не занимался. Посмотрите в этом направлении.

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> km2005
для чего же тогда окно екселя отображать, если смотреть на него не надо ?

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Sidor, ogromennoe spasibo nastavil na put' istinnyi

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> km2005
Воспользуйся ADODB.Connection
Через Microsoft.Jet.OLEDB.4.0
Все будет нормально читаться, а эксель вообще не будет загружаться...
Если интересно, могу выложить код на лиспе.

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Хочу добавить, что этот способ работает, даже если на компьютере вообще не установлен эксель!

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Евгений Елпанов
Ну заинтриговал, конечно всем интересно!
~'J'~

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Евгений Елпанов пишет:

Все будет нормально читаться,

этот способ работает, даже если на компьютере вообще не установлен эксель!

Это, видимо, будет работать, только если из Excel считывается информация представленная в табличном (типа таблиц Access) виде. А иногда приходится считывать и не собранные в упорядоченную таблицу данные. Например, из объединеных ячеек.
Кроме этого, на компьютере должны присутствовать файлы для работы с базами данных. Эти файлы, по моему, как раз и устанавливаются при установке Офиса (в общем случае).
Все это сказано не в противовес, а только лишь для полноты картины.

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> brigval
Эти файлы устанавливаются вместе с виндой...

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Придется вам подождать окончания праздников...
Посмотрел дома - нет этой программы, только аналог для Акссеса, но я его уже выкладывал на этом форуме. Придется подождать до десятого мая.
Если кто-то разрабатывал программы доступа к базам данных через ADODB.Connection - то можно их адаптировать для чтения из экселя, единственно, советую выбрать драйвер
Microsoft.Jet.OLEDB.4.0
Т.к. он позволяет считывать первую строку таблицы как данные, а другие драйверы ее считают строкой заголовков столбцов...
По поводу представления данных и в правду есть некоторые проблемы, например, по умолчанию при запросе к базе данных (SQL) считается, что во всей колонке данные одинаковых типов, т.е. все цифры или строки. Есть возможность отображать эти колонки целиком как текст. Я поступаю по другому - создаю отдельный запрос для каждой строки, тогда в каждой ячейке могут быть разные типы данных...

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Евгений Елпанов пишет:

Эти файлы устанавливаются вместе с виндой...

Почему-то не всегда :(
В интернете есть обновление от Microsoft для работы с базами данных. Файл Mdac_typ.exe (ок. 5 МБ). Если его установить, то снимаются все проблемы доступа к БД. Проверено на NT4, W98 и т.д.

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> brigval
Возможно...
Я проверял на примере XP + акад2004  работает, причем, кроме голого XP и автокада ничего не стояло...

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Как и обещал...
Вот вариант, считывающий из таблицы все данные из всех листов в список.
Этот вариант немного более наворочен для считывания неоднородных данных.
Если кому-то нужна программа для считывания однородных данных (в каждом столбце данные одного типа, возможен вариант другого типа в первой строке - названия столбцов) могу выложить - работать будет быстрее...

(defun rec-rem-dupl (lst)
  (if lst
    (cons (car lst) (rec-rem-dupl (vl-remove (car lst) (cdr lst))))
  ) ;_  if
) ;_  defun
(defun GET_xl (tbl / ADOCONNECT ADORECORDSET LST)
  ;(setq tbl "D:\\7.xls")
  ;(GET_xl tbl)
  (setq
    ADOConnect     (vlax-get-or-create-object "ADODB.Connection")
    ADORecordset (vlax-get-or-create-object "ADODB.Recordset")
  ) ;_  setq
  (if (not (vl-catch-all-error-p
         (vl-catch-all-apply
           (function vlax-invoke-method)
           (list
         ADOConnect
         "Open"
         (strcat
           "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
           tbl
           ";Extended Properties=;Excel 8.0;HDR=No"
         ) ;_  strcat
         "admin"
         ""
         nil
           ) ;_  list
         ) ;_  vl-catch-all-apply
       ) ;_  vl-catch-all-error-p
      ) ;_  not
    (progn
      (setq lst
         (mapcar
           (function
         (lambda (l / i c)
           (vlax-invoke-method
             ADORecordset
             "Open"
             (strcat "SELECT * FROM [" l "]")
             ADOConnect
             1
             3
             nil
           ) ;_  vlax-invoke-method
           (setq
             i (length
             (car
               (vlax-safearray->list
                 (vlax-variant-value
                   (vlax-invoke-method
                 ADORecordset
                 "GetRows"
                 65535
                   ) ;_  vlax-invoke-method
                 ) ;_  vlax-variant-value
               ) ;_  vlax-safearray->list
             ) ;_  car
               ) ;_  length
           ) ;_  setq
           (vlax-invoke-method ADORecordset "Close")
           (while (not (zerop i))
             (vlax-invoke-method
               ADORecordset
               "Open"
               (strcat "SELECT * FROM [" l "a" (itoa i) ":IV" (itoa i) "]")
               ADOConnect
               1
               3
               nil
             ) ;_  vlax-invoke-method
             (setq
               c (cons (car (apply
                      (function mapcar)
                      (cons
                    'list
                    (mapcar
                      (function
                        (lambda (a)
                          (mapcar
                        (function
                          (lambda (b)
                            (vlax-variant-value b)
                          ) ;_  lambda
                        ) ;_  function
                        a
                          ) ;_  mapcar
                        ) ;_  lambda
                      ) ;_  function
                      (vlax-safearray->list
                        (vlax-variant-value
                          (vlax-invoke-method
                        ADORecordset
                        "GetRows"
                        65535
                          ) ;_  vlax-invoke-method
                        ) ;_  vlax-variant-value
                      ) ;_  vlax-safearray->list
                    ) ;_  mapcar
                      ) ;_  cons
                    ) ;_  apply
                   ) ;_  car
                   c
             ) ;_  cons
               i (1- i)
             ) ;_  setq
             (vlax-invoke-method ADORecordset "Close")
           ) ;_  while
           (if (equal c '((nil) (nil)))
             (list l)
             (cons l c)
           ) ;_  if
         ) ;_  lambda
           ) ;_  function
           (rec-rem-dupl
         (caddr
           (mapcar
             (function
               (lambda (a)
             (mapcar
               (function
                 (lambda (b)
                   (vlax-variant-value b)
                 ) ;_  lambda
               ) ;_  function
               a
             ) ;_  mapcar
               ) ;_  lambda
             ) ;_  function
             (vlax-safearray->list
               (vlax-variant-value
             (vlax-invoke-method
               (vlax-invoke-method
                 ADOConnect
                 "OpenSchema"
                 4
               ) ;_  vlax-invoke-method
               "GetRows"
               65535
             ) ;_  vlax-invoke-method
               ) ;_  vlax-variant-value
             ) ;_  vlax-safearray->list
           ) ;_  apply
         ) ;_  caddr
           ) ;_  rec-rem-dupl
         ) ;_  mapcar
      ) ;_  setq
      (vlax-invoke-method ADOConnect "Close")
      (vlax-release-object ADORecordset)
      (vlax-release-object ADOConnect)
      (setq ADORecordset nil
        ADOConnect nil
      ) ;_  setq
      lst
    ) ;_  progn
    (progn
      (vl-catch-all-apply
    'vlax-invoke-method
    (list ADOConnect "Close")
      ) ;_  vl-catch-all-apply
      (vlax-release-object ADORecordset)
      (vlax-release-object ADOConnect)
      (setq ADORecordset nil
        ADOConnect nil
      ) ;_  setq
      nil
    ) ;_  progn
  ) ;_  if
) ;_  defun

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Евгений Елпанов
Спасибо, есть теперь над чем поворчать
длинными белыми ночами...
~'J'~

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Олег(jr.)
В смысле поворчать?
Код, вроде как, работает...

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Евгений Елпанов
В прямом смысле: научится чему-нибудь путному от
мастеров пера!
Мое уважение
Олег
~'J'~

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Олег(jr.)
Я у вас тоже многому научился!
   Хотелось бы добавить, что тем же методом, можно добавлять новые записи в файл, удалять, добавлять таблицы, да и вообще делать с данными в таблице все, что захочется...
PS. Правда, я такого не реализовывал, применительно к экселю, но по аналогии со взрослыми базами данных, это возможно и даже совсем не сложно. Нужно только правильно составить SQL запрос и немного дописать/переделать мою програмку...

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Евгений Елпанов
Ну ты и выдал!
Бесподобная программа, читает все что не дай,
я правда передвинул lst в самый конец, поправь,
пожалуйста, видимо, при правке ты сдвинул его
Поздравляю, это претендент №1 на "Программу года"!
IMHO
~'J'~

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Посмотрел ваш вариант, отвечаю...
Нет никакой разницы, где ставить возвращаемое значение. Если не удалось открыть объект ADODB.Connection то и в списке будет пусто.

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

> Евгений Елпанов
Согласен, просто в своем стиле я ставлю возвращаемое
значение в конец, а так - да, разницы нет...
~'J'~

Re: Как избавиться от мерцания экрана при считывание информации из Excel-файла?

Вчера было найденно ограничение на работу программы...
Если в таблице присутствуют данные, то обязательно в первой строке табицы, хотя бы в одной ячейке, должны присутствовать данные.
Короче, если есть не пустая таблица но первая строка пустая, то будет ошибка. Это относится только к первой строке, все остальные строки могут быть с данными или без, по вашему вкусу...
Забыл добавить, если в файле несколько листов - таблиц, то это относится ко всем листам...