Страницы: 1
RSS
Синтаксис Property Let/Set/Get, VBA понятия
 
Прошу простить, но поиском ползовался и даже в гугле смотрел.
но так и не смог понять принцип работы данного синтаксиса в VBA.
Подскажите ссыль где это разъясняется просто и с примерами.

Ходил на офф форум Microsoft но там информация скудная и понимания не дала.

Конкретно не понятен следующий код "Property Let PenColor(ColorName As String)" (и далее) в примере ниже:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
 
' Set the pen color property for a Drawing package.
' The module-level variable CurrentColor is set to
' a numeric value that identifies the color used for drawing.
Property Let PenColor(ColorName As String)
   Select Case ColorName   ' Check color name string.
      Case "Red"
         CurrentColor = RED   ' Assign value for Red.
      Case "Green"
         CurrentColor = GREEN   ' Assign value for Green.
      Case "Blue"
         CurrentColor = BLUE   ' Assign value for Blue.
      Case Else
         CurrentColor = BLACK   ' Assign default value.
   End Select
End Property
 
' The following code sets the PenColor property for a drawing package
' by calling the Property let procedure.
 
PenColor = "Red"
Изменено: SanShiney - 27.10.2014 17:19:06
 
А просто в справочнике?
Присваивает значение выражения переменной или свойству.
Синтаксис
[Let] имяПеременной = выражение
Синтаксис инструкции Let содержит следующие элементы:
Элемент Описание
Let Необязательный. Явное использование ключевого слова Let зависит от вкуса пользователя, обычно это слово опускают.
имяПеременной Обязательный. Имя переменной или свойства, удовлетворяющее стандартным правилам именования переменных.
выражение Обязательный. Значение, присваиваемое переменной или свойству.
Дополнительные сведения

Значение выражения может быть присвоено переменной или свойству, только если оно имеет совместимый с этой переменной тип данных. Невозможно присвоить строковое выражение числовой переменной или числовое выражение строковой переменной. Такая попытка приведет к ошибке во время компиляции.
Переменным типа Variant могут присваиваться как строковые, так и числовые выражения. Однако обратное не всегда верно. Любое значение типа Variant, за исключением значения Null, допускает присвоение строковой переменной, но только значение типа Variant, которое может рассматриваться как число, может быть присвоено числовой переменной. Пользуйтесь функцией IsNumeric для определения возможности преобразования значения Variant в числовое значение.

Внимание! Присвоение выражения с одним из числовых типов переменной с другим числовым типом данных преобразует значение выражения в тип данных результирующей переменной.

Инструкция Let может быть использована для присвоения одной переменной-записи другой, только если обе переменные имеют одинаковый определяемый пользователем тип. Для присвоения переменных-записей различных определяемых пользователем типов используется инструкция LSet. Для присвоения переменным ссылок на объекты применяется инструкция Set.
 
Читает данные из открытого файла на диске в переменную.
Синтаксис
Get [#]номерФайла, [номерЗаписи], имяПеременной
Синтаксис инструкции Get содержит следующие элементы:
Элемент Описание
номерФайла Обязательный. Любой допустимый номер файла.
номерЗаписи Необязательный. Тип Variant (Long). Номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение.
имяПеременной Обязательный. Допустимое имя переменной, в которую следует поместить считанные данные.
Дополнительные сведения

Данные, считываемые с помощью инструкции Get, обычно записываются в файл с помощью инструкции Put.
Первой записи (или байту) файла соответствует номер 1, второй (или второму) 2 и т.п. Если аргумент номерЗаписи опущен, читается запись (или байт), на которую был установлен указатель после выполнения последней инструкции Get или Put (или переведен при последнем вызове функции Seek). Наличие запятых-разделителей является обязательным, например:

Get #4,,FileBuffer

Для файлов, открытых в режиме Random, применимы следующие правила:

· Даже если длина данных, подлежащих чтению, меньше длины записи, указанной в предложении Len инструкции Open, инструкция Get начинает чтение каждой следующей записи с начала этой записи. Пространство между концом одной записи и началом следующей записи заполняется текущим содержимым буфера файла. Поскольку объем данных, используемых для заполнения, не может быть определен с достаточной степенью уверенности, рекомендуется, чтобы длина записи совпадала с длиной читаемых данных.

· Если данные считываются в строку переменной длины, инструкция Get сначала считывает 2-байтовый дескриптор, содержащий длину строки, а затем данные, которые следует поместить в эту переменную. Таким образом, длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 2 байта больше, чем фактическая длина этой строки.
· Если данные считываются в переменную Variant числового типа, инструкция Get сначала считывает 2 байта, указывающие подтип (VarType) этой переменной, а затем данные, которые следует поместить в эту переменную. Например, при чтении переменной Variant подтипа VarType 3 инструкция Get считывает 6 байт: 2 байта, указывающие подтип переменной Variant как VarType 3 (Long), и 4 байта, содержащие значение типа Long. Длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактический размер, необходимый для размещения этой переменной.

Примечание. С помощью инструкции Get можно считать массив типа Variant с диска, однако нельзя прочитать скаляр типа Variant, содержащий массив. Кроме того, инструкцию Get нельзя использовать для чтения объектов с диска.

· Если данные считываются в переменную типа Variant подтипа VarType 8 (String), инструкция Get сначала считывает 2 байта, указывающие VarType, потом 2 байта, указывающие длину строки, а затем содержимое строки. Длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 4 байта больше, чем фактическая длина этой строки.
· Если данные считываются в динамический массив, инструкция Get сначала считывает дескриптор, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open , должна быть больше либо равна сумме всех байтов, необходимых для размещения массива данных и дескриптора массива. Например, для размещения описанного ниже массива требуется 118 байт

Dim MyArray(1 To 5,1 To 10) As Integer

118 байт распределяются следующим образом: 18 для дескриптора (2 + 8 * 2) и 100 байт для данных (5 * 10 * 2).

· Если данные считываются в массив фиксированного размера, инструкция Get считывает только данные. Дескриптор не считывается.
· Если данные считываются в переменную любого другого типа (кроме строки переменной длины и переменной типа Variant), инструкция Get считывает только данные. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна длине данных, подлежащих считыванию.
· Инструкция Get считывает элементы определяемых пользователем типов так, будто это отдельные переменные, за исключением того, что пространство между элементами не заполняется текущим содержимым буфера файла. На диске динамический массив типа, определенного пользователем (записанный с помощью инструкции Put) предваряется дескриптором, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения отдельных элементов, в том числе, массивов и их дескрипторов.

Для файлов, открытых в режиме Binary, применимы все перечисленные выше правила, за исключением следующих:

· Предложение Len инструкции Open игнорируется. Инструкция Get считывает все переменные с диска непрерывно, т.е. без заполнения пространства между записями текущим содержимым буфера файла.
· При чтении любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Get считывает только данные. Дескриптор не считывается.
· При считывании строк переменной длины, не являющихся элементами типов, определяемых пользователем, 2-байтовый дескриптор не считывается. Число считываемых байт равняется числу символов, уже содержащихся в строке. Например, следующие инструкции считают 10 байт из файла, которому соответствует номер 1:

VarString = String(10," ")
Get #1,,VarString
 
Справка VBA 97 офиса (вроде). На русском языке.
 
Александр Моторин, спасибо за ответ.
Но проблема в том, что текст для меня не читабельный.
Поэтому, я просил помощи в форме примера.

Прошу простить, если нарушаю правила.
но вопрос для меня критичный. Не могу разобрать синтасис...
встроенная справка не даёт ясности.
 
Поэтому я и назвал источник.
Там есть примеры
Один из них
В данном примере значения выражений присваиваются переменным с помощью явных и неявных инструкций Let.


Код
1
2
3
4
5
6
7
8
9
10
Dim MyStr, MyInt
' Следующие присвоения используют инструкцию Let.
Let MyStr = "Привет"
Let MyInt = 5
 
Ниже приведены эквивалентные присвоения, не использующие инструкцию Let.
 
Dim MyStr, MyInt
MyStr = "Привет"
MyInt = 5
 
В данном примере инструкция Get используется для чтения данных из файла в переменную. Предполагается, что файл TESTFILE содержит пять записей определенного пользователем типа Record.

Код
1
2
3
4
5
6
7
8
9
10
11
12
Type Record   ' Тип, определенный пользователем.
   ID As Integer
   Name As String * 20
End Type
 
Dim MyRecord As Record, Position   ' Объявляет переменную.
' Открывает файл произвольного доступа.
Open "TESTFILE" For Random As #1 Len = Len(MyRecord)
' Читает из файла с помощью инструкции Get.
Position = 3   ' Определяет номер записи.
Get #1, Position, MyRecord   ' Читает третью запись.
Close #1   ' Закрывает файл.
 
В данном примере инструкция Set используется для присвоения переменным ссылок на объект. Предполагается, что YourObject является допустимым объектом, обладающим свойством Text.

Код
1
2
3
4
5
6
7
8
Dim YourObject, MyObject, MyStr
Set MyObject = YourObject   ' Присваивает ссылку на объект.
' MyObject и YourObject ссылаются на один и тот же объект.
YourObject.Text = "Всем привет"   ' Инициализирует свойство.
MyStr = MyObject.Text   ' Возвращает "Всем привет".
 
' Разрыв связи: MyObject больше не ссылается на YourObject.
Set MyObject = Nothing   ' Освобождает объект.
 
Александр Моторин,
Я, видимо не верно поставил вопрос изначально.
Вот как работает следующий код? (вывел его в первое сообщение):

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
  
' Set the pen color property for a Drawing package.
' The module-level variable CurrentColor is set to
' a numeric value that identifies the color used for drawing.
Property Let PenColor(ColorName As String)
   Select Case ColorName   ' Check color name string.
      Case "Red"
         CurrentColor = RED   ' Assign value for Red.
      Case "Green"
         CurrentColor = GREEN   ' Assign value for Green.
      Case "Blue"
         CurrentColor = BLUE   ' Assign value for Blue.
      Case Else
         CurrentColor = BLACK   ' Assign default value.
   End Select
End Property
  
' The following code sets the PenColor property for a drawing package
' by calling the Property let procedure.
  
PenColor = "Red"
 
Описывает имя, аргументы и текст программы, составляющий тело Property Let procedure, которая присваивает значение свойству.

Синтаксис

[Public | Private] [Static] Property Let имя [(списокАргументов)]
[инструкции]
[Exit Property]
[инструкции]
End Property

Синтаксис инструкции Property Let содержит следующие элементы:

Элемент Описание
Public Необязательный. Указывает, что процедура Property Let доступна для всех других процедур во всех модулях. При использовании в личном модуле (модуле, который содержит инструкцию Option Private) такая процедура является недоступной вне проекта.
Private Необязательный. Указывает, что процедура Property Let доступна для других процедур только того модуля, в котором она описана.
Static Необязательный. Указывает, что локальные переменные процедуры Property Let сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Property Let, даже если они используются в этой процедуре.
имя Обязательный. Имя процедуры Property Let, удовлетворяющее стандартным правилам именования переменных, за исключением того, что это имя может совпадать с именем процедуры Property Get или Property Set из этого же модуля.
списокАргументов Обязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Property Let при ее вызове. Имена нескольких переменных разделяются запятыми. Имя и тип данных каждого аргумента процедуры Property Let (за исключением последнего) должен совпадать с соответствующими аргументами процедуры Property Get. Последний аргумент представляет значение, присваиваемое свойству с правой стороны выражения. Тип данных последнего (или иногда единственного) аргумента должен соответствовать типу, возвращаемому соответствующей процедурой Property Get.
инструкции Необязательный. Любая группа инструкций, выполняемых в теле процедуры Property Let.
Аргумент списокАргументов имеет следующий синтаксис и элементы:

[Optional] [ByVal | ByRef] имяПеременной[( )] [As тип] [= поУмолчанию]

Элемент Описание
Optional Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Отметим, что правая часть выражения Property Let не может иметь тип Optional.
ByVal Необязательный. Указывает, что этот аргумент передается по значению.
ByRef Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.
имяПеременной Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.
тип Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип.
поУмолчанию Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.
Примечание. Каждая инструкция Property Let должна определять по крайней мере один аргумент определяемой процедуры. Этот аргумент (или последний аргумент, если имеется более одного аргумента) содержит реальное значение, которое будет присвоено свойству при вызове процедуры, определенной с помощью инструкции Property Let.

Дополнительные сведения

Процедуры Property, тип которых не указан явно с помощью слов Public или Private, являются общими по умолчанию. Если не используется слово Static, значения локальных переменных не сохраняются между вызовами процедур.
Все выполняемые команды должны находиться в процедурах. Не допускается определение процедуры Property Let внутри другой процедуры Property, Sub или Function.
Инструкция Exit Property вызывает немедленный выход из процедуры Property Let. Выполнение программы продолжается с инструкции, следующей за инструкцией вызова процедуры Property Let. В любом месте процедуры Property Let допускается любое число инструкций Exit Property.

Подобно процедурам Function и Property Get, процедура Property Let является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедур Function и Property Get, которые возвращают значения, процедуру Property Let можно использовать только в левой части выражения для присвоения свойства или в инструкции Let.


В данном примере инструкция Property Let используется для описания процедуры, предназначенной для изменения значения свойства. Это свойство задает цвет пера.


Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3
 
' Эта процедура задает цвет пера.
' Переменная CurrentColor, определенная на уровне модуля,
' содержит числовое значение, указывающее нужный цвет.
Property Let PenColor(ColorName As String)
   Select Case ColorName   ' Анализирует строку ColorName.
      Case "Red"
         CurrentColor = RED   ' Красный цвет.
      Case "Green"
         CurrentColor = GREEN   ' Зеленый цвет.
      Case "Blue"
 
CurrentColor = BLUE   ' Синий цвет.
      Case Else
         CurrentColor = BLACK   ' Значение по умолчанию.
   End Select
End Property
 
' Следующий код задает цвет пера с помощью процедуры Property Let.
 
PenColor = "Red"
 
вместо Property Let PenColor(ColorName As String)
можно использовать Sub PenCol(ColorName As String),
оставив внутреннее содержание процедуры тем же
Тогда применение функции будет таким PenCol "Red"
Как я считаю, пример применения не удачен.
К чему все эти танци с бубном с Property Let?
Зачем лишняя процедура? Если можно просто назначить PenColor = 1
Страницы: 1
Читают тему
Loading...