лучший способ:
переименовать все ваши чекбоксы, чтобы отразить значения задач и мобильных / настольных компьютеров (например, "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