Как создать пользовательскую форму, которая возвращает имена в списке и два параметра флажка? - PullRequest
0 голосов
/ 21 ноября 2019

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

Моя пользовательская форма и электронная таблица прилагаются ниже.

Пока мой код:

Private Sub BtnCancel_Click()
MsgBox ("Report Cancelled")
Unload FrmCust
End Sub


Private Sub BtnOk_Click()

' msgbox showing the user's selection, as well 
' as days and amount if selected in the checkboxes

End Sub


Private Sub UserForm_Initialize()

' Fill the listbox with each user's name

  Dim cell As Range

'Load to ListBox

  FrmCust.ListBoxCustlist.MultiSelect = fmMultiSelectSingle 'allows only one selection

  For Each cell In Worksheets("Data").Range("J3:j17")
    ListBoxCustlist.AddItem cell.Value
  Next cell

End Sub

Пользовательская форма и соответствующая электронная таблица

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2019

Комментарии в вашем коде показывают, что вам нужно, чтобы какой-нибудь код MsgBox отображал выбранные значения. (Вы не включили имена ваших элементов управления флажками, поэтому я использовал Checkbox1 и Checkbox2 соответственно. Измените их так, чтобы они соответствовали именам элементов управления флажками.)

If ListBoxCustlist.ListIndex = -1 Then
  MsgBox "No Item was selected"
Else
  MsgBox ListBoxCustlist.List(ListBoxCustlist.ListIndex, 0) & " - Days=" & CheckBox1.Value & " - Amount=" & CheckBox2.Value
  ' Me.Hide ' Optionally hide the form
End If

Обновление : Я бы хотел взять среднее число каждого человека в списке с таким именем

Ну, это намного сложнее, но это должно работать:

Private Sub BtnOk_Click()
  If ListBoxCustlist.ListIndex = -1 Then
    MsgBox "No Item was selected"
  Else
    Dim lRow As Long
    Dim lLastRow As Long
    Dim dDayCount As Object
    Dim dDayValue As Object
    Dim dAmountCount As Object
    Dim dAmountValue As Object
    Set dDayCount = CreateObject("Scripting.Dictionary")
    Set dDayValue = CreateObject("Scripting.Dictionary")
    Set dAmountCount = CreateObject("Scripting.Dictionary")
    Set dAmountValue = CreateObject("Scripting.Dictionary")
    Dim sPerson As String

    lLastRow = 17

    sPerson = ListBoxCustlist.List(ListBoxCustlist.ListIndex, 0)
    With Worksheets("Data")
      For lRow = 3 To lLastRow
        If .Range("A" & lRow).Value = sPerson Then
          If Not dDayCount.Exists(sPerson) Then
            dDayCount.Add sPerson, 1
            dAmountCount.Add sPerson, 1
            dDayValue.Add sPerson, .Range("B" & lRow).Value
            dAmountValue.Add sPerson, .Range("C" & lRow).Value
          Else
            dDayCount.Item(sPerson) = dDayCount.Item(sPerson) + 1
            dDayValue.Item(sPerson) = dDayValue.Item(sPerson) + .Range("B" & lRow).Value
            dAmountCount.Item(sPerson) = dAmountCount.Item(sPerson) + 1
            dAmountValue.Item(sPerson) = dAmountValue.Item(sPerson) + .Range("C" & lRow).Value
          End If
        End If
      Next
    End With

    Dim sResult As String
    sResult = sPerson & ": "
    If CheckBox1 Then
      If dDayCount.Item(sPerson) = 0 Then
        sResult = sResult & "Days AVG=0"
      Else
        sResult = sResult & "Days AVG=" & dDayValue.Item(sPerson) / dDayCount.Item(sPerson)
      End If
      If CheckBox2 Then sResult = sResult & " : "
    End If
    If CheckBox2 Then
      If dAmountCount.Item(sPerson) = 0 Then
        sResult = sResult & "Amount AVG=0"
      Else
        sResult = sResult & "Amount AVG=" & dAmountValue.Item(sPerson) / dAmountCount.Item(sPerson)
      End If
    End If

    MsgBox sResult

  End If
End Sub
...