Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 00:47   #1
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
Злость Обработка большого кол-ва текстовых данных (Excel 2010)

Доброго времени суток.
У меня появились большие проблемы при работе с большими таблицами (около 20000 ячеек).
Во-первых, кто-нибудь знает, какова макс. длина текста в ячейке в Экселе 2010? У меня в приложении при работе с большими моделями в ячейку нужно записывать много текста, возможно, где-то до 200 кб. Но, похоже, это не лучший вариант, т.к. там может не все уместиться. И при этом скорость работы просто ужасная - мне нужно обрабатывать много данных, получается просто безбожно по скорости (20 минут обрабатывало, и в конце получилась ошибка). Стоит ли записывать эти данные в файл, а не в ячейки, нормальная ли скорость работы с файлами будет?
Основная проблема вот в чем:
вначале данные из ячеек (~20000) собираются в строку и отсылаются на сервер, дальше приходит ответ с сервера с результатами тоже в виде строки. Их надо обработать и раскидать новые значения по ячейкам. Строка имеет вид "данные для 1 ячейки - разделитель - для 2 ячейки - разделитель" и т.п.
Даже сама эта обработка получается очень медленной - происходит парсинг строки и присвоение ячейкам новых значений (напр., B2=30, B3=40, B4=50...).
Есть ли способ как-то ускорить такой парсинг, или при таком числе ячеек не стоит надеяться на приемлемую скорость (макс. 0,5-1 мин)?
Желательно принципиально ускорить.
Пример файла не даю по нек-рым причинам - тут важен не сам файл, а общая картина.
motorway вне форума Ответить с цитированием
Старый 25.03.2010, 07:34   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Самый, на мой взгляд, рациональный способ, который может оказаться в десятки (а то и сотни) раз быстрее, это не работать с ячейками листа.
Например, с помощью FileSystemObject считывать данные из текстового файла в переменную (или массив), обработать так, как Вам требуется (опять же, бкз использования ячеек рабочего листа), получить результат в виде массива, и только потом, одной командой, поместить данные на лист.
Естественно, не зная конкретной задачи, ответ в очень общих чертах.

P.S. С Excel 2010 дела не имел.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 25.03.2010 в 07:40.
SAS888 вне форума Ответить с цитированием
Старый 25.03.2010, 17:38   #3
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Спасибо за ответ. Но проблема именно в том, что ячейки нужны для ввода данных в таблицу. В нее вводятся значения и формулы, затем формируется длинная строка из них и посылается на сервер. Полученный результат парсится и помещается в таблицу. Дело усложняется наличием примечаний к ячейкам.
У меня есть подозрение насчет времени - в цикле для каждой ячейки ищется ее содержимое и прибавляется к посылаемой строке result: result=result+Cell.Value (примерно так). И вот когда строка уже большая, наверно, каждый раз происходит чтение текущего ее значения, а затем к ней дописывается новое значение. Соотв-но, если 20000 ячеек, а строка удлиняется, то каждый раз гоняются килобайты, и из-за этого все тормозит. Правда, не знаю, можно ли по-другому...
motorway вне форума Ответить с цитированием
Старый 25.03.2010, 17:58   #4
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

У меня обрабатывается около 3 млн. ячеек и все это дело вставляется на лист секунд за 15-20. Правда там в основном числа, ячеек с текстом около 1 тыс. Но все равно. А метод использую то что указал SAS888. Так что лучше подготовь файл без конфиденциальной информации и выкладывай...
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 25.03.2010, 19:05   #5
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Сам файл довольно долго переделывать - там еще много макросов, и код надо подчищать, чтобы убрать лишнее.
Пока что остановлюсь на проблемной функции парсинга полученного от сервера ответа (она для ~8600 ячеек занимает больше 1 минуты, строка поступает размером 213 кБ, малозначимые части кода убраны):

Код:
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
Функция разбирает строку и присваивает ячейкам нужные значения.
Все-таки для такого объема это несусветно много по времени, а планируется работать с 20000 ячеек. Там-то вообще может 20 минут тормозить.

И пример поступающей строки прикладываю.
Вложения
Тип файла: txt restext.txt (208.4 Кб, 118 просмотров)
motorway вне форума Ответить с цитированием
Старый 26.03.2010, 03:04   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Посмотрите мой вариант.На примере вашего Текстовика порядка 30 секунд.Справедливо в диапазоне A-Z
Файл 2007
Вложения
Тип файла: rar Парс.rar (241.8 Кб, 18 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 26.03.2010, 11:11   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

В моем старом варианте нагородил огород,полагал.что обращение к ячейке через индекс столбца будет быстрее.На практике это не подтвердилось.Попробуйте этот вариант.Так как есть условие замены цвета.то к ячейкам все равно надо обращаться
Код:
Sub Parsing()
Application.EnableEvents = False
Set oFSO = CreateObject("Scripting.FileSystemObject")
Txt = oFSO.OpenTextFile(ThisWorkbook.Path & "\restext.txt", 1, False).readall
Application.ScreenUpdating = False
 Dim znach
 Dim znac
 Dim val

 Dim shName As String

znach = Split(Txt, "`", -1)
        If InStr(znach(UBound(znach)), "END") > 0 Then
            For m = 0 To UBound(znach) - 1
              znac = Split(znach(m), "|")
              shName = znac(0)
                zn = znac(1)
               val = Replace(znac(2), "[", "")
             val = Replace(znac(2), "]", "")
              With Sheets(shName)
            If .Range(zn).Text = val Then
           .Range(zn).Font.Color = vbBlack
             Else
            .Range(zn).Font.Color = vbBlue
           .Range(zn) = val
            End If
           End With
            Next
        End If
      Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 26.03.2010, 14:52   #8
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Попробую. А у меня появилась мысль - может, это можно через Аксесс провернуть? Данные с сервера скидывать в .mdb файл, а потом макросом вставлять в таблицу. Так не быстрее будет? Правда, важно, чтобы при этом никуда не делись примечания к ячейкам и остальные вещи типа стилей.
motorway вне форума Ответить с цитированием
Старый 26.03.2010, 15:30   #9
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Ведь, к примеру, в Экселе 2007 есть функция "Данные из Аксесс". Там они вставляются довольно быстро, правда, не знаю насчет 20000 ячеек, но вроде бы это типичная ситуация для БД, так что должно работать быстро - не 20 минут же. Хотя для 20000 и моего приложения и 1,5 мин много.
motorway вне форума Ответить с цитированием
Старый 27.03.2010, 00:47   #10
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Также есть возможность записать рез-ты работы скрипта на сервере в MySQL, чтобы подключаться к ней из Эксела и отображать полученные данные. Это реально и лучше ли?
motorway вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка текстовых файлов Маринка777 Общие вопросы .NET 2 22.12.2009 17:37
Обработка данных с помощью приложения Microsoft Excel Pugoffka Помощь студентам 0 03.12.2009 10:42
Обработка символьных данных и текстовых файлов Skrip Общие вопросы C/C++ 7 17.06.2009 21:54
Обработка символьных данных и текстовых файлов Skrip Общие вопросы C/C++ 13 10.06.2009 20:51
Обработка текстовых файлов Frenki Помощь студентам 4 17.05.2009 14:52