Добрый день.
Есть макрос на VBA, скорость работы которого меня не устраивает. Суть работы макроса - считывает с рабочего листа Excel численные данные, обрабатывает по заданному алгоритму, результаты вываливает обратно на листы Excel.
Есть, ощущение, что если бы алгоритм был реализован в скомпилированном приложении на VB, то скорость бы возросла. Я знаю основы VBA, но никогда не занимался VB, потому хочу оценить насколько перспективна такая возможность решения проблемы. То есть будет ли реально приложение работать быстрее? Примерно во-сколько раз?
И через какие объекты или операторы из VB можно открыть нужную книгу Excel, считать данные с нужного диапазона, и как обратно создать в этой книге новый лист, разместить на них данных из массива и сохранить эту книгу?
С уважением, Анатолий
Быстрее ли VB, чем VBA и как сделать экспорт/импорт с Excel?
Модератор: Naeel Maqsudov
А как вы считываете данные с листа и как вы их обратно на лист переносите?
В своей процедуре я считываю данные с рабочего листа Excel. Код конкретно такой:
For Row = 1 To NumRows + 1
WorkMas(Row, 1) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 1)
WorkMas(Row, 2) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 3)
WorkMas(Row, 3) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 5)
WorkMas(Row, 4) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 6)
WorkMas(Row, 5) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 7)
WorkMas(Row, 6) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 8)
Next Row
Здесь WorkMas() - рабочий массив.
Вывод делаю так:
Set PrintRange = Sheets(Sheets.Count).Range(Cells(1, 1), Cells(65001, 11 + Months))
PrintRange.Value = Result
Здесь Result() - массив с результатами, который я ставлю на последний (Sheets.Count) рабочий лист.
For Row = 1 To NumRows + 1
WorkMas(Row, 1) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 1)
WorkMas(Row, 2) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 3)
WorkMas(Row, 3) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 5)
WorkMas(Row, 4) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 6)
WorkMas(Row, 5) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 7)
WorkMas(Row, 6) = Sheets(DataSheet).Cells(Row + RowFirst - 1, 8)
Next Row
Здесь WorkMas() - рабочий массив.
Вывод делаю так:
Set PrintRange = Sheets(Sheets.Count).Range(Cells(1, 1), Cells(65001, 11 + Months))
PrintRange.Value = Result
Здесь Result() - массив с результатами, который я ставлю на последний (Sheets.Count) рабочий лист.