Установите форматирование диапазона Excel с массивом - PullRequest
5 голосов
/ 04 октября 2010

В прошлом я использовал вариантный массив для заполнения диапазона нескольких ячеек Excel.

Мне интересно, есть ли способ сделать то же самое с форматированием ячейки?Я бы предпочел не переходить ячейка за ячейкой, и было бы неплохо минимизировать количество вызовов, чтобы получить диапазон Excel ...

Ответы [ 3 ]

4 голосов
/ 05 октября 2010

Я в основном делаю то, что предлагает Лэнс. Однако в некоторых случаях я создаю отдельную скрытую таблицу с форматами, которые я хочу установить. Тогда я

wshHidden.Range("A1:D100").Copy
wshReport.Range("A1:D100").PasteSpecial xlPasteFormats

Это позаботится об этом одним махом. Но у вас есть накладные расходы скрытого листа.

3 голосов
/ 04 октября 2010

@ ExcelHero указал мне, как это сделать, вот как.

Если ваш диапазон горизонтальный, просто передайте ему массив, построенный из строк формата:

[a1:c1].NumberFormat = Array("hh:mm", "General", "$#,##0.00")   

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

[a1:a3].NumberFormat = WorksheetFunction.Transpose(Array("hh:mm", "General", "$#,##0.00"))

Старый ответ:

Нет, вы не можете делать каждую ячейку отдельно, хотя вы можете массово назначить один формат всему диапазону.

Свойство Range для присваивания - .NumberFormat. Если вы создаете вариантный массив строк для назначения в качестве формата, а затем назначаете его диапазону, применяется только первый элемент (и он применяется ко всем ячейкам диапазона).

Итак, лучшее, что вы можете сделать, это цикл:

Dim r As Range
Dim v(1 To 3) As Variant
Dim i As Integer

Set r = Range("A1:A3")
v(1) = "hh:mm:ss"
v(2) = "General"
v(3) = "$#,##0.00_);[Red]($#,##0.00)"

For i = 1 to 3
  r(i).NumberFormat = v(i)
Next i
0 голосов
/ 02 августа 2013

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

Однако, если форматирование ячеек часто такое же, как и в прошлый раз, когда вы его форматировали, гораздо быстрее сначала проверить, нужно ли изменить формат, и только затем изменить его.

Вот функция, которая может это сделать. В тестах (Excel 2003) это работает в 8-10 раз быстрее, чем всегда при настройке формата, то есть с отключенным обновлением экрана.

Sub SetProperty(ByRef obj As Object, propname, newvalue)
    If CallByName(obj, propname, VbGet) <> newvalue Then
        Call CallByName(obj, propname, VbLet, newvalue)
    End If
End Sub

Назовите это так:

Call SetProperty(Cells(1,1).Font, "ColorIndex", 27) 
Call SetProperty(Cells(1,1).Borders, "Weight", xlMedium)
etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...