Excel Interop - Эффективность и производительность

62
задан Jeremy Thompson 6 February 2015 в 09:21
поделиться

4 ответа

Использование превосходит встроенную функциональность, когда это возможно, например: Вместо того, чтобы искать целый столбец данную строку, используйте find команда, доступная в GUI Ctrl-F:

Set Found = Cells.Find(What:=SearchString, LookIn:=xlValues, _
    SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False)

If Not Found Is Nothing Then
    Found.Activate
    (...)
EndIf

, Если Вы хотите отсортировать некоторые списки, используйте команду Excel sort, не делайте этого вручную в VBA:

Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
5
ответ дан Treb 24 November 2019 в 16:53
поделиться

При опросе значений многих ячеек, можно получить все значения ячеек в диапазоне, сохраненном в различном массиве одним махом:

Dim CellVals() as Variant
CellVals = Range("A1:B1000").Value

существует компромисс здесь, с точки зрения размера диапазона, для которого Вы получаете значения. Я предположил бы, нужна ли Вам тысяча или больше значений ячеек, это, вероятно, быстрее, чем просто цикличное выполнение через различные ячейки и опрос значений.

5
ответ дан Jon Fournier 24 November 2019 в 16:53
поделиться

Производительность также во многом зависит от того, как Вы автоматизируете Excel. VBA быстрее, чем автоматизация COM быстрее, чем автоматизация.NET. И обычно ранний (время компиляции), связывая быстрее, чем позднее связывание, также.

, Если у Вас есть серьезные проблемы производительности, Вы могли бы думать о перемещении критических частей кода к модулю VBA и вызову, которые кодируют от Вашего кода автоматизации COM/.NET.

при использовании.NET необходимо также использовать оптимизированные основные interop блоки, доступные от Microsoft, и не использование произвел по заказу interop блоки.

2
ответ дан Dirk Vollmar 24 November 2019 в 16:53
поделиться

При использовании C# или VB.Net для получения или установки диапазона, выясните общий размер диапазона, а затем получите один большой двумерный объектный массив...

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

Обратите внимание, что важно знать, какой тип данных хранит Excel (текст или числа), поскольку он не будет автоматически делать это за вас, когда вы будете преобразовывать тип обратно из объектного массива. При необходимости добавьте тесты для проверки данных, если вы не можете быть уверены в типе данных заранее.

47
ответ дан 24 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: