Visual Basic |
---|
Public Function VariantToArray( _ ByRef pVal As Variant _ ) As Variant |
- pVal
- VB Script Массив
Одно из ключевых отличий VB Script от VBA - это отсутствие типизированных переменных. Все переменные в VB Script имеют тип Variant. Именно поэтому в VB Script нельзя объявлять переменные как в VBA (Например: myParam As String или myObject As TDMSObject). Тоже самое касается и массивов. Все массивы в VB Script являются контейнерами типа Variant, содержащими в своём составе последовательность элементов, так же имеющих тип Variant. Такая особенность дает возможность хранить в одном массиве совершенно разные эелементы, числа, строки, объекты. В VBA напротив, масивом может быть контейнер типа Variant содержащий в своем составе типизированные элементы, например чистые строки, или числа в том виде "как есть".
Многие COM объекты спроектированны для использования в среде VBA. Методы таких объектов как правило возвращают типизированные массивы, работать с которыми в среде VB Script невозможно. Именно для этого в TDMS были реализованы методы:
ArrayToVariant - позволяющий конвертировать типизированные VBA массивы в массивы формата VBScript и
VariantToArray позволяющий делать обратное преобразование.
VB Script (Visual Basic) | ![]() |
---|---|
'------------------------------------------------------------------- set AcApp = GetObject(,"AutoCAD.Application.16") if AcApp is nothing then MsgBox "Приложение не загруженно" end if set Doc = AcApp.ActiveDocument set ModelSpace = Doc.ModelSpace 'Объявляем и заполняем стандартный VBS массив Dim startPoint(2) Dim endPoint(2) startPoint(0) = 1.0 startPoint(1) = 1.0 startPoint(2) = 1.0 endPoint(0) = 2.0 endPoint(1) = 2.0 endPoint(2) = 2.0 'производим обратную конвертацию масива в формате VBS в типизированный массив формата VBA 'т.к функция Автокада ModelSpace.AddLine может принимать на вход только типизированный массив Dim convArr1, convArr2 convArr1 = ThisApplication.Utility.VariantToArray(startPoint) convArr2 = ThisApplication.Utility.VariantToArray(endPoint) ModelSpace.AddLine convArr1, convArr2 '(функция отработала нормально. в противном случае - ошибка о несоответствии типов) '------------------------------------------------------------------- 'Демонстрация преобразования типизированного массива в массив формата VBS for each entity in ModelSpace if TypeName(entity) = "IAcadBlockReference" then Dim Attributes Attributes = entity.GetAttributes 'Типизированный массив формата VBA 'Преобразовываем в формат VBS Dim NewArray NewArray = ThisApplication.Utility.ArrayToVariant(Attributes) for each arrElem in NewArray MsgBox arrElem.ObjectName next end if next |