2016-11-14 4 views
0

Во время работы над моей PowerPoint макрос, я заметил следующее:Зачем использовать объекты для хранения объектов?

Для получения тока, активный слайд:

Dim currSlide As Slide 
Set currSlide = Application.ActiveWindow.View.Slide 

Чтобы получить вновь созданный Textbox:

Dim textbox As Shape 
Set textbox = currSlide.Shapes.AddTextbox(...) 

Я новый для VBA, работающий с Java, C++ & C#. Зачем использовать Set? Почему использование Slide & Shape вместо этого порождает ошибки? Каким образом VBA отличается тем, как работает объявление переменной в этом отношении?

ответ

2

Это взято из Byte Comb - Values and References in VBA

В VBA, разница между типами значений и ссылочных типов производится явно требуя от набора ключевых слов при присвоении ссылки. Кроме того, вы часто увидите назначение ссылки, называемой «привязкой».

Byte Comb подробно рассказывает о взаимодействии VBA. Я очень рекомендую, чтобы любой серьезный о программировании с помощью VBA читал его.

В терминах непрофессионала: набор используется, чтобы компилятор знал, что программирование хочет иметь ссылку на переменную типа объекта. Таким образом, компилятор будет знать, чтобы выдать ошибку, когда вы пытаетесь присвоить значение объекту.

Другая причина в том, что объекты могут иметь значения по умолчанию.

В этом примере у меня есть переменная с именем value, которая имеет тип Variant. Варианты могут быть любого типа в VBA. Обратите внимание, как компилятор знает, что назначить значение диапазона при value = Range("A1") и установить ссылку на диапазон, когда ключевое слово Set используется в Set value = Range("A1").

enter image description here

+1

Кроме того (и связанных с ними) - объекты в VBA могут иметь свойства по умолчанию: например, '' Range' имеет value' как свою собственность по умолчанию. Без 'Set', что-то вроде' a = Range («A1») 'было бы двусмысленным (вы имеете в виду сделать равным самому диапазону или его значению?) –

+0

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

+0

См. Также: http://stackoverflow.com/questions/9481140/exposing-property-as-variant-in-net-for-interop/9924325#9924325 –

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