2016-11-17 4 views
0

Мне нужна ваша помощь. Я хочу изменить значение класса в коллекции, изменить «переменную».edit Значение в коллекции - переменная Функция ... (?)

cAdmin = xy 
cCheckDate=yz 
cPruefState= abc 
colSomeName.add Classname, key1 

Я сохраняю это в коллекции (colSomeName). В форме, на событии поднят поиск ключа в коллекции, и текущее значение изменяется.

В классе я устанавливаю значения (например)

Sub CheckOut() 
.. 
editInCollection colSomeName, „StackOver“ 
. . . 



Public Function editInCollection(_ 
        ByRef col As Collection, _ 
        ByRef Elem As String) As Boolean 

    On Error GoTo Ende 
    If IsEmpty(col(Elem)) Then 
     MsgBox " This Element: " & col(Elem) & „ not exits!", _ 
       vbCritical = vbOKOnly, "s o r r y " 
    Exit Function 
    End If`enter code here` 
    IsInCollection = (Err.Number = 0) 
     ' 
     col(Elem).cAdmin =Environ("username") 
     col(Elem).cCheckDate = Date 
     col(Elem).cPruefState= True 
     ' 
    Exit Function 

    Ende: 
     IsInCollection = False 
    End Function 

Она работает идеально. Но я хотел бы использовать funkion для разных классов/коллекций. Это возможно? Мой Idear является как этот

Public Function editInCollection(_ 
       ByRef col As Collection, _ 
       ByRef Elem As String, clsValue as Variant(?), newValue as variant) As Boolean 

Dim as …. 
For each xAll in col(Elem) 
     If xAll = clsValue then 
     clsVlaue = newValue 
     end if 
    exit for 
next 
end function 

, но я не работает. Как я понимаю, это

+0

Вы можете отредактировать свой пример (верхний фрагмент) с чем-то более конкретным? ИМО трудно понять, что вы пытаетесь сделать и почему. –

ответ

2

Вы можете использовать CallByName для доступа свойство объекта, используя имя свойства:

clsTest: очень простой класс для тестирования ...

Option Explicit 
Public TestProperty As String 

Пример кода :

Sub Tester() 

    Dim o As New clsTest, col As New Collection 

    o.TestProperty = "hello" 

    col.Add o, "key1" 

    Debug.Print "Before", o.TestProperty '>>> hello 

    'Update the property named "TestProperty" to "I was updated" 
    Debug.Print "updated?", EditInCollection(col, "key1", _ 
          "TestProperty", "I was updated") '>>> true 

    Debug.Print "After", o.TestProperty '>>> I was updated 

End Sub 



Function EditInCollection(col, key, propName, newValue) 

    Dim o As Object, rv As Boolean 
    On Error Resume Next 
    Set o = col(key) 'is there an object with this key? 
    On Error GoTo 0 

    If Not o Is Nothing Then 
     'Object was found in the collection: update 
     ' the property in "propName" to "newValue" 
     CallByName o, propName, VbLet, newValue 
     rv = True 
    End If 

    EditInCollection = rv 'return success or failure 
End Function 

Если вы хотите обновить несколько свойств, то вы могли бы адаптировать функцию, чтобы принять массив имен свойств и массив нового V как третий, так и четвертый параметры.

+0

Hallo Tim - он работает так здорово! Вы делаете меня таким счастливым - большое вам спасибо! – woerny

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

  • Нет связанных вопросов^_^