2016-03-17 3 views
2

У меня есть коллекция (employees) сотрудника, которая содержит name, id, office и officeto полей. Мне нужно распечатать эту информацию в одинаково разнесенных столбцах. Поэтому мне нужно найти длину самого длинного имени строки, офиса, officeto ... и добавить пробелы, чтобы сделать столбцы равномерно распределенными.
Я знаю, как это сделать, используя набор записей, отправляющий имена полей в функцию. Итак, мой вопрос ... Можно ли ссылаться на свойство класса (имя, офис, officeto) с помощью переменной (похоже на rst! [Fieldname]). Я попытался настроить его так, как будто это был цикл набора записей в поле, но он не компилируется. Ошибка class.property не определена.Обратитесь к свойству класса с помощью переменной?

Public Function PropertyLen(ByVal Property As String, ByRef Employees As colEmployees) As Integer 

'This function uses a passed in class property, and returns the len of the longest class property in collection 

On Error GoTo ErrorHandler: 

Dim Emp As clsEmployee 
Dim intLen As Integer  
Dim lngCount As Long 

For lngCount = 1 To Employees.Count 

       Set Emp = Employees.Item(lngCount) 

       If Len(Trim(Emp.Property)) > intLen Then 
            intLen = Len(Trim(Emp.Property)) 
       End If 

       Set Emp = Nothing 
Next 

    FieldLen = intLen 

ExitFunc: 
'clean up 
    Set Emp = Nothing 
    Exit Function 

ErrorHandler: 
    modErrorHandler.DisplayUnexpectedError Err.Number, Err.Description 
    Resume ExitFunc 

End Function 
+0

ИМО, которого вы намереваетесь достичь, - это, скажем, чрезмерная гибкость кода. Вы можете поместить постоянную длину, так как имена свойств класса на самом деле также жестко запрограммированы и не могут быть изменены во время выполнения (в отличие от упомянутого вами набора записей). Затем, если вы измените свойства класса, вам нужно изменить данные длины. В качестве альтернативы - в случае, когда свойства нужно менять динамически, лучшим решением является использование словарного объекта вместо класса, оно имеет свойства '.Keys()' и '.Items()', которые возвращают имя ключей и значения элементов в массивах соответственно. – omegastripes

+0

Omegastripes .. Я просто хочу уточнить .. В моем случае у меня есть коллекция сотрудников с свойством name. Я просто хочу найти самое длинное имя из всех сотрудников. Мне также нужно будет найти самое длинное имя офиса. –

+0

Я не пытаюсь изменить имя свойства. Я просто хотел t –

ответ

1

Вы можете создать функцию-оболочку, которая принимает объект и имя строки свойства и возвращает свойство объекта с этим именем. Что-то вроде этого:

Function GetProperty(O As Object, property As String) As String 
    Dim s As String 
    property = LCase(property) 
    Select Case property 
     Case "name" 
      s = O.Name 
     Case "id" 
      s = O.ID 
     Case "office" 
      s = O.Office 
     Case "officeto" 
      s = O.officeto 
    End Select 
    GetProperty = s 
End Function 

Это в основном непроверенных (так как я не чувствовал себя инстанцировании членом вашего класса), но он может, например, возвращает имя Лист1, когда я оцениваю GetProperty(Sheets(1), "name")

+0

Это именно то, что мне нужно. Спасибо!! –

2

Существует дополнительный модуль выборки класса clsSample используется для теста:

Public Prop1 
Public Prop2 
Public Prop3 
Public Prop4 

Вы можете использовать встроенную функцию VBA CallByName(), чтобы получить значение свойства по имени:

Sub TestGetProperty() 

    Set objSample = New clsSample 
    objSample.Prop1 = "TEST" 
    Debug.Print CallByName(objSample, "Prop1", VbGet) ' TEST 

End Sub 

Если вы не хотите использовать CallByName(), то вы можете воспользоваться синтаксисом jscript object[property]:

Sub TestGetProperty() 

    Set objSample = New clsSample 
    objSample.Prop1 = "TEST" 
    Debug.Print GetProperty(objSample, "Prop1") ' TEST 

End Sub 

Function GetProperty(objSample, strName) 

    Static objHtmlfile As Object 

    If objHtmlfile Is Nothing Then 
     Set objHtmlfile = CreateObject("htmlfile") 
     objHtmlfile.parentWindow.execScript "function GetProperty(sample, name) {return sample[name]}", "jscript" 
    End If 
    GetProperty = objHtmlfile.parentWindow.GetProperty(objSample, strName) 

End Function 

BTW есть другие аналогичные решения, позволяющие evaluate a string into an object и до create a new class instance by the class name.

+0

Clever.When я увидел вопрос OP, я помню, подумал, что в JavaScript что-то подобное возможно, но не думал, что вы можете использовать JavaScript из VBA. Какие издержки связаны с этим? Я не тестировал код, но боюсь, что использование «CreateObject» в таком цикле будет дорогостоящим. Возможно, глобальный объект «htmlfile» может быть инициализирован в одном суб, а затем вызван из другого суб. –

+0

@JohnColeman 'objHtmlfile' переменная объявлена ​​static, поэтому объект будет создан только один раз. – omegastripes

+0

так это - я пропустил модификатор 'static' –

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