2013-07-30 4 views
6

Я довольно новичок в VBA. Я работаю над проектом Excel, и я продолжаю видеть код в проекте, который выглядит следующим образом:Есть ли причина проверить, установлено ли свойство перед его настройкой?

If Me.Columns(i).Hidden = True Then 
    Me.Columns(i).Hidden = False 
End If 

и это:

If Range("SomeRange").Locked = True Then 
    Range("SomeRange").Locked = False 
End If 

В этих случаях в частности, может ли быть причина для проверки того, установлено ли свойство перед его настройкой или это просто бесполезная проверка? Разумеется, двигатель VBA должен сделать внутреннюю проверку, чтобы он ничего не делал.

+4

Единственная причина, по которой я могу думать, это то, что кто-то платил в зависимости от количества строк кода, которые они написали. Это не просто бесполезно, это пустая трата электричества из-за бесполезной проверки. – Renan

+1

@Renan, не нужно ... См. Другой возможный ответ ... –

ответ

5

Я думаю, что знаю, почему кто-то сделал код, который вы анализируете. Источником такой ситуации может стать книга Bovey, Rob/Wallentin, Dennis/Bullen, Stephen/Green, John под названием «Профессиональное развитие Excel: окончательное руководство по разработке приложений с использованием Microsoft Excel и VBA и .NET» какие главы (или полные) вы могли бы найти в Интернете. Существует глава, посвященная микро- и макро-оптимизации. Давайте процитировать один, который ссылается на ваш вопрос:

Тест свойство Перед настройкой

Это часто намного быстрее читать свойство, чем писать. Это может сэкономить время, чтобы обновить свойство , когда оно необходимо изменить, проверив, имеет ли он значение . Например, прочитав значение Range.Font.Bold и только установив его в True, если он уже не True. Это противоречит общему правилу сокращения количества кода, который вы пишете, но он будет обеспечить значительное увеличение производительности, если он позволяет избежать ненужных настроек объектов .

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

+0

KazJaw, спасибо за ссылку и за цитату. Для некоторых свойств «значительное увеличение производительности» является простым: в большой сводной таблице, например, настройка свойств, таких как «ViewCalculatedMembers» без проверки, вероятно, будет иметь значение. Но как насчет таких элементов, как «Range (« SomeRange »). = True '? На ваш взгляд, не слишком ли экстремально загромождать обозначение с такой проверкой? – Ioannis

+2

@Ioannis, посмотрите в цитируемом тексте - есть простой пример Range.Font.Bold, который действительно сомнительный. Я никогда не тестировал его (что было бы непросто), но я скорее доверяю авторам. В полном параграфе, касающемся процесса оптимизации кода, есть еще несколько интересных советов, которые делают весь текст убедительным. –

+2

, выполняющий быстрый тест в полном столбце в 2010 году, когда все ячейки разблокированы, используя 'If Range (« A »& n) .Locked Then Range (« A »& n) .Locked = False' в среднем на 40 секунд быстрее чем просто использовать «Range (« A »& n) .Locked = False'. в реальной жизни будут значительные изменения, основанные на обстоятельствах!;-) – JosieP

1

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

Смежные вопросы