VSTO: получение свойств ячейки Excel "навалом" - PullRequest
7 голосов
/ 10 декабря 2011

При извлечении значений из диапазона в Excel гораздо эффективнее получать значения в «массиве» (в виде двумерного массива), чем циклически проходить по каждой строке и столбцу. Например:

Dim range = Globals.Table.Range("A1:E5")
Dim values(,) As Object = range.Value

С 25 ячейками это не имеет большого значения, но с 10 000 строк на 20 столбцов это, безусловно, имеет значение. Пока все хорошо.

У меня такой вопрос: кто-нибудь нашел способ сделать такую ​​же «массовую» выборку для других свойств? Например, я хочу найти, какие клетки окрашены определенным образом. Я хотел бы сделать что-то вроде «range.Interior.Color», но это возвращает только одно значение, а не массив значений. И в итоге я зацикливаюсь, что, вероятно, в 100 или даже в 1000 раз медленнее. Для больших столов это действительно убийца.

PS: Похоже, что. Формулы ведет себя так же, как. Значение: я могу получить несколько из них одновременно Но я пока не заставляю цвета играть красиво.

Я ценю вашу помощь!

Ответы [ 2 ]

5 голосов
/ 10 декабря 2011

Я не думаю, что вы можете получить эти свойства в виде массива из-за того, как Excel хранит эту информацию.Excel не хранит форматирование для каждой ячейки отдельно, а хранит определенную смесь форматов вместе с внутренним «списком» диапазонов, которые используют этот формат.

Вы можете понять, как форматирование сохраняетсясоздание небольшого тестового файла с различными форматами и сохранение его в формате XML (по крайней мере, в 2010 году вам нужно использовать «XML Spreadsheet 2003»).

Эта статья также может помочь.

4 голосов
/ 10 декабря 2011

«Я хочу найти, какие клетки окрашены определенным образом»

в VBA вы можете запустить быструю процедуру, используя метод Find, который выполняет поиск по формату. Например, чтобы найти все ячейки с тем же цветом шрифта и внутренним цветом, что и ячейка в A1. Я полагаю, вы можете использовать что-то подобное в VSTO

Sub FindFormat()
    Dim rng1 As Range
    Dim rng2 As Range
    Dim strAddress As String
    With Application.FindFormat
        .Interior.ColorIndex = [a1].Interior.ColorIndex
        .Font.Color = [a1].Font.Color
    End With
    Set rng1 = Cells.Find("", [a1], xlFormulas, , , , , , True)
    If Not rng1 Is Nothing Then
        strAddress = rng1.Address
        Set rng2 = rng1
        Do
            Set rng1 = Cells.Find("", rng1, xlFormulas, , , , , , True)
            Set rng2 = Union(rng1, rng2)
        Loop While rng1.Address <> strAddress
        MsgBox "Range similar format to A1 is " & rng2.Address
    End If
End Sub

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...