2015-03-26 2 views
2

Относительно новый для использования VBA (и кодирования в целом), но я не могу на всю жизнь понять, почему это не работает.Функция «И» не проверяет, что оба критерия выполнены.

Я хочу, чтобы другой выход выполнялся на основе того, какие два параметра выбраны в поле со списками в моей Userform.

Поколение «ПОЧЕМУ БОГ ПОЧЕМУ» возникает, если oindex = 1 независимо от того, какое значение index есть.

Private Sub SubmitButton_Click() 

Dim oindex As Integer 
oindex = Output.ListIndex 

If (index = 0 And oindex = 1) Then 
    Range("A7").Value = "WHY GOD WHY" 
    End If 

Unload UserForm 

End Sub 

Private Sub UserForm_Initialize() 

With Demand 
    .AddItem "I want policy details" 
    .AddItem "I would like a value" 
    .AddItem "I want to cancel my policy" 
    .AddItem "I want to change my address" 
    .AddItem "I would like Surrender Forms" 
    .AddItem "I would like to update my bank details" 
    .AddItem "I want to make an alteration on my policy" 
    .AddItem "I want to transfer my plan" 
    .AddItem "I have a fund query" 
    End With 

End Sub 

Private Sub Demand_Change() 

Dim index As Integer 
index = Demand.ListIndex 

Output.Clear 

Select Case index 
    Case Is >= 0 
     With Output 
      .AddItem "I need to provide this information verbally" 
      .AddItem "I need to update/send this myself" 
      .AddItem "I need to ask back-office to update/send this" 
     End With 


End Select 

End Sub 

Надеюсь, вы сможете помочь.

ответ

4

Сфера применения.

Private Sub Demand_Change() 
Dim index As Integer 

Здесь index локальна для Demand_Change(), доступ к нему за пределами этого подпункта, как вы делаете в SubmitButton_Click() не будет предоставлять значение, но будет рассматриваться как ноль.

Вместо этого объявите его как private index as integer в верхней части модуля.

+0

мужчина, 33 секунд! :/ – FreeMan

+1

Алекс и я придумали одно и то же решение, но я должен сказать, что Дэвид Земенс будет лучшим способом. – FreeMan

3

Поскольку вы не имеют Option Explicit показано, и вы не покажете, где index объявлен, я бы предположить, что в этой подпрограмме, index становится создается на лету:

Private Sub SubmitButton_Click() 
    Dim oindex As Integer 
    oindex = Output.ListIndex 
    If (index = 0 And oindex = 1) Then 
    Range("A7").Value = "WHY GOD WHY" 
    End If 
    Unload UserForm 
End Sub 

Поскольку index никогда не присваивается значение, оно остается по умолчанию равным 0.

3

В качестве альтернативы, работайте с объектами напрямую. Я не думаю, что есть необходимость в использовании модуль в области видимости переменной:

Private Sub SubmitButton_Click() 

If (Me.Demand.ListIndex = 0 And Me.Output.ListIndex = 1) Then 
    Range("A7").Value = "WHY GOD WHY" 
End If 

Unload UserForm 

End Sub 

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

Если вы работаете с этими значениями, в несколько раз SubmitButton_Click подпрограмм и хотите использовать переменные для краткости, то сделать это на уровне процедуры:

Private Sub SubmitButton_Click() 
Dim dIndex as Integer, oIndex as Integer 
dIndex = Me.Demand.ListIndex 
oIndex = Me.Output.ListIndex 

If (dIndex = 0 And oIndex = 1) Then 
    Range("A7").Value = "WHY GOD WHY" 
End If 

Unload UserForm 

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