Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить, что данные закончили грузиться в лист, По таймеру или как ? 
V
    Опции темы
Voldemar2004
  Дата 24.11.2010, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Excel автозапускается из сторонней программы, открывается Лист1 и в него из массива из этой программы пишутся данные. Затем после того, как все данные загрузились, требуется автозапуск макроса для обработки в Excel.

Сейчас делаю просто с помощью такой функции:

Код

Option Explicit

Public Sub TimeDelay(Value As Long)

Dim Y As Long

Y = Timer + Value
Do While Timer < Y
    DoEvents
Loop

End Sub


задержку перед запуском макроса секунд 10. А если все данные в Excel уже загружены были за 2 секунды ? Или они будут грузиться 1 минуту ?

Есть способ определить, что если количество строк в Листе1 не меняется в течении 3 секунд, то делать автозапуск макроса ? Или вручную писать функцию ?


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 24.11.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Voldemar2004 @  24.11.2010,  10:38 Найти цитируемый пост)
Есть способ определить, что если количество строк в Листе1 не меняется в течении 3 секунд

Есть... а зачем?
Во-первых, несложно запустить макрос извне.
Во-вторых, вполне можно настроить макрос считать окончанием загрузки, например, появления строка "усё!" в ячейке А1 (чтобы не мешало - белым по белому, скажем). Кстати, макрос сначала может вычистить этот маркер, а потом заниматься своими делами.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voldemar2004
  Дата 24.11.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Akina
Цитата(Akina @  24.11.2010,  15:11 Найти цитируемый пост)
Во-вторых, вполне можно настроить макрос считать окончанием загрузки
Дело в том, что загрузка происходит с помощью OLE, не макросом и совсем из здругого языка smile , не из VB, данные могут загружаться и 10 секунд, и 5 минут. И надо, чтобы сразу после загрузки этих данных (окончание надо отследить !) запускался уже макрос VBA Excel.

Цитата(Akina @  24.11.2010,  15:11 Найти цитируемый пост)
появления строка "усё!" в ячейке А1 (чтобы не мешало - белым по белому, скажем)

Это я уже догадался smile) но опять, надо все время крутить в цикле проверку по всему листу в Excel, что данные больше не добавляются smile


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 24.11.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Voldemar2004 @  24.11.2010,  17:14 Найти цитируемый пост)
но опять, надо все время крутить в цикле проверку по всему листу в Excel, что данные больше не добавляются  

Ясен пень надо! не хочешь? ну тогда предлагаю такой костыль:

Делаем шаблон. В нём - макрос, который запускается при открытии книги. Если макрос обнаруживает на [Лист1] данные - он выполняет обработку, иначе просто завершается.
Далее - программа открывает этот шаблон. Макрос срабатывает, данных нет, он тут же завершается. Программа заполняет лист данными из массива и сохраняет (SaveAs - дабы не поганить шаблон) файл на диск. И тут же открывает снова. Макрос опять срабатывает, обнаруживает данные и выполняет требуемые действия.





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voldemar2004
  Дата 25.11.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



В сторонней программе пишу "END" в самый конец листа Excel, затем вызываю функцию:

Код

Option Explicit

Private Function DataIsLoaded() As Boolean

Dim Flag As Boolean
Flag = False

Do While Flag <> True
        
        Dim i As Long
        
        For i = 1 To ActiveSheet.UsedRange.Rows.Count + 2
            DoEvents
            If Cells(i, 1) = "END" Then Flag = True
        Next i
    DoEvents
Loop

DataIsLoaded = Flag

End Function


если она вернула true, то сразу же запускаю макрос уже из Excel.  smile 


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 25.11.2010, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Мда...
1) Зачем флаг? DataIsLoaded - такая же переменная, работай прямо с ней.
2) Do While Flag <> True
А почему не 
Do While NOT Flag
3) If Cells(i, 1) = "END" Then Flag = True
А почему не
Flag = (Cells(i, 1) = "END")
4) Зачем организовывать свой цикл, если есть Range.Find?

И почему не поместить твой "END" в самом начале, чтобы проверять ОДНУ ячейку с известным (А1, например) адресом?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voldemar2004
  Дата 25.11.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(Akina @  25.11.2010,  10:36 Найти цитируемый пост)
3)
Код

 If Cells(i, 1) = "END" Then Flag = True

А почему не
Код

Flag = (Cells(i, 1) = "END")


Тоже самое, только записано по-другому.

Цитата(Akina @  25.11.2010,  10:36 Найти цитируемый пост)
2)
Код

 Do While Flag <> True

А почему не 
Код

Do While NOT Flag


Тоже самое, только записано по-другому.

Цитата(Akina @  25.11.2010,  10:36 Найти цитируемый пост)
И почему не поместить твой "END" в самом начале, чтобы проверять ОДНУ ячейку с известным (А1, например) адресом?


Откуда будет известен этот 
Цитата(Akina @  25.11.2010,  10:36 Найти цитируемый пост)
 (А1, например) адресом?
 ??  smile Если загружаемых строк может быть 10, а может быть миллион smile и ячейки соответственно сдвигаются вниз smile

Добавлено @ 09:53
Код

Private Function DataIsLoaded() As Boolean

Do While Not DataIsLoaded
        Dim i As Long
        For i = 1 To ActiveSheet.UsedRange.Rows.Count + 2
            DoEvents
            DataIsLoaded = (Cells(i, 1) = "END")
        Next i
Loop

End Function


Это сообщение отредактировал(а) Voldemar2004 - 25.11.2010, 09:57


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 25.11.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Voldemar2004 @  25.11.2010,  10:47 Найти цитируемый пост)
загружаемых строк может быть 10, а может быть миллион

Сначала загружаются данные. А потом ставится признак. Но почему он ставится ПОСЛЕ загруженных данных? не по времени - по месту расположения...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voldemar2004
Дата 25.11.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(Akina @  25.11.2010,  11:03 Найти цитируемый пост)
А потом ставится признак. Но почему он ставится ПОСЛЕ загруженных данных? не по времени - по месту расположения...


Сверху шапка таблицы, количество данных каждый раз разное smile по времени тут никак нельзя вообще smile так что все норм smile


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 25.11.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Цитата(Voldemar2004 @  25.11.2010,  11:46 Найти цитируемый пост)
Сверху шапка таблицы

Вот и убери в неё признак загрузки - она же статическая, адреса ячеек известны... скажем, после окончания загрузки данных делаешь шрифт в неиспользуемой ячейке жирным (или там зелёным). И проверять надо только этот параметр и только у этой (одной и с известным адресом) ячейки.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voldemar2004
  Дата 25.11.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Akina, ну улучшать и придумывать можно до бесконечности smile главное все правильно работает smile а те тысячные доли секунды, которые я сэкономлю роли уже не играют.


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Akina
Дата 25.11.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Ну не надо так не надо... мне-то что.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.