powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
25 сообщений из 172, страница 4 из 7
Долгая обработка текстовых данных в Экселе
    #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
25 сообщений из 172, страница 4 из 7
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Долгая обработка текстовых данных в Экселе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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