2016-06-22 2 views
1

Я работаю и немного ударил блокпост. Для одного я не самый сильный программист, мне просто дали эту задачу, но ударил блокпост (я думаю, его синтаксис, но не уверен).vba ссылка на объект из пользовательской формы не работает

Мы провели много исследований, чтобы найти некоторые корреляции данных для некоторых наших менее технических консультантов, и этот инструмент VBA станет для них быстрой ссылкой, чтобы дать клиентам прогнозы в реальном времени. Вопрос не имеет отношения к вопросу.

Я создал класс, который должен содержать значения, а затем план должен был ссылаться на класс из пользовательской формы VBA. Когда я ссылаюсь на класс, я не получаю значение, которое я сохранил, но получаю имя свойства.

Private Sub ddMonthOfUse_Change() 

Dim mv As String 

Set chillWater = New clsMonth 
    With chillWater 
     .Janurary = 0.7136 
     .Feburary = 0.6755 
     .March = 0.6528 
     .April = 0.7773 
     .May = 0.8213 
     .June = 0.8715 
     .July = 0.9 
     .August = 1.0243 
     .September = 1.0516 
     .October = 0.8514 
     .November = 0.7095 
     .December = 0.6994 
    End With 

Set DX = New clsMonth 
    With DX 
     .Janurary = 0.5777 
     .Feburary = 0.5536 
     .March = 0.5166 
     .April = 0.6112 
     .May = 0.7035 
     .June = 0.75 
     .July = 0.8 
     .August = 0.8345 
     .September = 0.9333 
     .October = 0.6865 
     .November = 0.5976 
     .December = 0.4907 
    End With 


    MsgBox chillWater.month 

    End Sub 

В модуле класса У меня есть этот

Option Explicit 

'property decleration 
Public Janurary As Single 
Public Feburary As Single 
Public March As Single 
Public April As Single 
Public May As Single 
Public June As Single 
Public July As Single 
Public August As Single 
Public September As Single 
Public October As Single 
Public November As Single 
Public December As Single 
Public chillWater As clsMonth, DX As clsMonth 

Public Property Get month() As String 

month = Main.ddMonthOfUse.value 

End Property 

Вместо окна сообщения, возвращая значение, если пользователь выбирает месяц март окно сообщения говорит «Март». Если, например, я заменю ссылку на раскрывающийся список и просто напечатаю March, я получу значение.

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

+0

Что такое 'Main.ddMonthOfUse'? –

+0

Это combobox в пользовательской форме – ct4242

+0

Я предполагаю, что вы наполнили свой combobox «Январь Февраль Март ...», не так ли? –

ответ

1

@ Mat'sMug при выборе выпадающий в UserForm (скажем, пользователь выбирает мая), я хочу, чтобы окно сообщения, чтобы отобразить значение chillwater.May

Хорошо, получил Это. Удалить все это, они токсичны:

Public chillWater As clsMonth, DX As clsMonth 

Public Property Get month() As String 

month = Main.ddMonthOfUse.value 

End Property 

Вы должны выставить Function, который принимает имя месяца и возвращает значение соответствующего поля.

Одним из способов может быть использовать CallByName и сделать что-то вроде этого:

Public Function ValueFor(ByVal monthName As String) As Single 
    On Error GoTo CleanFail 

    Dim instance As Object 
    Set instance = Me 'CallByName can't take "Me" directly 

    Dim result As Single 
    result = CallByName(instance, monthName, VbGet) 

CleanExit: 
    ValueFor = result 
    Exit Function 
CleanFail: 
    result = 0 
    Resume CleanExit 
End Function 

Обратите внимание на параметр VbGet - это будет работать с общественным полем (я просто проверял), но в идеале вы бы Encapsulate эти значения и выставить их как свойства вместо. Мне нравится герметизирующего мои вещи, как это:

Option Explicit 

Private Type TMonth '"T" + ClassName, just by convention 
    January As Single 
    February As Single 
    '... 
    December As Single 
End Type 

Private this As TMonth 'the only private field you need! 

'now expose a property accessor for each member: 

Public Property Get January() As Single 
    January = this.January 
End Property 

Public Property Let January(ByVal value As Single) 
    this.January = value 
End Property 

'... 

И тогда ваш код формы может сделать это:

Set chillWater = New clsMonth 
With chillWater 
    .Janurary = 0.7136 
    .Feburary = 0.6755 
    .March = 0.6528 
    .April = 0.7773 
    .May = 0.8213 
    .June = 0.8715 
    .July = 0.9 
    .August = 1.0243 
    .September = 1.0516 
    .October = 0.8514 
    .November = 0.7095 
    .December = 0.6994 

    MsgBox "Value for " & ddMonthOfUse.value & ": " & .ValueFor(ddMonthOfUse.Value) 

End With 
+0

Мэтт, спасибо за вашу помощь. У меня есть несколько вопросов - у вас есть шанс ответить на них. – ct4242

+0

Уверен, что случилось? –

+0

Я немного запутался в параметре VbGet. Это встроенная функция VBA или это что-то в коде, который я не вижу. Во-вторых, я смущен первой частью кода в целом. Часть с Dim Instance as Object, а затем используется в сочетании с VbGet. Еще раз спасибо – ct4242

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