Массив свойств в VBA - PullRequest
       7

Массив свойств в VBA

3 голосов
/ 20 февраля 2012

У меня 13 свойств, следующий синтаксису, подобному приведенному ниже:

Public Property Get Town() As String
    Town = txtTown.Text
End Property

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

EDIT:

aSet IDCell = customerDBSheet.Range("CustomerDBEntryPoint").Offset(ID() - 1)
Dim properties()
properties = Array("ID()", "FirstName()", "LastName()", "Address 1()", "Address 2()",     "Town()", "Postcode()", "Phone()", "Email()", "Sex()", "Username()", "PasswordHash()")
For i = 0 To 11
IDCell.Offset(1, i).Value = CStr(CallByName(frmCustomerEntry, properties(i), VbLet, ""))
Next i

Я получаю сообщение об ошибке до последнего: IDCell.Offset(1, i).Value = CStr(CallByName(frmCustomerEntry, properties(i), VbLet, ""))

Итоговый код:

Dim properties()
properties = Array("ID", "FirstName", "LastName", "Address1", "Address2", "Town", "Postcode", "Phone", "Email", "Sex", "Username", "PasswordHash")
For i = 0 To 11
IDCell.Offset(1, i).Value = CStr(CallByName(frmCustomerEntry, properties(i), VbMethod))
Next i

Код, использованный в конце, показанный выше, специально использует функцию CallByName, отредактированную из ответа Радека, когда свойство было преобразовано в функцию. Кроме того, для цикла For необходимо использовать индекс на основе 0. Кроме того, возникло исключение, когда 4-й необязательный параметр представлял собой пустой строковый литерал.

1 Ответ

2 голосов
/ 20 февраля 2012

Вы можете выполнять итерацию по массиву имен свойств:

Dim vProperties()
Dim vPropertyName

vProperties = Array("Town", "Street", "ZipCode")
For Each vPropertyName In vProperties
    '''Do something
Next

Теперь самое сложное: в блоке "Сделать что-то" только для vPropertyName установлены последовательные имена свойств.Чтобы получить доступ к значению свойства по его имени из строковой переменной, используйте функцию CallByName:

...
For Each vPropertyName In vProperties
    CallByName MyObject1, vPropertyName, VbLet, "" 
Next

Итерация второго параметра через коллекцию «Элементы управления» пользовательской формы:

Dim vControl As Control

For Each vControl In UserForm1.Controls
    If TypeName(vControl) = "TextBox" OR vControl.Name Like "MyPattern*" Then
        '''Do something
    End If
Next

РЕДАКТИРОВАТЬ:

Dim properties()
properties = Array("ID", "FirstName", "LastName", "Address1", "Address2", "Town", "Postcode", "Phone", "Email", "Sex", "Username", "PasswordHash")
For i = LBound(properties) To UBound(properties)
    IDCell.Offset(1, i).Value = CStr(CallByName(frmCustomerEntry, properties(i), VbLet, ""))
Next i

Я нашел несколько вещей в вашем коде

  • Скобки не нужны
  • Что-то не так со свойствами "Адрес 1" и "Адрес 2".Вы не можете определить свойство с пробелом внутри имени
  • Я считаю, что функции LBound и UBound немного удобнее, чем использование явных границ массива
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...