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


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