powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
172 сообщений из 172, показаны все 7 страниц
Долгая обработка текстовых данных в Экселе
    #36545764
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.
Есть файл Эксела с рабочей областью около 20000 ячеек, с помощью макросов на VBA обеспечивается передача данных на сервер вычислителю и обработка поступивших от него данных.
Данные посылаются и принимаются в виде строки. Для данного файла это около 200 кБ.
Основная проблема во времени. Для 7000 ячеек, например, формирование строки занимает около 10 секунд, а обработка поступивших данных и их отображение в таблице - около 1 мин 20 сек. Для такого размера таблицы это много.
А для 20000 ячеек вообще чуть ли не 20 минут все это делается.
Конечно, можно передавать только изменившиеся по сравнению с прошлым вариантом ячейки, но если их будет много, то все равно нужно ускорить это.
Сейчас все это делается в цикле, каждой ячейке присваивается полученное значение. Здесь в принципе тоже можно сократить объем данных, если обновлять только изменившиеся ячейки.
Но даже так может получаться общее время около 1 мин. Нет ли способа принципиально это ускорить? Может быть, с помощью базы данных - генерировать файл БД в формате .mdb, а затем макросом вставлять данные из неё.
Сам код функции разбора полученной с сервера строки (лишние маловажные части убраны):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Sub Parse(serverres)
Application.ScreenUpdating = False
Application.EnableEvents = False
If (Mid(serverres,  1 ,  3 ) = "!!!") Then MsgBox (Mid(serverres,  5 ))

If (Not Mid(serverres,  1 ,  3 ) = "!!!") Then

    result = Split(serverres, "~~~END~~~")

Dim color As Integer
    If (Mid(serverres,  1 ,  12 ) <> "~~~END~~~") Then
    znach = Split(result( 0 ), "`")
  
    For Each zn In znach
        If (Len(zn)) Then
        parts = Split(zn, "|")
        listname = parts( 0 )
        yach = parts( 1 )
        Value = parts( 2 )
        color = "0"
        vych = True
    
        If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then color =  1 
        If (Trim(Worksheets(listname).Range(yach).Value) = Value) Then color =  2 
        Worksheets(listname).Range(yach).Value = Value
        If (color =  1 ) Then Worksheets(listname).Range(yach).Font.color = vbBlue
        If (color =  2 ) Then Worksheets(listname).Range(yach).Font.color = vbBlack
        End If
    Next zn
End If
End If


Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Что-то можно с этой проблемой сделать или нет (очень долгая обработка)?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545806
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСам код функции разбора полученной с сервера строки (лишние маловажные части убраны)

Насколько я понимаю
Код: plaintext
1.
result = Split(serverres, "~~~END~~~")
znach = Split(result( 0 ), "`")
данные от сервера вы получаете в serverres. потом начинаете ворочать массив.

Опыт подсказывает мне, что время тут расходуется на то, чтобы ворочать большой массив текстовых данных в памяти. Поэтому я бы рекомендовал прежде всего избавится от этого.

motorwayгенерировать файл БД в формате .mdb, а затем макросом вставлять данные из неё.

Почему бы вам не генерировать из СУБД непосредственно экселевский файл через ODBC? Потом можно пройтись макросом по ячейкам, расставить нужные цвета, это будет довольно быстро...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545812
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
        If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then color =  1 
        If (Trim(Worksheets(listname).Range(yach).Value) = Value) Then color =  2 
        .....
        If (color =  1 ) Then Worksheets(listname).Range(yach).Font.color = vbBlue
        If (color =  2 ) Then Worksheets(listname).Range(yach).Font.color = vbBlack

Так, по мелочи... вы слышали о том, что у оператора If есть еще часть Else?

Записав это так:
Код: plaintext
1.
2.
3.
4.
5.
6.
        If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then 
          Worksheets(listname).Range(yach).Font.color = vbBlue
        Else
          Worksheets(listname).Range(yach).Font.color = vbBlack
        End If
'или так
Worksheets(listname).Range(yach).Font.color = IIf(Trim(Worksheets(listname).Range(yach).Value) <> Value, vbBlue, vbBlack)

вы ускорите раза в два выполнение этого фрагмента.... хотя, конечно, это не решает общей проблемы....
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545828
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочему бы вам не генерировать из СУБД непосредственно экселевский файл через ODBC? Потом можно пройтись макросом по ячейкам, расставить нужные цвета, это будет довольно быстро...
У меня данные посылаются скрипту PHP на сервере. Про СУБД я написал в том смысле, что можно посылать результат с сервера не в виде строки, а в виде файла .mdb. Имеет смысл это?
Думаю, основное время в моем коде тратится на цикл, а не на первые строки
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545830
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПочему бы вам не генерировать из СУБД непосредственно экселевский файл через ODBC? Потом можно пройтись макросом по ячейкам, расставить нужные цвета, это будет довольно быстро...

Ну или подключиться из экселя к БД и заполнять данные из рекордсета (без всяких массивов в памяти). Если еще и открыть серверный курсор ForwardOnly, ReadOnly, то можно сэкономить время на том, что данные будут обрабатываться по мере поступления, без перегрузки кучи информации на клиента с выделением под них памяти.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545832
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому же, важно не создавать новый файл, а чтобы вся операция происходила в текущем открытом файле при запуске макроса.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545833
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProShocker.ProПочему бы вам не генерировать из СУБД непосредственно экселевский файл через ODBC? Потом можно пройтись макросом по ячейкам, расставить нужные цвета, это будет довольно быстро...

Ну или подключиться из экселя к БД и заполнять данные из рекордсета (без всяких массивов в памяти). Если еще и открыть серверный курсор ForwardOnly, ReadOnly, то можно сэкономить время на том, что данные будут обрабатываться по мере поступления, без перегрузки кучи информации на клиента с выделением под них памяти.
Примерно это я имел в виду, можно попробовать подключиться к Аксессу, но для этого надо будет посылать с сервера файл этот, либо подключаться к удаленной БД на сервере. Только при этом важно, чтобы на текущем листе в Экселе остались примечания, стили и т.п.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545836
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayДумаю, основное время в моем коде тратится на цикл, а не на первые строки

Надо не думать, а проверить. Поставьте оператор Debug.Print Now в нужных местах и посмотрите. Правда часть времени работы с массивами есть еще внутри цикла, а также в скрытом виде при перемещении курсора по нему.

motorwayУ меня данные посылаются скрипту PHP на сервере.
Про СУБД я написал в том смысле, что можно посылать результат с сервера не в виде строки, а в виде файла .mdb. Имеет смысл это?

Почему именно в mdb? Какая у вас СУБД? и как она порождает mdb-файл?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545838
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В скрипте на выходе есть строка. Сейчас она передается в чистом виде без использования СУБД. Хотя есть возможность (дополнительная) сохранять все в MySQL. С Аксессом просто легче работать в Экселе. А саму таблицу(ы) можно генерировать на PHP.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545840
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayВ скрипте на выходе есть строка. Сейчас она передается в чистом виде без использования СУБД. Хотя есть возможность (дополнительная) сохранять все в MySQL. С Аксессом просто легче работать в Экселе. А саму таблицу(ы) можно генерировать на PHP.

Брр... Что за цепочка порочная:
MySQL => PHP => Строка => Массив => Ячейки экселя

У вас есть возможность брать данные из (подключиться к) MySQL, минуя скрипт?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545847
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите, данные посылаются из ячеек Эксела на сервер по HTTP. PHP производит их обработку основную и на выходе у него есть строка. Можно их записать в MySQL, чтобы не посылать строку. Тогда надо будет подключаться из Эксела к MySQL, которая на сервере и оттуда брать данные. Это реально?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545848
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае результаты работы PHP скрипта должны попасть в таблицу. Это можно сделать либо парся строку, либо получая их из MySQL на сервере, подключившись к нему.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545855
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСмотрите, данные посылаются из ячеек Эксела на сервер по HTTP. PHP производит их обработку основную и на выходе у него есть строка. Можно их записать в MySQL, чтобы не посылать строку. Тогда надо будет подключаться из Эксела к MySQL, которая на сервере и оттуда брать данные. Это реально?

Вообще-то это я вас спрашиваю, реально ли это?
То есть технических проблем получить доступ через ADO к MySQL нет. Но может у вас там запрещен доступ к базе и нельзя его разрешить.

motorwayВ любом случае результаты работы PHP скрипта должны попасть в таблицу. Это можно сделать либо парся строку, либо получая их из MySQL на сервере, подключившись к нему.

Непонятно. Результаты работы скрипта попадают в БД или нет? Есил не попадают, то причем тут MySQL? Если попадают, возвращаемся к первому вопросу - есть ли возможность подключения к базе?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545874
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет возможности подключения к базе извне точно не знаю, MySQL обычная на хостинге, не знаю, они разрешают там или нет подключаться так.
Данные сейчас можно записывать в базу просто как доп. функция , так как сейчас они просто приходят в виде строки и не сохраняются специально в базу.
Но если это нужно для ускорения их отображения в Экселе, то можно результаты работы скрипта PHP сохранять в базу MySQL, и тогда уже к ней подключаться, а никакую строку большую не посылать.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545894
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну специально перегружать в базу готовую строку наверное нет смысла.

Давайте попробуем тогда обойтись без массива при разборе строки.
Вот я пример набросал, только у меня ваших данных нет, проверить не на чем, надеюсь, если там опечатки, поправите сами.
Предполагаются валидные данные, если могут быть проблемы с валидностью - надо дописывать условия. Впрочем, у вам там тоже проверок особо нет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        i= 1 
        j=InStr(i, serverres, "`")
        Do Until j= 0 
            If j<>i Then
                k = InStr(i, serverres, "|")
                listname = Mid(serverres, i, k-i)
                i=k+ 1 
                k = InStr(i, serverres, "|")
                yach = Mid(serverres, i, k-i)
                Value = Mid(serverres, i, j-k+ 1 )
                color = "0"
                vych = True
    
                If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then color =  1 
                If (Trim(Worksheets(listname).Range(yach).Value) = Value) Then color =  2 
                Worksheets(listname).Range(yach).Value = Value
                If (color =  1 ) Then Worksheets(listname).Range(yach).Font.color = vbBlue
                If (color =  2 ) Then Worksheets(listname).Range(yach).Font.color = vbBlack
            End If
            i=j+ 1 
            j=InStr(i, serverres, "`")
        Loop
    End If
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545896
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, ваши замеры:
7000 ячеек - 1,33 мин
20000 ячеек - 20 мин
показывают непропорциональное увеличение времени при увеличении размера данных. Это скорее всего указывает на мою правоту, что это связано с перераспределением памяти под массивы, а не самой обработкой.

Впрочем, вы привели не весь код, так что там тоже может что-то скрываться, что недоступно для анализа.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545899
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка имеет вид примерно такой: Лист1|A1|3`Лист1|A2|4`.... и т.п., насколько я помню (или Лист1|A|1|3`...). Весит она около 200 кб в данном примере.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545903
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСтрока имеет вид примерно такой: Лист1|A1|3`Лист1|A2|4`.... и т.п., насколько я помню (или Лист1|A|1|3`...). Весит она около 200 кб в данном примере.

Это я заметил, и если вы заметили, под нее сделал обработчик.
Я говорю о том, что там должно быть строгое чередование
"xxx|xxx|xxx`xxx|xxx|xxx`"
если этого не будет, алгоритм сбойнет. Либо вы надеетесь на валидность поступающих данных, либо проверяете их.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545906
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикладываю пример файла, только он сокращен раза в 4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36545911
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага, ну вот ошибочка в одной строке, надо
Код: plaintext
Value = Mid(serverres, k +  1 , j - k -  1 )

в остальном работает - тестируйте скорость.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546060
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.PromotorwayВ скрипте на выходе есть строка. Сейчас она передается в чистом виде без использования СУБД. Хотя есть возможность (дополнительная) сохранять все в MySQL. С Аксессом просто легче работать в Экселе. А саму таблицу(ы) можно генерировать на PHP.

Брр... Что за цепочка порочная:
MySQL => PHP => Строка => Массив => Ячейки экселя+100500
Должно быть MySQL => PHP => экселевский файл в формате xml.
Если же причесывать то, что быть не должно…

Вот эта бредятина:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   For Each zn In znach
…
                If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then color =  1 
                If (Trim(Worksheets(listname).Range(yach).Value) = Value) Then color =  2 
                Worksheets(listname).Range(yach).Value = Value
                If (color =  1 ) Then Worksheets(listname).Range(yach).Font.color = vbBlue
                If (color =  2 ) Then Worksheets(listname).Range(yach).Font.color = vbBlack
…
    Next zn
легким движением руки заменяется на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim r As Range

For Each zn In znach
…
    Set r = Worksheets(listname). Range(yach) 'чтобы не дергать свойства Item и Range по 5(!) раз за итерацию каждое
    If Trim(r.Value) = Value Then 'в принципе здесь можно и без if
        r.Font.color = vbBlack
    else
        r.Font.color = vbBlue
    end if
    r.Value = Value
…
next
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546464
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за помощь. Протестировал два варианта кода - мой прошлый и с вашими изменениями. Результаты немного странные. Правда, хочу отметить, что те 20 минут, о которых я говорил до этого, вызывались записью большого объема данных в ячейки, т.е. там была еще одна функция, которая все тормозила. Я ее пока убрал, и вот что получилось (время с точностью около 5%):
для 8169 ячеек старый код - 1 мин 40 сек, новый - 1 мин.
для 18967 ячеек старый код - 5 мин, новый - около 5 мин и 5 сек.
То есть, странная вещь вышла - для не очень большого файла этот код дает ускорение, а для большой таблицы даже немного дольше стало.
Но главное, видно, что нужно еще ускорять принципиально - 5 минут ждать это не вариант, а ведь там еще есть места, которые надо ускорять.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546519
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я все-таки склоняюсь к мысли, что 20000 ячеек не так много, и для этого случая должны были уже изобрести какой-то нормальный способ. Ведь работают же с терабайтными базами. Если попробовать вставить данные из Аксесса (1500 строк и 13 столбцов), то это делается почти мгновенно. А здесь очень медленно
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546523
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЯ все-таки склоняюсь к мысли, что 20000 ячеек не так много, и для этого случая должны были уже изобрести какой-то нормальный способ.У вас не нормальный источник данных, а свойство Range тормозное, поэтому имеем то, что имеем.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546526
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
ну, а допустим мы это строку будем записывать в БД сначала, а потом оттуда брать данные - так можно рассчитывать на нормальную скорость?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546547
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЯ все-таки склоняюсь к мысли, что 20000 ячеек не так много, и для этого случая должны были уже изобрести какой-то нормальный способ. Ведь работают же с терабайтными базами. Если попробовать вставить данные из Аксесса (1500 строк и 13 столбцов), то это делается почти мгновенно. А здесь очень медленно

Вы не путайте, эксель не является СУБД и не оптимизирован на работу с данными

motorwayAntonariy,
ну, а допустим мы это строку будем записывать в БД сначала, а потом оттуда брать данные - так можно рассчитывать на нормальную скорость?

Нет.

Тормоза идут не при получении данных, а при работе с ячейками. Это (если в лоб) непреодолимое препятствие.
Поскольку исходными данными является строка, то нет смысла грузить ее в базу. То бишь, вы можете создать csv-файл (просто заменив "|" на ",", а "`" на конец строки. Это позволит очень быстро загрузить данные в эксель (не устраивая этот тормозной цикл). Но вы хотите красить ячейки на ходу - и вот тут начинается проблема тормозами.

Поскольку ваша задача не совсем ясна, да и часть кода вы нам не дали, мы не можем дать более точный совет. Возможно вам вообще не нужен эксель и можно обойтись аксессом или, скажем, веб-клиентом.
Всякие покраски можно тоже реализовать иначе (но, правда, для этого иначе должны формироваться исходные данные). Скажем, располагаться рядом ячейки со старым и новым значением. А покрасить изменившиеся можно (если не ошибаюсь) формулой или пробежаться макросом уже после загрузки данных. В общем, если хотите глобальных советов - придется вам развернуть контест как можно подробнее.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546571
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя система состоит из Эксела и скрипта на сервере, производящего вычисления. Работает это по типу SaaS. Производятся некоторые вычисления, например, финансовые. Для этого данные из Эксела посылаются скрипту, он вычисляет всё и возвращает результат.
Эксел нужен для удобного ввода данных - формулы+значения+редактирование таблицы (стили, шрифты и т.п.). Т.е. почти все как в обычном Экселе, только данные посылаются скрипту.
Веб-клиентом я пробовал обойтись, но там не хватает многих функций Эксела. Именно Эксел вполне удобное средство для ввода данных и их просмотра.
Главное, чтобы все это работало с приемлемой скоростью. Та система, какая сделана сейчас - тормозит. Наверно, сюда можно приделать либо Аксесс, либо сохранять и загружать все данные из MySQL на сервере, но главное, чтобы тоже было быстро. И куда деться от этих тормозов? Основные вещи делают макросы...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну система понятна (значит варианты клиента, кроме экселя, не обсуждаем), но вы не уловили главного. Запись с помощью макроса такого объема данных - процесс долгий. Чтобы принципиально его ускорить - надо отказаться от записи ячеек макросом (один из вариантов - csv - я предложил). Но сложно предполагать, что там у вас с форматированием и т.п.

Кстати, вы упоминали о том, что можно было бы передавать только измененные данные - до какого количества ячеек это уменьшит объем передаваемых данных?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546587
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет того, что макросы долго все это делают, я уловил, конечно - потестил, и настроение подпортилось. В таблице может быть большое количество ячеек с разными шрифтами, стилями и примечаниями.
Вот, кстати, обработка примечаний - еще одна медленная вещь. Мне нужно скидывать иногда текст из примечаний в ячейки сами - и для такой таблицы это тоже долго очень. Тут уж вряд ли что-то поможет, может, у вас тоже идеи есть? :)
Если только изм. передавать - ну это смотря сколько менять на входе и сколько при этом меняется в результатах. Допустим, изменили 1 ячейку. При этом может измениться в результатах 1-10, а иногда может и много - может быть, даже 1000. А вот если менять штук 10-100, то может большая часть, около 50% измениться. То есть, сокращение может быть от 2 до 100 раз где-то, я думаю.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546637
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основные тормоза в данном случае из-за кучи обращений к отдельным ячейкам (проверка цвета, присвоение значения, присвоение цвета). Присваивайте значения одной командой - через массив или Recordset. Аналогично надо сделать и с раскраской. В итоге все будет работать моментально.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546657
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вместо Range использовать Cells, будет быстрее.

Однако, чем, собственно, не устраивает генерация уже готового и раскрашенного файла на сервере?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546689
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Набросал простенький примерчик - 50 тыс строк заносятся и форматируются примерно за секунду:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Public Sub ttt()
    Dim r As New ADODB.Recordset, i As Long
    
    r.Fields.Append "ID", adInteger, , adFldUpdatable
    r.Fields.Append "Text", adVarChar,  50 , adFldUpdatable
    r.Open
    
    For i =  1  To  50000 
        r.AddNew
        r( 0 ) = i
        r( 1 ) = "Text " & i
    Next i
    r.MoveFirst
    
    Cells( 2 ,  2 ).CopyFromRecordset r
    
    With Range("C2:C" & r.RecordCount).FormatConditions
        .Delete
        .Add Type:=xlExpression, Formula1:="=ОСТАТ(RC[-1];3)=0"
        With .Item( 1 ).Interior
            .PatternColorIndex = xlAutomatic
            .Color =  49407 
            .TintAndShade =  0 
        End With
        .Item( 1 ).StopIfTrue = False
    End With
End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546711
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПоскольку исходными данными является строка, то нет смысла грузить ее в базу. То бишь, вы можете создать csv-файл (просто заменив "|" на ",", а "`" на конец строки. Это позволит очень быстро загрузить данные в эксель (не устраивая этот тормозной цикл). Но вы хотите красить ячейки на ходу - и вот тут начинается проблема тормозами.

Есть, кстати, еще один примитивный способ быстрого создания и заполнения Excel-евского файла, кроме того что я привел чуть выше. Просто создаем htm-файл с таблицей, заполняя его нужными строками с нужным форматированием, потом открываем его Excel-ем, делаем окончательную обработку/форматирование и сохраняем его уже в формате Excel. Дюже просто и сердито.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546949
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyОднако, чем, собственно, не устраивает генерация уже готового и раскрашенного файла на сервере?
Допустим, пользователь считает какую-то финансовую модель и нажимает кнопку "Вычислить". При этом он ожидает сразу увидеть результаты, а не скачивать еще один файл с результатами. Так будет долго и неудобно.

А насчет Recordset - получится ли быстро считать около 10000 примечаний и поместить их в ячейки и наоборот, из ячеек в примечания? И раскраска - красятся же отдельные ячейки, можно ли их быстро закрасить таким способом, чтобы было за секунду?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546951
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF, а что нужно дополнительно сделать, чтобы ваш пример работал? Пишет "User-defined type not defined" про Recordset
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36546955
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayAndrF, а что нужно дополнительно сделать, чтобы ваш пример работал? Пишет "User-defined type not defined" про Recordset

Добавить референс на Microsoft ActiveX Data Objects
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547020
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сначала пробовал добавить, но другую - ADO. Получилось. А можно примерно таким же образом добавлять примечания или формулы в ячейку?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547076
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока что не очень понял, будет ли такой способ нормально работать, если у нас есть список ячеек, который хотим обновить и значения для них (либо второй вариант - формулы, третий - примечания)?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547218
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЯ пока что не очень понял, будет ли такой способ нормально работать, если у нас есть список ячеек, который хотим обновить и значения для них (либо второй вариант - формулы, третий - примечания)?

Надо разбираться. По крайней мере для тупого заполнения таблицы и раскраски ее по формуле пример я привел. Остальное за так делать хоть и не столь сложно, но уже и не интересно ;)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547228
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у 2007-го еще проще - посмотрел сейчас структуру xlsx-файла (можно открыть тем же WinRar-ом) - с ней вполне можно разобраться даже без описания. По крайней мере это явно не сложней чем chm-файлы, которые когда-то приходилось создавать из программы...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547271
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути, вот, что мне нужно - просто надежные способы:
1) быстро считать содержимое большого кол-ва ячеек, так чтобы его можно было послать на сервер/сохранить в файл.
2) быстро изменить содержимое большого кол-ва ячеек - присвоить значения (здесь может подойти вариант с csv или др.).
3) быстро считать содержимое большого кол-ва примечаний, чтобы можно было на основании их изменить содержимое ячеек/либо сохранить все примечания в файл.
4) быстро изменить большое кол-во примечаний.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547309
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПо сути, вот, что мне нужно - просто надежные способы:
1) быстро считать содержимое большого кол-ва ячеек, так чтобы его можно было послать на сервер/сохранить в файл.
2) быстро изменить содержимое большого кол-ва ячеек - присвоить значения (здесь может подойти вариант с csv или др.).
3) быстро считать содержимое большого кол-ва примечаний, чтобы можно было на основании их изменить содержимое ячеек/либо сохранить все примечания в файл.
4) быстро изменить большое кол-во примечаний.

1 и 2 проблем вообще нет - см выше, там было показано. Как и с форматированием зависящим от значений ячеек все примитивно.

Самое сложное тут 3 и 4 - доступ к примечаниям по одному через объектную модель по одному будет все дико тормозить, а иначе вроде и невозможно.

Так что если они действительно нужны, то реализовать все быстро можно только через самостоятельное создание xlsx/xlsm файла, разобравшись в его структуре - оно достаточно просто даже без изучения документации. Заодно и без Excel-я на компе тогда можно будет обойтись (если не конвертировать в старые версии Excel)... Для упрощения работы можно использовать заготовку, просто добавляя в нее нужные строчки...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547311
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще здесь почитать...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36547681
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFТак что если они действительно нужны, то реализовать все быстро можно только через самостоятельное создание xlsx/xlsm файлаЛучше чистого xml (Сохранить как — Таблица XML), с зипом заморачиваться не надо.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548300
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAndrFТак что если они действительно нужны, то реализовать все быстро можно только через самостоятельное создание xlsx/xlsm файлаЛучше чистого xml (Сохранить как — Таблица XML), с зипом заморачиваться не надо.

Ему примечания нужны, а как их запихнуть в чистый XML мне не ведомо...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548500
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFЕму примечания нужны, а как их запихнуть в чистый XML мне не ведомо...Так ить "Сохранить как — Таблица XML"…
Имеем результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
<Cell>
    <Data ss:Type="String"> это значение </Data>
    <Comment ss:Author="Antonariy">
        <ss:Data xmlns="http://www.w3.org/TR/REC-html40">
            <B>
                <Font html:Face="Tahoma" x:CharSet="204" html:Size="8" html:Color="#000000"> это примечание </Font>
            </B>
        </ss:Data>
    </Comment>
</Cell>
...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548546
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-таки XML мне не очень подходит - результат должен появляться в том же открытом файле Эксела. Если уж совсем ничего не будет получаться, я могу это попробовать, но это крайний вариант.
И потом, у меня файл .xlsm.
Примечания - довольно критичная для меня вещь, они используются по полной программе. И обновлять их и получать данные из них нужно быстро. :(
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548567
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayВсё-таки XML мне не очень подходит - результат должен появляться в том же открытом файле Эксела. Если уж совсем ничего не будет получаться, я могу это попробовать, но это крайний вариант. И потом, у меня файл .xlsm. Примечания - довольно критичная для меня вещь, они используются по полной программе. И обновлять их и получать данные из них нужно быстро. :(

Так формируешь файл XML (тупо текстом), и только потом открываешь его Excel-ем, далее сохраняешь уже в нужном формате...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548573
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. вы имеете в виду перезапись - вместо текущего файла подставляется XML сгенерированный?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548645
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: motorway

Почитав всю переписку, для себя я пришёл к следующему выводу. что для ускорения общей работы нужно
- выбросить Ексель, вместо него написать специальную программу
- перестроить схему работы следующим образом: Передача данных на сервер вычислителю -> вычислитель складывает
обработанные данные в БД -> Программа выбирает данные для отображения и изменения из БД.

Потому что вам нужно не просто отображение данных, а чуть-ли не on-line мониторинг, изменение и практически
индивидуальное отображение каждого параметра. Ексель, со всей своей объектной структурой, не предназначен для
мгновенного отклика.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548708
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать прогу, конечно, можно всегда, но по трудозатратам и качеству результата все будет хуже, чем при использовании Эксела. Я уже пробовал использовать покупные таблицы для организации веб-интерфейса, но получилось, что там многих нужных функций нет - автозаполнение и т.п.
Реализовывать все это самостоятельно не очень-то хочется, проблем и так хватает. Даже основные функции Эксела долго реализовывать самостоятельно. Интерфейс нужен в виде электронной таблицы.
Никаких сверх-требований вроде нет, просто используются основные возможности Эксела - шрифты, стили, примечания. Вещи все стандартные, просто данные передаются с помощью сети, ну и, может, примечаний много. А так все обычно.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548758
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayТ.е. вы имеете в виду перезапись - вместо текущего файла подставляется XML сгенерированный?

Генеришь xml-файл, огрызок содержания которого привел Antonariy , далее открываешь его Excel-ем (можно при этом сделать окончательную доводку, если нужно) и сохраняешь в нужном формате.

Кстати, давно было, но вроде если эту xml-ку переименовать в xls и запустить, то Excel ее вполне нормально откроет...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548878
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-таки, наверно, буду пытаться пока без xml ускорить все это дело.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548943
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть ли возможность использовать не VBA, а что-нибудь более быстрое для обновления ячеек и примечаний? Может, dll как-то использовать?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548957
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто вы говорите о 20000 ячеек. Причем каждая может быть оформленна индивидуально. А это все время. Одно дело 100 000
ячеек заполнять как предлагал AndrF
Код: plaintext
Cells( 2 ,  2 ).CopyFromRecordset r
и потом всем сделать
одинаковый формат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
With XLSheet.Range(XLSheet.cells( 1 , 1 ), XLSheet.cells(r.RecordCount+ 1 ,  2 ))
 .BorderS(xlDiagonalDown).LineStyle = xlNone
 .BorderS(xlDiagonalUp).LineStyle = xlNone
 With .BorderS(xlEdgeLeft)
  .LineStyle = xlContinuous
  .Weight = xlThin
  .colorindex = xlAutomatic
 Endwith
 With .BorderS(xlEdgeTop)
  .LineStyle = xlContinuous
  .Weight = xlThin
  .colorindex = xlAutomatic
 Endwith
 With .BorderS(xlEdgeBottom)
  .LineStyle = xlContinuous
  .Weight = xlThin
  .colorindex = xlAutomatic
 Endwith
 With .BorderS(xlEdgeRight)
  .LineStyle = xlContinuous
  .Weight = xlThin
  .colorindex = xlAutomatic
 Endwith
 Try && наверное может быть ситуация, когда будет только одна строка
*     И тогда не будет понятия "внутренние горизонтальные линии" и будет ошибки
*     Вот её тихонько перехватим и будем работать дальше
  With .BorderS(xlInsideVertical)
   .LineStyle = xlContinuous
   .Weight = xlThin
   .colorindex = xlAutomatic
  Endwith
 Catch To oerr
 Endtry
 Try && наверное может быть ситуация, когда будет только одна строка
*     И тогда не будет понятия "внутренние горизонтальные линии" и будет ошибки
*     Вот её тихонько перехватим и будем работать дальше
  With .BorderS(xlInsideHorizontal)
   .LineStyle = xlContinuous
   .Weight = xlThin
   .colorindex = xlAutomatic
  Endwith
 Catch To oerr
 Endtry
Endwith
и делать тоже самое но для каждой ячейки отдельно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit

Sub sdg()
Dim i As Long, dts As Date
dts = Now
For i =  1  To  50000 
    Cells(i,  1 ).Value = "A - " & CStr(i)
    Cells(i,  1 ).VerticalAlignment = - 4108 
    Cells(i,  1 ).WrapText = True
    Range("A" & CStr(i)).BorderAround xlContinuous, xlThin
    Cells(i,  1 ).Font.Size =  8 

    Cells(i,  2 ).Value = "B - " & CStr(i)
    Cells(i,  2 ).VerticalAlignment = - 4108 
    Cells(i,  3 ).WrapText = True
    Range("B" & CStr(i)).BorderAround xlContinuous, xlThin
    Cells(i,  2 ).Font.Size =  8 
Next i
MsgBox CStr(Now) & vbCrLf & CStr(dts)
End Sub
разница бывает очень значительна. И объясните мне, зачем пользователю одномоментно 20000 значений со своей
цветовой градуировкой и спрятанными примечаниями, и при этом время обновления настолько критично, что пару минут уже
много?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36548988
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, различные цвета и стили ячеек сейчас сделаны просто для удобства работы с большой моделью. При финансовых вычислениях часто по-разному выделяются конкретные ячейки, чтобы было понятнее. Но это как раз не предполагается менять.
В основном я планировал менять цвет шрифта у изменившихся после вычислений ячеек, чтобы было видно, какие изменились. Потому что в большой таблице это отслеживать трудно.
Примечания меняются не так часто, но иногда это нужно делать, а при этом ждать больше 30 секунд уже напряг. У меня просто так реализовано всё, что в примечаниях хранится доп. информация, которую нельзя поместить в ячейку сразу, так как там может быть уже число какое-то. Т.е., как бы еще одно измерение.
Вручную пользователь обычно менять будет гораздо меньше, чем 20000 примечаний, но иногда, например при удалении строк, примечания должны автоматически обновиться для большого числа ячеек.
В общем, пользователи будут довольно требовательные, скорее всего. Просто надо исходить из того, что они не привыкли в Экселе долго ждать, а если здесь будет больше ~20 секунд, уже начнутся мысли, стоит ли пользоваться этим.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549007
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для измерений есть сводные таблицы, для самих данных есть специальный сервис OLAP называется и там есть свои стратегии
хранения данных. Просто я прекрасно понимаю что человек при всем своем желании не сможет быстро даже осмотреть все
двадцать тысяч, вообщем я уже говорил что в ексель, большие объемы данных частообновляемых данных лучше брать из БД, а
не парсить раз за разом, потом можно пройтись и по рекордсету разукрасить ячейки и понаставить примечания, хотя именно
это и будут самые времязатратные действия

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549011
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayа если здесь будет больше ~20 секунд, уже начнутся мысли, стоит ли пользоваться этим.

Сделайте правильный прогресс-индикатор. Это обычно в разы облегчает раздражение пользователя.


ЗЫ: Можно выводить случайный анекдот
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549017
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользоваться системой будут, если получится, не обычные "одиночные пользователи", а люди из фирмы с большими запросами. Так что если такая ситуация будет на первом испытании системы, дальше они даже разговаривать не будут. :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549020
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается вариантов с формированием файла xml и последующим открытием. А кто сказал, что подобная операция (включая открытие файла с таким количеством записей) займет меньше 20 секунд?... так что, может и не выход
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549023
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: motorway
> Пользоваться системой будут, если получится, не обычные "одиночные пользователи", а люди из фирмы с большими
> запросами. Так что если такая ситуация будет на первом испытании системы, дальше они даже разговаривать не будут. :)

Т.е. у тебя на тестовых данных затык, и нет вариантов как решить, что будет когда за дело примутся motorwayлюди
из фирмы с большими запросами.?
вообщем пробуй, здесь тебе понакидали идей :)
удачи

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549031
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну то есть это не шутки, обычные пользователи могут и подождать, а когда подписывается договор с фирмой и т.п., то если качество не устраивает, то и дальше работать не будут.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549067
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЧто касается вариантов с формированием файла xml и последующим открытием. А кто сказал, что подобная операция (включая открытие файла с таким количеством записей) займет меньше 20 секунд?... так что, может и не выход

Ну мой пример в 50 тыс записей срабатывает где-то за секунду.

А вообще приходилось в былые времена видеть Excel-евские файлы открывающиеся минут по 15..20. Где-то в 98-м году примерно - столько тогда в них бухгалтерия напихивала...

Интересно - а автору топика действительно Excel-евский файл нужен, а не Grid??? А то гложет сомнение что может он не по той дороге вообще идет...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549073
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFИнтересно - а автору топика действительно Excel-евский файл нужен, а не Grid??? А то гложет сомнение что может он не по той дороге вообще идет...

Да как я понял, пользователи потом юзают функционал экселя, так что не выход...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549077
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAndrFИнтересно - а автору топика действительно Excel-евский файл нужен, а не Grid??? А то гложет сомнение что может он не по той дороге вообще идет...

Да как я понял, пользователи потом юзают функционал экселя, так что не выход...

Ну если только так... Но и с Excel-ем все решаемо, как оказалось...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549175
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAndrFИнтересно - а автору топика действительно Excel-евский файл нужен, а не Grid??? А то гложет сомнение что может он не по той дороге вообще идет...

Да как я понял, пользователи потом юзают функционал экселя, так что не выход...
Да, грид я уже пробовал, причем он стоил 800 у.е. Там нет многих вещей...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36549284
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFКстати, давно было, но вроде если эту xml-ку переименовать в xls и запустить, то Excel ее вполне нормально откроет...Прекрасно откроет и без переименования.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36551717
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAndrFКстати, давно было, но вроде если эту xml-ку переименовать в xls и запустить, то Excel ее вполне нормально откроет...Прекрасно откроет и без переименования.

Но если переименовать, то Excel запустится по расширению - я об этом...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36552089
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFAntonariyAndrFКстати, давно было, но вроде если эту xml-ку переименовать в xls и запустить, то Excel ее вполне нормально откроет...Прекрасно откроет и без переименования.

Но если переименовать, то Excel запустится по расширению - я об этом...Я об этом же. Виндовский шелл анализирует не только расширения, но и процессинговые инструкции xml-файлов, если находит <?mso-application progid="Excel.Sheet"?>, то соответственно его ассоциирует.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554097
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потестировал скорость. Если убрать раскраску ячеек, то время сокращается с 5 мин до 4 мин 46 сек. Если убрать присваивание значений ячейкам, то до 4 мин 30 сек. Видимо, разбор строки занимает большую часть по времени.
При этом, если сделать выход из процедуры довольно близко к ее началу, чтобы проверить, сколько занимает это по времени, то даже это делалось около 3 мин 40 сек.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Parse(serverres)
Application.ScreenUpdating = False
Application.EnableEvents = False
If (Mid(serverres,  1 ,  3 ) = "!!!") Then MsgBox (Mid(serverres,  5 ))

If (Not Mid(serverres,  1 ,  3 ) = "!!!") Then

    result = Split(serverres, "~~~END~~~")
Exit Sub
...
Довольно странно, почему это так медленно даже это.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554172
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayВидимо, разбор строки занимает большую часть по времени.
.....
Довольно странно, почему это так медленно даже это.


Погодите-ка, я же вам давал код БЕЗ ворочанья больших массивов в памяти и вы даже вроде его тестировали.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554265
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

да, сейчас он есть, но это относится ко второй части кода. А первая вот:

Код: plaintext
1.
2.
3.
4.
If (Mid(serverres,  1 ,  3 ) = "!!!") Then MsgBox (Mid(serverres,  5 ))

If (Not Mid(serverres,  1 ,  3 ) = "!!!") Then
  
    result = Split(serverres, "~~~END~~~")

Или я неправильно что-то сделал? У меня же там в начале процедуры это еще есть
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554276
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, "~~~END~~~" у вас встречается только один раз
Нафига его командой Split обрабатывать, создавая еще один массив в памяти, совершенно бесполезный. Избавьтесь от этого.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554278
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем... это находится не внутри цикла, конечно может не иметь решающего значния...
Я вам предлагал еще на первой странице сделать замер времени, попробуйте, может на этот единичный Split и не так много времени уйдет...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36554329
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayДовольно странно, почему это так медленно даже это.

Держите код работающий с тем файлом примера что вы прикладывали. Где-то секунда уходит на заполнение. Может создавать листы, если их несколько. Количество колонок - до Z (влом было предусматривать что их может быть больше, так как не в курсе нужно ли)...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
Option Explicit

Public Sub Main()
    Dim ea As Excel.Application, eb As Excel.Workbook, ex As Excel.Worksheet, er As Excel.Range
    Dim r As New ADODB.Recordset, rr As New ADODB.Recordset, rrr As New ADODB.Recordset, rc As ADODB.Recordset, fa As ADODB.FieldAttributeEnum
    Dim iHFile As Integer, sss As String, ms() As String, i As Long, m() As String, sЛист As String, k As Long
    
    iHFile = FreeFile
    Open App.Path & "\restext2.txt" For Binary As #iHFile
    sss = Space(LOF(iHFile))
    Get #iHFile, , sss
    Close #iHFile
    
    fa = adFldIsNullable + adFldMayBeNull + adFldUnknownUpdatable
    r.Fields.Append "Лист", adVarChar,  10 , adFldUnknownUpdatable
    r.Fields.Append "C", adChar,  1 , adFldUnknownUpdatable
    r.Fields.Append "R", adInteger, , adFldUnknownUpdatable
    r.Fields.Append "Value", adVarChar,  20 , fa
    r.Open
    
    rrr.Fields.Append "Лист", adVarChar,  10 , adFldUnknownUpdatable
    rrr.Fields.Append "N", adSmallInt, , adFldUnknownUpdatable
    rrr.Open
    rrr( 0 ).Properties!Optimize = True
    
    ms = Split(sss, "`")
    For i =  0  To UBound(ms)
        m = Split(ms(i), "|")
        If UBound(m) <>  2  Then
            Exit For
        End If
        
        r.AddNew
        r!Лист = m( 0 )
        r!C = Left$(m( 1 ),  1 )
        r!r = CLng(Mid$(m( 1 ),  2 ))
        r!Value = m( 2 )
        r.Update
    Next i
    
    r.Sort = "Лист, C, R"
    Set rc = r.Clone
    rc.Sort = "Лист, C Desc"
    
    ' Определим сколько всего листов
    Do Until r.EOF
        If sЛист <> r( 0 ) Then
            sЛист = r( 0 )
            
            ' Определим максимальную букву листа
            rc.Filter = "Лист='" & sЛист & "'"
            
            rrr.AddNew
            rrr( 0 ) = sЛист
            rrr( 1 ) = Asc(Left$(rc( 1 ),  1 )) - Asc("A") +  1 
            rrr.Update
        End If
        r.MoveNext
    Loop
    Set rc = Nothing
    
    ' Создадим выходной Recordset
    rrr.Sort = "N Desc"
    For i = Asc("A") To Asc("A") + rrr!n -  1 
        rr.Fields.Append Chr$(i), adVarChar,  20 , fa
    Next i
    rr.Fields.Append "Лист", adVarChar,  10 , adFldUnknownUpdatable
    rr.Fields.Append "RRR", adInteger, , fa
    rr.Fields.Append "KKK", adInteger, , adFldUnknownUpdatable
    rr.Open
    
    rrr.Sort = "Лист"
    Do Until rrr.EOF
        sЛист = rrr( 0 )
        r.Filter = "Лист='" & sЛист & "'"
        r.Sort = "R DESC"
        For i =  1  To r( 2 )
            rr.AddNew
            rr!Лист = sЛист
            rr!KKK = i
            rr.Update
        Next i
        rrr.MoveNext
    Loop
    r.Filter =  0 
    r.Sort = "Лист, R"

    ' Заполним выходной Recordset
    r.MoveFirst: sЛист = vbNullString
    Do Until r.EOF
        rr.Filter = "Лист='" & r( 0 ) & "' AND KKK=" & r( 2 )
        rr(CStr(r( 1 ))) = r( 3 )
        rr.Update
        r.MoveNext
    Loop
    
    rrr.MoveFirst
    rr.Filter =  0 
    rr.Sort = "Лист, KKK"
    
    Set ea = New Excel.Application
    Set eb = ea.Workbooks.Add
    For i = ea.Workbooks( 1 ).Worksheets.Count To  2  Step - 1 
        ea.Workbooks( 1 ).Worksheets(i).Delete
    Next i
    Set ex = ea.Workbooks( 1 ).Worksheets( 1 )
    Do Until rrr.EOF
        If rrr.AbsolutePosition >  1  Then
            Set ex = ea.Workbooks( 1 ).Worksheets.Add(, ex)
        End If
        ex.Name = rrr( 0 )
        
        Set r = CloneRecordset(rr, "Лист='" & rrr( 0 ) & "'", "KKK")
        
        Set er = ex.Cells( 1 ,  1 )
        er.CopyFromRecordset r, , rrr( 1 )
        ex.Cells.Columns.AutoFit
        rrr.MoveNext
    Loop
    ea.Workbooks( 1 ).Worksheets( 1 ).Select
    ea.Visible = True
End Sub

Public Function CloneRecordset(rs As ADODB.Recordset, Optional sFilter As String = vbNullString, _
        Optional sSort As String = vbNullString) As ADODB.Recordset

    Dim r As New ADODB.Recordset, rr As ADODB.Recordset, f As ADODB.Field
    Dim iType As ADODB.DataTypeEnum
    
    Set rr = rs.Clone
    rr.Filter = IIf(Len(sFilter), sFilter,  0 )
    If Len(sSort) Then rr.Sort = sSort
    For Each f In rr.Fields
        Select Case f.Type
            Case adNumeric
                iType = adDouble
            Case adChar
                iType = adVarWChar
            Case Else
                iType = f.Type
        End Select
        r.Fields.Append f.Name, iType, f.DefinedSize, adFldIsNullable
    Next
    r.Open
    If Not (rr.BOF And rr.EOF) Then
        rr.MoveFirst
        Do Until rr.EOF
            r.AddNew
            For Each f In rr.Fields
                If Not IsNull(f) Then r.Fields(f.Name) = f
            Next f
            r.Update
            rr.MoveNext
        Loop
    End If
    If r.RecordCount Then r.MoveFirst
    Set CloneRecordset = r
End Function
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556299
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, жаль, что код довольно труден для понимания... Число листов, строк и колонок у меня может быть любое, в частности для той таблицы из 20000 ячеек колонок около 35.
Но проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек. Здесь Recordset может помочь?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556481
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСпасибо, жаль, что код довольно труден для понимания... Число листов, строк и колонок у меня может быть любое, в частности для той таблицы из 20000 ячеек колонок около 35.
Но проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек. Здесь Recordset может помочь?

Для примечаний, как я понимаю - нет.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556529
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayНо проблема еще и в быстром считывании данных при посылке на сервер - нужно считать значения и примечания для 20000 ячеек.

Можешь выложить исходные полные файлы? А то и потестить не с чем...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556585
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAndrFЕму примечания нужны, а как их запихнуть в чистый XML мне не ведомо...Так ить "Сохранить как — Таблица XML"…
Имеем результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
<Cell>
    <Data ss:Type="String"> это значение </Data>
    <Comment ss:Author="Antonariy">
        <ss:Data xmlns="http://www.w3.org/TR/REC-html40">
            <B>
                <Font html:Face="Tahoma" x:CharSet="204" html:Size="8" html:Color="#000000"> это примечание </Font>
            </B>
        </ss:Data>
    </Comment>
</Cell>
...


А можешь подсказать, какая у этого файла кодировка? То бишь сконвертить для него строку...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556611
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF
Можешь выложить исходные полные файлы? А то и потестить не с чем...
Конкретно файл с макросами не могу, а потестировать можете примерно как я - заполняю таблицу примерно 1600 строк*13 колонок автозаполнением - можно одинаковые числа и примечания сделать. И нужно чтобы из этого формировалась строка вида Лист|B|2|1`Лист|C|2|1`Лист|D|2|1`... и т.п.
Из примечаний тоже чтобы значения доставались в таком же виде
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556738
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFА можешь подсказать, какая у этого файла кодировка? То бишь сконвертить для него строку...Генерировать можно win-1251, но эксель пересохраняет в utf-8.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556786
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложен пример с созданием и заполнением из кода xml-файла с примечаниями ячеек. Раскраску не делал, но оно тоже примитивно и на скорость существенно не повлияет...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556808
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, тоже может пригодиться.
Я потестил обновленные процедуры считывания данных и помещения их в строку (переменную) и парсинг строки и обновление таблицы.
Сейчас уже получается так: получилось ускорить обновление таблицы, т.е. запись, а вот основное время занимает считывание - для такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно. Но вроде бы считывание данных обычно быстрее должно быть, чем запись, почему же так?

Вот код для считывания данных и помещения их в строку для отправки на сервер:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
Sub Run()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
iStyle = "20% - Акцент1"

    Dim values As String
    values = ""
    Dim sh As Worksheet, TRange As Range, Cell As Range
    Dim integers As String
    integers = ""
    Dim formula As String
    formula = ""
  
    For i =  1  To (Worksheets.Count -  1 )
        Set sh = Worksheets(i)
        shname = sh.Name
        rownum = Row_Get(sh)
        colnum = Col_Get(sh)
        If (rownum >=  2  And colnum >=  2 ) Then
        Set TRange = Range(sh.Cells( 2 ,  2 ), sh.Cells(rownum, colnum))
        Else
        If (rownum =  1  Or colnum =  1 ) Then
        Set TRange = Range(sh.Cells( 2 ,  2 ), sh.Cells( 2 ,  2 ))
        End If
        End If
        
        For Each Cell In TRange
        coladd0 = Cell.Address
            pos0 = InStr( 2 , coladd0, "$")
            col0 = Mid(coladd0,  2 , pos0 -  2 )
            row0 = Trim(Str(Cell.Row))
        
        If (Len(Trim(Cell.Text))) Then
        
            values = values + shname + "|" + col0 + "|" + row0 + "|" + Cell.Text + "`"
            End If
        
        If (Cell.Style = IStyle) Then
        integers = integers + shname + "|" + col0 + "|" + row0 + "`"
        End If

        Set comm = Cell.Comment
        If (Not comm Is Nothing) Then
        formula = formula + shname + "|" + col0 + "|" + row0 + "|" + comm.Text + "`"
        End If
        Next Cell
    Next i

'это основные действия, далее полученные данные объединяются в строку. Код до этого места выполнялся около 150 сек       
...
Application.Calculation = xlCalculationAutomatic
End sub

Public Function Row_Get(ByVal sh As Object) As Integer
' Определение последней занятой строки на листе
addr = sh.UsedRange.Address
Row_Get = sh.UsedRange.Row + sh.UsedRange.Rows.Count -  1 
End Function

Public Function Col_Get(ByVal sh As Object) As Integer
' Определение последней занятой колонки на листе
addr = sh.UsedRange.Address
Col_Get = sh.UsedRange.Column + sh.UsedRange.Columns.Count -  1 
End Function

...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556818
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorway,

Попробуйте для эксперимента собирать данные не в текстовую строку, а выводить в файл на диске. Сравните время. Попробуйте для эксперимента не накапливать данные в переменной, а просто перезаписывать ее поверх (чтобы длина переменной не росла). Сравните время.

У меня есть опыт - я формировал отчет (под VB6) примерно 3000-4000 строк и около 12-ти столбцов. В основном числовые данные и пара строковых. Пользователю предлагался выбор, сформировать его в памяти и последующая передача в буфер обмена для вставки в эксель, либо сразу отправлять в базу (прямо по мере формирования).

Так вот, отправка в базу на сервер в сети, выполняется В РАЗЫ быстрее, чем сбор отчета в текстовую переменную. Видимо, тут играют роль принципы выделения памяти под постоянно растущую переменную. Если эксперименты дадут положительные результаты, можно будет подумать, как это обойти.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556821
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayдля такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно.

Прогнал свой примерчик на скорость со своим тестовым файлом - 3 листа 20x2000 =120000 ячеек с примечаниями заполняются ~3 минуты...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556824
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Promotorway,

Попробуйте для эксперимента собирать данные не в текстовую строку, а выводить в файл на диске. Сравните время. Попробуйте для эксперимента не накапливать данные в переменной, а просто перезаписывать ее поверх (чтобы длина переменной не росла). Сравните время.

У меня есть опыт - я формировал отчет (под VB6) примерно 3000-4000 строк и около 12-ти столбцов. В основном числовые данные и пара строковых. Пользователю предлагался выбор, сформировать его в памяти и последующая передача в буфер обмена для вставки в эксель, либо сразу отправлять в базу (прямо по мере формирования).

Так вот, отправка в базу на сервер в сети, выполняется В РАЗЫ быстрее, чем сбор отчета в текстовую переменную. Видимо, тут играют роль принципы выделения памяти под постоянно растущую переменную. Если эксперименты дадут положительные результаты, можно будет подумать, как это обойти.

Я об этом недавно подумал. Только как сделать, чтобы длина не росла - ведь на каждой итерации длина общая увеличивается. Или вы имеете в виду добавлять в конец файла (append)?
Насчет памяти тоже были мысли, что это из-за этого.
Нужно бы успеть всё это проверить побыстрее, а то при сохранении на винчестер в последнее время стали раздаваться звуки, похожие на метеоритный дождь (или тормоза).
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556825
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFmotorwayдля такой таблицы (около 19000 ячеек) оно занимает 2 мин 30 сек примерно.

Прогнал свой примерчик на скорость со своим тестовым файлом - 3 листа 20x2000 =120000 ячеек с примечаниями заполняются ~3 минуты...
А какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556826
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, можно ли как-то в VBA распараллелить обработку? Если у компьютера 2 ядра, это должно помочь
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556828
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЯ об этом недавно подумал. Только как сделать, чтобы длина не росла - ведь на каждой итерации длина общая увеличивается. Или вы имеете в виду добавлять в конец файла (append)?

Я имел ввиду два разных теста. Вывод в файл на диске - да, просто не закрывая файл принтить туда данные по мере поступления. Потом пришла в голову мысль - просто замените
Код: plaintext
1.
values = values + shname + "|" + col0 + "|" + row0 + "|" + Cell.Text + "`"
integers = integers + shname + "|" + col0 + "|" + row0 + "`"
на
Код: plaintext
1.
values = shname + "|" + col0 + "|" + row0 + "|" + Cell.Text + "`"
integers = shname + "|" + col0 + "|" + row0 + "`"
и протестируйте скорость. Если увеличение скорости будет существенным, будет понятно, с чем бороться (как - вопрос второй)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556829
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayКстати, можно ли как-то в VBA распараллелить обработку? Если у компьютера 2 ядра, это должно помочь

На одной копии экселя наверное не получится. То есть надо, видимо, запускать второй эксель, раздать двум задачам данные напополам и запустить асинхронно.

Только гемора по-моему с этим будет гораздо больше, чем выгоды.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556839
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayА какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек

Athlon X2 5600+, 4 Gb, Windows-7
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36556842
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayА какой у вас комп? У меня в таблице в каждой ячейке были небольшие числа и у каждой по примечанию не длинному. Всего 18967 ячеек

Athlon X2 5600+, 4 Gb, Windows-7

В приложенном файле в модуле modTest вначале запустить процедуру CreateTestFile - сформируется тестовый файл с данными. И только потом запускать собственно программу....
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36557266
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayНо вроде бы считывание данных обычно быстрее должно быть, чем запись, почему же так?
Потому что считывание не виновато, виноват известный VB-баг, тормозная конкатенации строк. Возьмите исходник класса StringBuilder, который есть в примере AndrF , скопируйте в эксель-класс и используйте вместо values = values +
Скорость увеличится на пару порядков.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36557403
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyвиноват известный VB-баг, тормозная конкатенации строк.

Я, в-общем, о том же... на личном опыте получается...
А что за известный баг, я чего-то о нем ничего не слышал? Или ты его уже полностью описал?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36557555
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описал)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558072
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы, конечно, сделать на чистом VBA, т.к. в том коде я не очень разбираюсь... И как дописывать в файл строку? С файлами из VBA тоже редко работал.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558161
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayХотелось бы, конечно, сделать на чистом VBAЭто и будет чистый VBA.

Jah loves you.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558180
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayИ как дописывать в файл строку? С файлами из VBA тоже редко работал.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim F As Integer
F = FreeFile
Open FileName For Output As #F
Print #F, 'строка1'
Print #F, 'строка2'
Print #F, 'строка3'
Close #F
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558402
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayХотелось бы, конечно, сделать на чистом VBA, т.к. в том коде я не очень разбираюсь... И как дописывать в файл строку? С файлами из VBA тоже редко работал.

Это не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так. Потому для ускорения объединения вначале резервируют место под большую строку и просто вставляют туда добавляемые строчки. Примерно так и работает StringBuilder - в NET так же есть аналогичный класс....
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558414
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFЭто не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так. Потому для ускорения объединения вначале резервируют место под большую строку и просто вставляют туда добавляемые строчки. Примерно так и работает StringBuilder - в NET так же есть аналогичный класс....

Я так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558506
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFЭто не совершенно баг, а просто для каждого объединения строк VB приходится перераспределять память, а чем больше строки участвующие в объединении тем дольше это происходит. Это совершенно не зависит от языка разработки - везде так.Это не так. Я вставлял этот clsConcat в .net'овский проект, так он проигрывал .net-конкатенации.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36558883
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, AndrF, Shocker.Pro, спасибо, на этот раз похоже действительно выручили. Обработка стала гораздо быстрее, в своём роде небольшое чудо. Пока еще не всё попробовал, но уже видны результаты. Я всё-таки был уверен, что если Майкрософт действительно хорошая фирма, то у них это можно как-то сделать :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560381
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг.

И в каком это языке под строковую переменную выделяется фрагментированная память?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560383
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПока еще не всё попробовал, но уже видны результаты.

Если в моем примере функцию ConvS заменить на нижеприведенную, то результаты будут еще в несколько раз лучше...

Код: plaintext
1.
2.
3.
4.
Public Function ConvS(ss As String) As String
    If Len(ss) =  0  Then Exit Function
    ConvS = Replace(Replace(Replace(Replace(Replace(ss, "&", "&"), "'", "'"), """", """), ">", ">"), "<", "<")
End Function
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560385
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFmotorwayПока еще не всё попробовал, но уже видны результаты.

Если в моем примере функцию ConvS заменить на нижеприведенную, то результаты будут еще в несколько раз лучше...

Пардон - код вставился неправильно. Возьмите функцию из собственно приложенного примера.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560521
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFShocker.ProЯ так думаю, чтоб если бы ядро не пыталось каждый выделить непрерывный кусок памяти под это дело, а использовало разумную фрагментацию, то работало бы это быстрее. Так что относительно - все-таки баг.

И в каком это языке под строковую переменную выделяется фрагментированная память?

не знаю, но это было бы логично для длинных переменных

Опять же, Антонарий говорит, что .NET работает в этом плане лучше, стало быть так наверное там и сделано.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560553
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProОпять же, Антонарий говорит, что .NET работает в этом плане лучше, стало быть так наверное там и сделано.

Не так ;) Насколько я знаю выделяемая под переменную память нигде не фрагментируется.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560706
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560803
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.

По сравнению с чем?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560889
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С конкатенацией, тысяча чертей.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560915
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ не знаю, как там сделано, знаю только результаты теста — использование StringBuilder'а выйгрыша не дает.

Кстати, [q]String[/q] как переменная безусловно нигде не фрагментируется. А вот внутри NET-овского [q]StringBuilder[/q]-a фрагментирование блоками заданного размера возможно - именно за счет этого он и может выдавать большую скорость чем приведенные в ветке варианты на VB6 (так как нет нужды переписывать блоки - достаточно только добавлять). Написать аналогичный класс на VB6 так же вполне возможно, причем без особых проблем.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36560928
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС конкатенацией, тысяча чертей.

А попробовать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Sub Main()
        Dim sb As New System.Text.StringBuilder, i As Integer, t As Double, ss As String = ""

        t = Timer
        For i =  1  To  1000000 
            sb.Append(CStr(i))
        Next i
        MsgBox(sb.Length & ",  " & Timer - t)
        '        Debug.WriteLine(sb.Length & ",  " & Timer - t)

        t = Timer
        For i =  1  To  1000000 
            ss += i.ToString
        Next i
        MsgBox(sb.Length & ",  " & Timer - t)

    End Sub

Ну и аналогично можно в VB6. Правда там будет на больших числах заметно большее замедление - надо переделать класс а-ля NET.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561735
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока что мои проблемы не закончились, и битва продолжается. Некоторые процедуры пока выполняются около 30 сек. Пытаюсь ускорить.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561752
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС конкатенацией, тысяча чертей.

Спасибо за код класса, применил у себя, получил ускорение формирования отчета примерно в 10000 раз (правда на отчете за целый год, который обычно не используется).

Обычно пишу в камментах к чужому коду ссылку на источник и автора по возможности... Тебя указывать? :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36561933
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ударение на "Тебя", а не на "указывать" [/i]
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562042
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Появилась проблема с этим классом. Раньше у меня переменные были как строки, а мне нужно использовать str=Mid(str, 1, Len(str) - 3), и пишет, что не поддерживается такой метод. Как быть?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562051
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПоявилась проблема с этим классом. Раньше у меня переменные были как строки, а мне нужно использовать str=Mid(str, 1, Len(str) - 3), и пишет, что не поддерживается такой метод. Как быть?

Добавьте в метод Append параметр предварительной очистки:
получится типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Sub Append(ByRef nStr As String, Optional PreClear As Boolean = False)
Dim LenStr As Long
    If PreClear Then Class_Initialize
    LenStr = Len(nStr)
    If LenStr =  0  Then Exit Sub
    If (LenTxt + LenStr) > LenBuf Then
        LenBuf = (LenTxt + LenStr) *  2 &
        TxtBuf = TxtBuf & Space$(LenBuf)
    End If
    Mid$(TxtBuf, LenTxt +  1 &) = nStr
    LenTxt = LenTxt + LenStr
End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562053
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно встроить метод Mid прямо в класс.

И в конце-концов через год получится .NET
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562054
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сделал по-другому - нужно было просто писать str.Result, и тогда это воспринимается как строка.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562059
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayСпасибо, сделал по-другому - нужно было просто писать str.Result, и тогда это воспринимается как строка.

Ну, разумеется, я думал это проблему не вызывает. Однако, вам же что-то надо решить и с левой частью выражения.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562062
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я присвоил это новой строке с другим именем :)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562133
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFА попробовать:
Я говорил про самодельный StringBuilder (которые есть в вашем примере, в моем под именем clsConcat ), а не System.Text.StringBuilder. Сколько повторять?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562140
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так... вот еще одна проблема - загрузка данных в ячейки из файла (данные хранятся в виде строки).
Занимает около 22 сек.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
stack = Readfile("D:/.../stack" & num & ".txt")
List = Split(stack, ":::")

    
For Each l In List
Sheet = Split(l, "~")
sheetname = Sheet( 0 )
znach = Sheet( 1 )
zn = Split(znach, "`")
Set shname = Worksheets(sheetname)
For Each Z In zn
If (Len(Z)) Then
Data = Split(Z, "|")
yach = Data( 0 )
Value = Data( 1 )
shname.Range(yach).Value = Value

End If
Next Z

Next l

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function Readfile(path As String)
Dim TextLine
Open path For Input As # 1  ' Open file.
Do While Not EOF( 1 ) ' Loop until end of file.
Line Input # 1 , TextLine ' Read line into variable.

Loop
Close # 1 
Readfile = TextLine
End Function

Вроде бы ведь до этого получалось ускорить такого рода парсинг, а тут опять тормозит. Можно как-то ускорить это?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562142
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyС конкатенацией, тысяча чертей.

Спасибо за код класса, применил у себя, получил ускорение формирования отчета примерно в 10000 раз (правда на отчете за целый год, который обычно не используется).

Обычно пишу в камментах к чужому коду ссылку на источник и автора по возможности... Тебя указывать? :)Не я его придумал.
Кстати загляни .
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562153
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayТак... вот еще одна проблема - загрузка данных в ячейки из файла (данные хранятся в виде строки).
Откуда нам знать, что в этой строке не стопицот мегабайт и это отличный результат?

motorwayВроде бы ведь до этого получалось ускорить такого рода парсинг, а тут опять тормозит.Так ничему и не научился. Это печально :(
Код: plaintext
Data = Split(Z, "|")
Это что за ерунда? Instr кому давали?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562159
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там примерно того же порядка объем, в данном случае около 120 кБ. Насчет Split и InStr я понял. Но главные тормоза в них разве? Вроде бы до этого пришли к выводу, что в обращении к ячейкам.
Можно попробовать переделать и на InStr.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562179
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyAndrFА попробовать:
Я говорил про самодельный StringBuilder (которые есть в вашем примере, в моем под именем clsConcat ), а не System.Text.StringBuilder. Сколько повторять?

Ну я уже тоже говорил, что самодельные классы вполне можно доработать, чтобы строки буфера добавлялись в коллекцию заданными блоками и объединялись в единую строку только при запросе результата. Тогда не будет перераспределения большого объема памяти - думаю так и работает NET-овский StringBuilder. Тогда и разница со StringBuildera-ми VB6 и NET версий сведется к минимуму.

Ну а как простейший выход (чтобы ничего не переделывать, ибо это уже просто влом при наличии готового NET) - выделять буфер в StringBuilder-e большими порциями - скажем по нескольку мегабайт...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562202
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль, что с InStr у меня не получается ловко управляться. В основном я делал строку такого вида, чтобы её было легко резать Split'ом
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562217
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, если у кого-нибудь есть желание переписать за большое спасибо мой код с использованием InStr, я буду рад :)
Сама строка имеет вид Лист1~B2|value`C2|value`...`:::Лист2~B2|value`C2|value`:::Лист3~B2|value`C2|value`
Нужно аналогичным образом выудить значения соответствующие и присвоить их листу, например для ячейки B2 на листе 1 будет значение value.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayВ общем, если у кого-нибудь есть желание переписать за большое спасибо мой код с использованием InStr, я буду рад :)

Этот код был предложен мной еще на первой странице этого топика
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562220
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь немного отличается формат строки, это уже строка другого вида. Сначала идут названия листов, потом знак тильды, потом все ячейки, относящиеся к этому листу, потом разделитель ":::", потом следующий лист.
Тут надо по-другому немного обрабатывать.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562222
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЗдесь немного отличается формат строки, это уже строка другого вида. Сначала идут названия листов, потом знак тильды, потом все ячейки, относящиеся к этому листу, потом разделитель ":::", потом следующий лист.
Тут надо по-другому немного обрабатывать.

Ну так доработайте
общий принцип же ясен
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562224
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже в этом коде я как-то с трудом разбираюсь. Общий принцип примерно ясен, но доработка для меня будет тяжела.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562379
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayДаже в этом коде я как-то с трудом разбираюсь. Общий принцип примерно ясен, но доработка для меня будет тяжела.
Я хотел-бы услышать название продукта и фирмы производителя, потому что motorwayПользоваться системой будут, если получится, не обычные "одиночные пользователи", а люди из фирмы с большими запросами. Так что если такая ситуация будет на первом испытании системы, дальше они даже разговаривать не будут. :) у меня фирма с большими запросами и я хоть буду знать от чего нужно отбрыкиваться всеми способами.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562408
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносЯ хотел-бы услышать название продукта и фирмы производителя, ....буду знать от чего нужно отбрыкиваться всеми способами.

Зачем?
"А я милаавааа.... узнаю да папахоооод-ке...." (с)
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562592
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> "А я милаавааа.... узнаю да папахоооод-ке...." (с)

Но не все так хорошо узнали "милаавааа...", что-бы узнавать по походке. Кому-то глядишь и пригодится :D

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562605
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayДаже в этом коде я как-то с трудом разбираюсь. Общий принцип примерно ясен, но доработка для меня будет тяжела.

Что поделаешь...
С чем было интересно остальные для себя уже разобрались - дальше уже стало просто неинтересно...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36562637
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: AndrF
> С чем было интересно остальные для себя уже разобрались - дальше уже стало просто неинтересно...


+1000
Браво! можно я буду цитировать эту фразу?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36563709
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> С чем было интересно остальные для себя уже разобрались - дальше уже стало просто неинтересно...


+1000
Браво! можно я буду цитировать эту фразу?

Можно.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36563921
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
Я хотел-бы услышать название продукта и фирмы производителя
В данном случае это не важно, у меня возникла конкретная проблема, когда много ячеек в таблице. А сам продукт всех устроит.
То, что мне сложно исправить тот код, объясняется плохим состоянием здоровья - делаю эту программу из последних сил с постоянной тяжестью в голове. Так что тут не очень смешно всё.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36563949
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: motorway
> То, что мне сложно исправить тот код, объясняется плохим состоянием здоровья - делаю эту программу из последних
> сил с постоянной тяжестью в голове. Так что тут не очень смешно всё.

Я совершенно не смеялся спрашивая о названии, потому, что незнание основ объясняется их не знанием, а не плохим
здоровьем. Хотя плохое самочувствие тоже накладывает отпечаток, здесь могу только посочувствовать и пожелать скорейшего
выздоровления. Но использовать продукт, который разрабатывает программист имеющий очень поверхносные представления о
возможностях языка я не хочу.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36563970
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основы VBA я в целом знаю, в данном случае просто на переделку алгоритма с использованием другой функции мне потребуется время, т.к. нужно вникнуть в суть предложенной оптимизации. Ну и часто приходится работать поздно вечером, производительность тогда маленькая.
С точки зрения пользователя я думаю, что более важен функционал (которого, в частности, нет в других продуктах), а при использовании продукта, если все работает нормально, пользователь даже не подозревает, хороший или не очень программист.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36563980
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и на самом деле, если бы вы увидели весь функционал, то вы бы не стали отбрыкиваться даже при минусах в интерфейсе и скорости...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36569592
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, обнаружил еще одну возможную проблему. Может ли в принципе тормозить посылка данных на сервер (localhost)? Делаю с помощью WinHttpRequest.Send, посылается где-то 200 кб. Сделал вывод сообщения до этой команды и после, и почему-то 2 минуты это занимает.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36569635
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот еще подскажите, как организовать при изменении ячеек их добавление в некоторый массив (Range), откуда дальше будет идти считывание? Сейчас у меня цикл по всему листу, а я хочу только по изменившимся ячейкам. При этом дубликаты должны удаляться, если ячейку изменяли несколько раз.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36569971
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayИ вот еще подскажите, как организовать при изменении ячеек их добавление в некоторый массив (Range), откуда дальше будет идти считывание? Сейчас у меня цикл по всему листу, а я хочу только по изменившимся ячейкам. При этом дубликаты должны удаляться, если ячейку изменяли несколько раз.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim colChanged As Collection

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sKey As String
    if colChanged Is Nothing then Exit Sub 'коллекцию нужно инициализировать только после того, 
                                 'как загружен основной массив данных, иначе туда попадут все ячейки
    sKey = Target.Row & ":" & Target.Column
    On Error Resume Next
    colChanged.Add Target, sKey
    If Err.Number <>  0  Then 'если ячейка уже менялась и есть в коллекции
        colChanged.Remove sKey
        colChanged.Add Target, sKey
    End If
End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36569973
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayКстати, обнаружил еще одну возможную проблему. Может ли в принципе тормозить посылка данных на сервер (localhost)? Делаю с помощью WinHttpRequest.Send, посылается где-то 200 кб. Сделал вывод сообщения до этой команды и после, и почему-то 2 минуты это занимает.Раз у вас тормозит, значит в принципе может. Но вообще не должно.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571795
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim colChanged As Collection

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sKey As String
    if colChanged Is Nothing then Exit Sub 'коллекцию нужно инициализировать только после того, 
                                 'как загружен основной массив данных, иначе туда попадут все ячейки
    sKey = Target.Row & ":" & Target.Column
    On Error Resume Next
    colChanged.Add Target, sKey
    If Err.Number <>  0  Then 'если ячейка уже менялась и есть в коллекции
        colChanged.Remove sKey
        colChanged.Add Target, sKey
    End If
End Sub
[/quot]
Что-то не очень пойму, как работает ваш код. Я попробовал его вставить, потом изменяю ячейки, но Msgbox colChanged.Count не работает (пробую отобразить число элементов).
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571804
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorway,

вы не забыли про
Код: plaintext
Set colChanged = New Collection
?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571828
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, этой строки у меня не было, но все равно не работает так как нужно. Теперь все время пишет, что 1 элемент в коллекции.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571830
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне просто нужно накапливать в массиве все ячейки, которые изменялись
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571834
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayМне просто нужно накапливать в массиве все ячейки, которые изменялись

Собственно, так этот код и должен работать.
Попробуйте поставить там точку останова и пошагово посмотреть, что происходит при изменении РАЗНЫХ ячеек.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36571890
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
motorway,
у меня так заработало (мессидж потом убери):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Option Explicit

Dim colChanged As New Collection

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sKey As String
    If colChanged Is Nothing Then Exit Sub 'коллекцию нужно инициализировать только после того,
                                 'как загружен основной массив данных, иначе туда попадут все ячейки
    sKey = Target.Row & ":" & Target.Column
    On Error Resume Next
    colChanged.Add Target, sKey
    If Err.Number <>  0  Then 'если ячейка уже менялась и есть в коллекции
        colChanged.Remove sKey
        colChanged.Add Target, sKey
    End If
    MsgBox colChanged.Count
End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36572174
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Dim colChanged As New Collection
Так делать нельзя, я для чего комментарии писал? При проверке на Nothing объект, объявленный как New, создается, поэтому условие никогда не выполнится. Результаты:
1) При заливке данных в коллекцию попадут все ячейки и смысл этой процедуры полностью теряется. С таким же успехом можно перебрать не коллекцию, а весь лист.
2) Заливка будет адски тормозить.


Jah loves you.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36572176
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, это условие:
Код: plaintext
1.
2.
3.
4.
If Err.Number <>  0  Then 'если ячейка уже менялась и есть в коллекции
    colChanged.Remove sKey
    colChanged.Add Target, sKey
End If
можно выкинуть.

Jah loves you.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36608300
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил одну вещь - обработка примечаний ускоряется, если не использовать массив SpecialCells (только ячейки с примечаниями), а просто написать 2-ной цикл по ячейкам. А вот насчет того, как лучше сделать - цикл со счётчиком или For Each - как быстрее? Хотя бы в теории (для данного случая).
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36608736
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy,
так что в итоге?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Option Explicit

Dim colChanged As New Collection

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sKey As String ', i As Long
    sKey = Target.Row & ":" & Target.Column
    On Error Resume Next
    colChanged.Add Target, sKey

'    MsgBox "In Collection " & colChanged.Count & " Items."
'
'    For i = 1 To colChanged.Count
'      MsgBox colChanged.Item(i)
'    Next

End Sub
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36609247
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще вопросик: может ли при выключенном обновлении экрана меняться курсор мышки с часов на просто курсор и обратно? Или всё время должен быть неподвижным - часы?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36611809
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось ускорить некоторые проблемные функции, где нужно было обновлять содержимое каждой ячейки. Сделал сначала запись в файл нужных данных, а потом вставку из него на лист. В таком варианте это занимает около 2 сек.
А обновление примечаний, кстати, работает достаточно быстро само по себе. Если сделать таблицу 20 на 1000 с автозаполнением, и потом менять цифры, то примечания обновляются быстро.
А вот Cells(i,j).Value - медленно
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36611812
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorway,

Позвольте полюбобытствовать, вы все еще готовите презентацию для заказчика?...
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615816
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, да, как ни странно :) Характеристики быстродействия улучшились, так что поводов пролететь стало меньше.
А посоветуйте, кстати, еще на одной вещи, если знаете:
есть массив строк, в котором надо заменять знаки доллара на "пустое место", т.е. убирать их. Как более выгодно - заменять их в цикле для каждого такого элемента, или применить эту замену уже ко всей большой строке (около 200-400 кб)?
Что-то мне подсказывает, что второй вариант лучше.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615835
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayЧто-то мне подсказывает, что второй вариант лучше.

Мне тоже подсказывает, однако вы задаете уже третий вопрос, который быстрее самому проверить, чем ждать ответа на форуме. Ибо нам тоже надо пробовать, чтобы дать точный ответ.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615841
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверить можно, но я хотел получить именно аргументированные советы, почему лучше так или так.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615845
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, в 1-м случае будет много накладных расходов на вызов функции много раз, хоть и объем данных будет меньше.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615849
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПроверить можно, но я хотел получить именно аргументированные советы, почему лучше так или так.

По идее встроенная функция отработает быстрее, чем ваш собственный цикл, но все же лучше проверить.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615918
ak787
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorwayПривет всем.
Есть файл Эксела с рабочей областью около 20000 ячеек, с помощью макросов на VBA обеспечивается передача данных на сервер вычислителю и обработка поступивших от него данных.
Данные посылаются и принимаются в виде строки. Для данного файла это около 200 кБ.
Основная проблема во времени. Для 7000 ячеек, например, формирование строки занимает около 10 секунд, а обработка поступивших данных и их отображение в таблице - около 1 мин 20 сек. Для такого размера таблицы это много.
А для 20000 ячеек вообще чуть ли не 20 минут все это делается.
Конечно, можно передавать только изменившиеся по сравнению с прошлым вариантом ячейки, но если их будет много, то все равно нужно ускорить это.
Сейчас все это делается в цикле, каждой ячейке присваивается полученное значение. Здесь в принципе тоже можно сократить объем данных, если обновлять только изменившиеся ячейки.
Но даже так может получаться общее время около 1 мин. Нет ли способа принципиально это ускорить? Может быть, с помощью базы данных - генерировать файл БД в формате .mdb, а затем макросом вставлять данные из неё.
Сам код функции разбора полученной с сервера строки (лишние маловажные части убраны):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Sub Parse(serverres)
Application.ScreenUpdating = False
Application.EnableEvents = False
If (Mid(serverres,  1 ,  3 ) = "!!!") Then MsgBox (Mid(serverres,  5 ))

If (Not Mid(serverres,  1 ,  3 ) = "!!!") Then

    result = Split(serverres, "~~~END~~~")

Dim color As Integer
    If (Mid(serverres,  1 ,  12 ) <> "~~~END~~~") Then
    znach = Split(result( 0 ), "`")
  
    For Each zn In znach
        If (Len(zn)) Then
        parts = Split(zn, "|")
        listname = parts( 0 )
        yach = parts( 1 )
        Value = parts( 2 )
        color = "0"
        vych = True
    
        If (Trim(Worksheets(listname).Range(yach).Value) <> Value) Then color =  1 
        If (Trim(Worksheets(listname).Range(yach).Value) = Value) Then color =  2 
        Worksheets(listname).Range(yach).Value = Value
        If (color =  1 ) Then Worksheets(listname).Range(yach).Font.color = vbBlue
        If (color =  2 ) Then Worksheets(listname).Range(yach).Font.color = vbBlack
        End If
    Next zn
End If
End If


Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Что-то можно с этой проблемой сделать или нет (очень долгая обработка)?


здесь явно не хватает (конечно, если у вас есть формулы в листах)
Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic


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

А вообще если данных много, то их нужно сначала поместить в массив, а затем вставлять, используя метод Range.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615932
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ak787,
выключения пересчета формул присутствует в другом месте. Шрифт я пока убрал, так как это достало меня - этот код (с учетом посылки данных на сервер и обработки там) быстрее 15 секунд для большого числа ячеек не хотел работать. В случае обновления малой части таблицы всё получалось за 5 где-то. Т.е. вся процедура работала за 5 секунд в лучшем случае.
Сейчас я сделал вставку массива целиком, и 5 секунд - стабильное время даже для случая, когда надо всю таблицу обновлять.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615935
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть, посылка на сервер занимает 3 секунды, обработка там 1-2, а этот код парсинга и вставки срабатывает где-то за 1 секунду.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36615996
ak787
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorway,

имхо для базы данных думаю это хорошее время, если конечно случай типичный
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36648903
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного узнал про еще один способ решения проблемы со скоростью и др. - использовать для макросов C#. Только мне непонятно, как можно писать макросы на C#, или это уже не макросы, а возможно только использование dll / создание exe файла для работы с Экселом?
Якобы на C# / VB.NET можно сделать многое, что и на VBA, но там будет быстрее. Если у меня сейчас есть макросы на VBA, это вообще реально переделать под .NET, чтобы все работало также?
Я вообще не понимаю, как это может работать также, если VBA встроен в Эксел, а с .NET надо работать с помощью Visual Studio. Ведь, наверно, весь доступ к объектам Эксела будет таким же? Или там действительно какие-то новые возможности?
Если конкретнее, я тут писал всякие примеры кода на VBA. Сделать то же самое на .NET, чтобы работало в Экселе - это реально или из разряда фантастики и смысла не имеет (т.е., посоветовали мне неправильно)? Как это туда встроить?
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36648931
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Можно из .NET установить связь с экселем через COM и оперировать его объектной моделью. Но это очень тормознутый способ.

2) Можно писать отдельные самодостаточные модули на .NET (функции по обработке данных) и вызывать их из VBA. Ну что-то типа dll сделать.

Работу с самими объектами экселя эти способы не ускорят. Только если какие-то функции анализа данных.
...
Рейтинг: 0 / 0
Долгая обработка текстовых данных в Экселе
    #36648988
motorway
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим ясно более-менее, спасибо. Также насчет проблемы представления данных (я писал о форматах в другой теме) - якобы с помощью VS можно обойти трудности представления текста вида [min,max]. В частности, есть такой формат, как binary decimal, если не ошибаюсь. Вы про него знаете что-нибудь в .NET?
...
Рейтинг: 0 / 0
172 сообщений из 172, показаны все 7 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]