Использование цикла для извлечения данных из именованного диапазона, соответствующего флажкам, которые являются истинными, - PullRequest
0 голосов
/ 15 октября 2018

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

Dim AirExGroup As Frame
Dim TrkExGroup As Frame
Dim OthrExgroup As Frame
Dim cb As Control

Set AirExGroup = Me.AirExGrp        'Contains all Air exception checkboxes
Set TrkExGroup = Me.TruckExGrp      'Contains all Truck exception checkboxes
Set OthrExgroup = Me.OthrExGrp      'Contains all Other exception checkboxes

'Airline Exceptions
For Each cb In AirExGroup.Controls
    If TypeName(cb) = "CheckBox" Then
        If cb.ControlFormat.Value = 1 Then
            'If checked, print Brevity code from Air_Ex list to Air Exception Column
        Else
            'If no boxes checked, print "N/A" in exceptions cell
    End If
  End If
Next cb

'Trucker Exceptions
For Each cb In TrkExGroup.Controls
    If TypeName(cb) = "CheckBox" Then
        If cb.ControlFormat.Value = 1 Then
             'If checked, print Brevity code from Trk_Ex list
        Else
             'If no boxes checked, print "N/A" in exceptions cell
    End If
  End If
Next cb

'Warehouse Exceptions
For Each cb In OthrExgroup.Controls
    If TypeName(cb) = "CheckBox" Then
        If cb.ControlFormat.Value = 1 Then
            'If checked, print Brevity code from Othr_Ex list
        Else
            'If no boxes checked, print "N/A" in exceptions cell
        End If
    End If
Next cb`

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

Dim Exceptions(1 To 8, 1 To 2) As String
Dim i As Integer, j As Integer
Dim cb As Shape

For i = 2 To 8
    For j = 1 To 2
        Exceptions(i, j) = Worksheets("List_Data").Cells(i, j).Value
    Next j
Next i

MsgBox Exceptions(4, 1) & ", " & Exceptions(6, 1)

Я уже 4 дня ломаю голову над поиском в Google, поэтому любую помощь, которую вы, ребята, можете предложить, даже если этобудет очень признателен, просто подтолкнуть в правильном направлении.

---- РЕДАКТИРОВАТЬ ---- Я думаю, что, возможно, начал понимать это, но я получаюошибка «Объект не поддерживает это свойство или метод», и я не уверен, как это исправить.Отладка указывает на If cb.ControlFormat.Value = True.Любой совет, какой синтаксис использовать, чтобы найти истинное / ложное состояние флажков в групповом поле?

Set AirCBCap = Worksheets("List_Data").Range("B2") 'Define checkbox caption reference column
Set Air_Ex = Worksheets("List_Data").Range("A2")  'Define brevity code list reference

For Each cb In AirExGroup.Controls
If TypeName(cb) = "CheckBox" Then
    If cb.ControlFormat.Value = True Then
        For i = 0 To 6
            If cb.Caption = AirCBCap.Offset(i, 0).Value Then 'If checked, find offset in caption name list that matches the checkbox caption     
                If AirCode = "" Then
                    AirCode = Air_Ex.Offset(i, 0)  'Find the offset that matches the offset of the checkbox caption and apply that to "AirCode"
                Else
                    AirCode = AirCode & ", " & Air_Ex.Offset(i, 0).Value
                End If
            End If
        Next i
    Else
        AirCode = "N/A" 'If no boxes checked, print "N/A" in exceptions cell
    End If
End If
Next cb 
emptyCell.Offset(0, 13).Value = AirCode

1 Ответ

0 голосов
/ 17 октября 2018

Я смог заставить это работать, используя цикл For / Next.Это не красиво, потому что есть много диапазонов Dims и Set, которые, я уверен, могут быть сгруппированы во что-то более элегантное, но это работает так, как я хочу, поэтому я возьму это сейчас.

Dim emptyCell As Range, AirBoxList As Range, TrkBoxList As Range, WhsBoxList As Range, AirCBCap As Range, Air_Ex As Range
Dim TrkCBCap As Range, WhsCBCap As Range, Trk_Ex As Range, Whs_Ex As Range
Dim shtSel As String, AirBoxName As String, AirCode As String, TrkCode As String, TrkBoxName As String, WhsCode As String
Dim WhsBoxName As String
Dim AirExGroup As Frame, TrkExGroup As Frame, WhseExgroup As Frame
Dim i As Integer

shtSel = sheetslistCB.Value

'Make selected sheet active
Worksheets(shtSel).Activate

Set AirExGroup = Me.AirlineExGrp    'Contains all Airline exception checkboxes
Set TrkExGroup = Me.TruckExGrp      'Contains all Trucker exception checkboxes
Set WhseExgroup = Me.WhseExGrp      'Contains all Warehouse exception checkboxes

Set emptyCell = Worksheets(shtSel).Range("A6") 'SelectFirstBlankCell Use function to determine emptyRow
Set AirCBCap = Worksheets("List_Data").Range("B2") 'Define checkbox caption reference column
Set Air_Ex = Worksheets("List_Data").Range("A2")  'Define brevity code list reference
Set AirBoxList = Worksheets("List_Data").Range("M2") 'Define list of names of Air freight check boxes
Set TrkBoxList = Worksheets("List_Data").Range("N2") 'Define list of names of Truck Check Boxes
Set WhsBoxList = Worksheets("List_Data").Range("O2") 'Define list of names of Warehouse check boxes
Set TrkCBCap = Worksheets("List_Data").Range("D2")   'Define checkbox caption reference column (Trucking)
Set WhsCBCap = Worksheets("List_Data").Range("F2")   'Define checkbox caption reference column (Warehouse)
Set Trk_Ex = Worksheets("List_Data").Range("C2")     'Define Brevity code list reference (Trucking)
Set Whs_Ex = Worksheets("List_Data").Range("E2")     'Define Brevity code list reference (Warehouse)

'Airline Exceptions
For i = 0 To 6
    AirBoxName = AirBoxList.Offset(i, 0).Value
    If Me.Controls(AirBoxName).Value = True Then
        If Me.Controls(AirBoxName).Caption = AirCBCap.Offset(i, 0).Value Then
            If AirCode = "" Then
                AirCode = Air_Ex.Offset(i, 0).Value 'Find the offset that matches the offset of the checkbox caption and apply that to "AirCode"
            Else
                AirCode = AirCode & ", " & Air_Ex.Offset(i, 0).Value
            End If
         End If
    End If
Next i
emptyCell.Offset(0, 13).Value = AirCode
'Trucker Exceptions
For i = 0 To 3
    TrkBoxName = TrkBoxList.Offset(i, 0).Value
    If Me.Controls(TrkBoxName).Value = True Then
        If Me.Controls(TrkBoxName).Caption = TrkCBCap.Offset(i, 0).Value Then
            If TrkCode = "" Then
                 TrkCode = Trk_Ex.Offset(i, 0).Value 'Find the offset that matches the offset of the checkbox caption and apply that to "TrkCode"
            Else
                TrkCode = TrkCode & ", " & Trk_Ex.Offset(i, 0).Value
            End If
        End If
    End If
Next i
emptyCell.Offset(0, 14).Value = TrkCode

'Warehouse Exceptions
For i = 0 To 0
    WhsBoxName = WhsBoxList.Offset(i, 0).Value
    If Me.Controls(WhsBoxName).Value = True Then
        If Me.Controls(WhsBoxName).Caption = WhsCBCap.Offset(i, 0).Value Then
            If WhsCode = "" Then
                WhsCode = Whs_Ex.Offset(i, 0).Value 'Find the offset that matches the offset of the checkbox caption and apply that to "WhsCode"
            Else
                WhsCode = WhsCode & ", " & Whs_Ex.Offset(i, 0).Value
            End If
        End If
    End If
Next i
emptyCell.Offset(0, 15).Value = WhsCode

Unload Me

End Sub
...