Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Определить, что данные закончили грузиться в лист


Автор: Voldemar2004 24.11.2010, 09:38
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 секунд, то делать автозапуск макроса ? Или вручную писать функцию ?

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

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

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

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

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

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

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

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



Автор: Voldemar2004 25.11.2010, 09:29
В сторонней программе пишу "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 

Автор: Akina 25.11.2010, 09:36
Мда...
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, например) адресом?

Автор: Voldemar2004 25.11.2010, 09:47
Цитата(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

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

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

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


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

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

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

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

Автор: Akina 25.11.2010, 11:03
Ну не надо так не надо... мне-то что.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)