Excel в XML: увеличение производительности

Я хотел бы спросить кого-нибудь, есть ли у него какие-либо идеи, как сделать этот код быстрее. В настоящее время в случае больших данных (более 180 000 строк / 39 столбцов) для генерации всего кода в случае использования MS Excel 2007 требуется около 5:50 часов.

Я был бы рад за любой совет.

Sub TOXML() strChoosenFile = InputBox("Write number of file which you want generate.", "Choose sheet for generation XML") Worksheets("time").Cells(1, 1) = Now Application.ScreenUpdating = False Dim lngRow As Long Dim strInsetText$ lngRow = 1 RowsInSource = Worksheets(strChoosenFile).Range("A300000").End(xlUp).Row - 2 ColumnsInSource = Worksheets(strChoosenFile).Range("DD2").End(xlToLeft).Column For i = 1 To RowsInSource strInsetText = "<R>" For x = 1 To ColumnsInSource strInsetText = strInsetText & "<S>" & Worksheets(strChoosenFile).Cells(i + 2, x).Text & "</S>" Next x strInsetText = strInsetText & "</R>" Worksheets(strChoosenFile & "-XML").Cells(lngRow, 1) = strInsetText lngRow = lngRow + 1 strInsetText = "" Next i Worksheets("time").Cells(1, 2) = Now Application.ScreenUpdating = True MsgBox "Done: " & i - 1 End Sub 

Попробуйте этот код. Это занимает всего 15 секунд на моей машине (для 180 000 строк / 39 столбцов)

 Sub TOXML() Dim strChoosenFile Dim lngRow As Long, RowsInSource As Long, ColumnsInSource As Long, i As Long, x As Long Dim strInsetText As String Dim arr Dim res() As String strChoosenFile = InputBox("Write number of file which you want generate.", "Choose sheet for generation XML") Worksheets("time").Cells(1, 1) = Now Application.ScreenUpdating = False With Worksheets(strChoosenFile) RowsInSource = .Range("A300000").End(xlUp).Row - 2 ColumnsInSource = .Range("DD2").End(xlToLeft).Column 'write all values in array arr = .Range(.Cells(3, 1), .Cells(RowsInSource + 2, ColumnsInSource)).Value End With 'Redim array for result, note that I'm using 2D array, 'because I want to get "Column" array, rather than "Row" array ReDim res(1 To RowsInSource, 1 To 1) For i = 1 To RowsInSource res(i, 1) = "<R>" For x = 1 To ColumnsInSource res(i, 1) = res(i, 1) & "<S>" & arr(i, x) & "</S>" Next x res(i, 1) = res(i, 1) & "</R>" Next i 'write result of array on the sheet Worksheets(strChoosenFile & "-XML").Cells(1, 1).Resize(UBound(res)).Value = res Worksheets("time").Cells(1, 2) = Now Application.ScreenUpdating = True MsgBox "Done: " & i - 1 End Sub 

Также я не знаю, почему вы жестко закодировали .Range("A300000") и .Range("DD2") (возможно, вам это нужно), но также читайте: Как определить последнюю использованную строку / столбец

Предложение: попытайтесь переместить данные рабочего листа в массив:

 dim ar() as variant ar = Worksheets(strChoosenFile).Range("A1").CurrentRegion 'or any range selection method 

Затем работайте с элементами массива вместо ячеек. Это минимизирует обмены между VBA и рабочим листом, которые являются дорогостоящими (с точки зрения производительности).
Аналогично, вы можете также загружать целые строки вместо ячеек.

  • XSLT считывается из двух разных источников (файл XML и лист Excel)
  • Как установить ключи HashMap в качестве тегов в XML-файле?
  • Генерировать EXCEL из XML с помощью XSLT
  • Почему эта комбинация XML / XSD не экспортируется из Excel 2007?
  • Данные в EXCEL, PDF, WORD (данные будут текстовыми, табличными, изображениями) в XML
  • Создание excel после обнаружения различий в XML
  • Чтение атрибута XML VBA
  • AS3 / FLASH / AIR: Можно ли открыть XML в Excel? ДА
  • Ruby: Как ограничить некоторые элементы структуры определенными значениями и сделать некоторые элементы обязательными во время разбора XMl
  • Как объединить XML-строку с XML, созданной путем объективации?
  • Решение о выдаче листа Excel на основе группы ценностей
  • Interesting Posts

    Конкатенация в VBA в Excel

    Есть ли способ редактировать xlsx книги, содержащие изображения в Python?

    Установите несколько слайсеров сразу в Excel

    Excel 2007: Как отобразить формат mm: ss не как DateTime (например, 73:07)?

    Можно ли изменить функцию Enter для одной ячейки?

    Чтение данных из файла excel каждые 500 миллисекунд в c #

    В Powershell я вызываю SQL-запрос, который возвращает 10 таблиц … как я могу превратить каждую таблицу в свою собственную переменную?

    Обновление существующих данных в существующей строке из пользовательской формы

    выполнение логических операций в vba

    Динамический диапазон для каждого цикла

    Используйте автофильтр по более чем 2 критериям

    Как отправить ввод с excel на python?

    Как выполнить операцию excel через Python?

    Я получаю вывод мусора для файла excel, созданного на phpexcel на сервере, в то время как на localhost он работает нормально

    Как влиять на ширину выпадающего списка без изменения ширины столбца, содержащего список

    Давайте будем гением компьютера.