2016-04-05 10 views
0

Как я могу получить значение динамического изменения списка в пользовательской форме, когда пользователь изменяет значение другого списка в той же пользовательской форме. Основная часть, которая вызывает у меня проблемы, - это lstMonth. Значение lstMonth должно совпадать с месяцами, которые коррелируют с данными в разных листах, которые будут отображаться в первом списке. Я предоставлю изображение формы и данных, чтобы это все стало больше. enter image description hereПолучение динамического изменения значения списка с листами

Код

Option Explicit 


Private Sub cmdCalc_Click() 
    'declare variables and assign address to rngData variable 
    Dim strId As String, intRow As Integer, intNumSales As Integer, curSales As Currency 
    Dim rngData As Range 
    Set rngData = Application.Workbooks("t13-ex-e4d.xls").Worksheets("jan").Range("a3").CurrentRegion 
    'assign selected list box item to strId variable 
    strId = lstId.Value 
    'locate first occurrence of ID 
    intRow = 2 
    Do Until rngData.Cells(RowIndex:=intRow, columnindex:=4).Value = strId 
     intRow = intRow + 1 
    Loop 
    'accumulate and count salesperson's sales, stop when loop encounters different ID 
    Do While rngData.Cells(RowIndex:=intRow, columnindex:=4).Value = strId 
     curSales = curSales + rngData.Cells(RowIndex:=intRow, columnindex:=3).Value 
     intNumSales = intNumSales + 1 
     intRow = intRow + 1 
    Loop 
    'display appropriate amount 
    If optTotal.Value = True Then 
     lblAnswer.Caption = Format(expression:=curSales, Format:="currency") 
    Else 
     lblAnswer.Caption = Format(expression:=curSales/intNumSales, Format:="currency") 
    End If 

End Sub 

Private Sub cmdCancel_Click() 
    'close custom dialog box 
    Unload frmSalesCalc 

End Sub 


Private Sub UserForm_Initialize() 

lstMonth.Value = Application.Workbooks("T13-EX-E4D.xls").ActiveSheet.Range("b3").CurrentRegion 


End Sub 
+0

Я действительно не понимаю вопрос, что должно быть в списке месяца? все месяцы есть или все месяцы, когда у продавца есть продажи? –

+0

Поле списка месяцев должно совпадать с именами всех листов в книге. Сейчас есть 3 (февраль, март, апрель). Однако, если кто-то должен добавить май, ему нужно будет автоматически поместить may в список. После того, как это работает, поле списка слева от месяца должно измениться на идентификатор продаж, который находится на выбранном листе. Надеюсь, это поможет! –

ответ

1

На форме открытой заливки месяца ListBox со всех Avaible листов

 ' Declare Current as a worksheet object variable. 
    Dim Current As Worksheet 

    ' Loop through all of the worksheets in the active workbook. 
    For Each Current In Worksheets 

     ' Insert your code here. 
     ListBox_Month.AddItem Current.Name 
    Next 

Остальное basicaly заполнить другой ListBox, если список месяца нажат, со всеми доступными идентификаторами. Таким образом, в методе Listbox_Change вам нужно что-то вроде этого:

Dim sales_ids as Variant 
sales_ids = UniquesFromRange(Worksheets(Listbox_Month.value).Range(D)) 

Function UniquesFromRange(rng As Range) 
Dim d As Object, c As Range, tmp 
Set d = CreateObject("scripting.dictionary") 
For Each c In rng.Cells 
    tmp = Trim(c.Value) 
    If Len(tmp) > 0 Then 
     If Not d.Exists(tmp) Then d.Add tmp, 1 
    End If 
Next c 
UniquesFromRange = d.keys 
End Function 

Теперь у вас есть все идентификаторы, заполнить их во второй ListBox, и вуаля, остальное должно быть понятно, но просто спросить, если вы все еще есть вопросы