Рассчитать итоги для выбранных флажков в пользовательской форме, используя Excel VBA - PullRequest
0 голосов
/ 03 марта 2019

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

Фактическая пользовательская форма

Код для кнопки Оценка :

Private Sub preflight_calculate_Click()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Preflight")
With ws
LastRow = .Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To LastRow
   For j = 0 To us_mp0.Selected - 1
       lbValue = us_mp0.Selected(j)

       If .Cells(i, "A").Value = lbValue Or _
          .Cells(i, "A").Value = Val(lbValue) Then
           preflight_resource = Val(preflight_resource) + Val(.Cells(i, "G").Value)
           preflight_time = Val(preflight_time) + Val(.Cells(i, "I").Value)
       End If
   Next
 Next
 End With
 End Sub

В пользовательской форме вы можете видеть P0, P1, P2, поэтому эти значения будут иметь значения только в таблице Excel и оттудаТолько мне нужно рассчитать итоги для выбранных флажков

Снимок экрана Excel Sheet

Есть мысли?Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете использовать класс с чем-то вроде ниже, остальные могут оставить для вашего самообучения:

Option Explicit
Public WithEvents Chk As MSForms.CheckBox

Private Sub Chk_Change()
    If Chk Then
        .ChkCount = .ChkCount + 1
    Else
        .ChkCount = .ChkCount - 1
    End If
End Sub
0 голосов
/ 03 марта 2019

лучший способ:

  • переименовать все ваши чекбоксы, чтобы отразить значения задач и мобильных / настольных компьютеров (например, "US-P0 | Mobile", "" US-P2 | Mobile ", ... ")

  • перебрать все элементы управления (например: For Each ctl In Me.Controls)

  • выбрать" чекбоксы "типа (например, If TypeName(ctl) = "CheckBox" Then)

  • разделить свое имя на искомые строки (например: task = Split(taskString, "|")(0), mobileOrDesktopOffset = IIf(Split(taskString, "|")(1) = "Mobile", 0, 1))

  • наконец, сделать правильные суммы

Вы можете попробовать этот код, которому не нужно переименовывать флажки, как указано выше (но вы действительно должны это сделать ..):

Private Sub preflight_calculate_Click()
    Dim preflight_resource As Double, preflight_time As Double

    Dim taskRng As Range
    Dim taskString As Variant
    Dim task As String, mobileOrDesktopOffset As Long
    With ThisWorkbook.Sheets("Preflight")
        With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))

            preflight_resource = Val(Me.preflight_resource)
            preflight_time = Val(Me.preflight_time)
            For Each taskString In GetTasks
                task = Split(taskString, "|")(0)
                mobileOrDesktopOffset = IIf(Split(taskString, "|")(1) = "Mobile", 0, 1)
                Set taskRng = .Find(what:=task, lookat:=xlWhole, LookIn:=xlValues)
                preflight_resource = preflight_resource + taskRng.Offset(, 5 + mobileOrDesktopOffset).Value
                preflight_time = preflight_time + taskRng.Offset(, 7 + mobileOrDesktopOffset).Value
            Next
        End With
    End With

    With Me
        .preflight_resource.Text = preflight_resource
        .preflight_time.Text = preflight_time
    End With
End Sub


Function GetTasks() As Variant
    Dim ctl As Control
    Dim mobileLeft As Long, desktopLeft As Long

    With Me
        For Each ctl In .Controls
            If TypeName(ctl) = "CheckBox" Then
                If ctl.Value Then
                    GetTasks = GetTasks & " " & ctl.Parent.Caption & "-" & ctl.Caption & "|" & GetMobileOrDesktop(ctl)
                End If
            End If
        Next
    End With
    GetTasks = Split(Trim(GetTasks))
End Function


Function GetMobileOrDesktop(ctl As Control) As String
    Dim ctl1 As Control
    For Each ctl1 In ctl.Parent.Controls
        If ctl1.Caption = "Mobile" Then
            If ctl1.left = ctl.left Then
                GetMobileOrDesktop = "Mobile"
            Else
                GetMobileOrDesktop = "Desktop"
            End If
            Exit For
        End If
    Next
End Function
...