2015-05-12 1 views
0

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

Sub addLabel() 
Dim theLabel As Object 
Dim theRanker As Object 
Dim labelCounter As Long 
Dim RowCount As Integer 

RowCount = Sheets("Overview").Range("A" & Rows.count).End(xlUp).Row 

For labelCounter = 1 To RowCount 
    Set theRanker = CriteriaPairwiseForm.Controls.Add("Forms.ComboBox.1", "Rating" & labelCounter, True) 
    With theRanker 
     .Left = 20 
     .Width = 150 
     .Top = 30 * labelCounter 
     .AddItem "Equal Importance" 
     .AddItem "Moderate Importance" 
     .AddItem "Strong Importance" 
     .AddItem "Very Strong Importance" 
     .AddItem "Extreme Importance" 

    End With 
    Set theLabel = CriteriaPairwiseForm.Controls.Add("Forms.Label.1", "CriteriaRank" & labelCounter, True) 
    With theLabel 
     .caption = Cells(labelCounter, 1).Value 
     .Left = 200 
     .Width = 150 
     .Top = 30 * labelCounter 

    End With 
Next labelCounter 
End Sub 
+1

Вы пробовали использовать 'theRanker.Name'? –

+0

Вы получаете ссылку в коде выше, почему бы вам просто не назвать их удобным? – Comintern

+0

Тим, который вернул «Рейтинг3», но затем, когда я попытался ссылаться на его значение, используя Rating3.Value, он сказал, что переменная не определена. – Lilian

ответ

0

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

Sub addLabel() 
    Dim theLabel As Object 
    Dim theRanker As Object 
    Dim labelCounter As Long 
    Dim RowCount As Integer 

    RowCount = Sheets("Overview").Range("A" & Rows.Count).End(xlUp).Row 

    For labelCounter = 1 To RowCount 
     Set theRanker = CriteriaPairwiseForm.Controls.Add("Forms.ComboBox.1", _ 
         "Rating" & labelCounter, True) 
     With theRanker 
      .Left = 20 
      .Width = 150 
      .Top = 30 * labelCounter 
      .AddItem "Equal Importance" 
      .AddItem "Moderate Importance" 
      .AddItem "Strong Importance" 
      .AddItem "Very Strong Importance" 
      .AddItem "Extreme Importance" 
      .Name = "Ranker" & labelCounter 
     End With 
     Set theLabel = CriteriaPairwiseForm.Controls.Add("Forms.Label.1", _ 
         "CriteriaRank" & labelCounter, True) 
     With theLabel 
      .Caption = Cells(labelCounter, 1).Value 
      .Left = 200 
      .Width = 150 
      .Top = 30 * labelCounter 

     End With 
    Next labelCounter 
End Sub 

Вы можете использовать тот же метод, чтобы получить значения из них позже (или обратиться к ним по индексу строки конкатенации имени) , Вы можете проверить это, создав UserForm под названием «CriteriaPairwiseForm», и положить следующий код в том виде, в дополнение к Sub addLabel:

Option Explicit 

Private Sub UserForm_Initialize() 
    addLabel 
End Sub 

Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    GetValues 
End Sub 

Private Sub GetValues() 

    Dim labelCounter As Long 
    Dim RowCount As Integer 
    Dim message As String 

    RowCount = Sheets("Overview").Range("A" & Rows.Count).End(xlUp).Row 

    For labelCounter = 1 To RowCount 
     message = "Ranker" & labelCounter & " contains:" & vbCrLf & _ 
        CriteriaPairwiseForm.Controls("Ranker" & labelCounter).Text 
     MsgBox message 
    Next labelCounter 

End Sub 
+0

Я не вижу никаких значений из второго кода. – Lilian

+0

@ Lillian - Отлично работал, когда я тестировал его. Открыта ли форма, когда вы пытаетесь прочитать значения? – Comintern

+0

Да, форма все еще открыта. Я не вижу никаких значений в непосредственном окне, когда я изменяю значения combobox. – Lilian

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