Динамическая проверка флажков с тем же именем, что и у рабочих таблиц -VBA Excel - PullRequest
0 голосов
/ 05 сентября 2018

Я в Excel, у меня около 30 флажков UserForm, каждый из которых расположен на странице под названием «Сводка» в большом столбце. Каждый из которых соответствует листу. Я пытаюсь перебрать эти флажки, чтобы увидеть, какие из них отмечены, а какие нет. Я поместил некоторый код в цикл всех таблиц, этот бит не работает:

  Private Sub Run_Click()
Dim SummaryFirstBlankRow As Integer
Dim LastRow As Integer
Dim LastRowH As Integer
Dim rng As Range
Dim SumOfHours As Variant
Dim EndLoop As Boolean
Dim DupeRowNo As Integer
Dim RowNo2 As Integer
Dim ClearContent As Boolean
Dim cbtrue As Boolean
Dim ws As Worksheet


cbtrue = False
    For Each ws In ActiveWorkbook.Worksheets



        LastRowH = ws.Cells(Rows.Count, 8).End(xlUp).Offset(1, 0).Row


    'If ActiveWorkbook.Sheets("Summary").CheckBoxes(ws.name).Value = False Then ' looks to see if ws.names' checkbox is checked or not
     '               ClearContent = True 'if not checked, sets clear content to true
    'End If

    For Each CheckBox In Sheets("Summary").CheckBoxes
        If CheckBox.name = ws.name Then
            If CheckBox.Value = False Then
                ClearContent = True
            End If
        End If
    Next CheckBox
        If ClearContent = True Then
            For c = 1 To LastRowH   'if not checked, looks on current worksheet (within loop) and if any "Y" or "y" vals, clears them
                If ws.Range("H" & c).Value = "Y" Or ws.Range("H" & c).Value = "y" Then
                    ws.Range("H" & c).ClearContents
                End If
            Next
        End If
    ...

cbtrue - это просто переменная, чтобы увидеть, существует ли флажок, следовательно, если он это сделает, он перейдет к оператору if, после чего он будет определять, отмечен ли этот флажок или нет, в зависимости от этого он сохраняет переменную ClearContent. (который я использую позже в коде).

Проблема в том, что когда дело доходит до «Shapes (« ws.Name »)», ws.name - это просто имя рабочего листа в каждом цикле. Так что в первом раунде цикла это будет «Сводка» ... Однако я думаю, что он физически ищет лист «ws.name», который, очевидно, не существует. Я попытался удалить его из кавычек, а также различных других методов, таких как «Флажки (" ws.Name ")", но, похоже, у них всех одна и та же проблема.

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

Любая помощь приветствуется. Заранее спасибо:)

UPDATE

Я изменил код с помощью @Xabier (я добавил дополнительный оператор if, чтобы убедиться, что CheckBox имеет то же имя, что и рабочий лист. Теперь я не получаю ошибок, но когда я его запускаю, он не очищает содержимое ни одной из ячеек, которые я запрашивал. Кажется, я не могу понять, почему он это делает. Если кто-то сможет это заметить и сообщить мне, это было бы здорово. Спасибо :)

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Ваш код определенно обрабатывает "ws.name" как буквенную строку, потому что он заключен в двойные кавычки. Вы можете напрямую установить для переменной ClearContent значение true или false, установив флажок. Таким образом, вам не нужно проверять его значение.

0 голосов
/ 07 сентября 2018

Есть две проблемы с вашим кодом:

Аспект 1: имя или текст?

Я думаю, здесь может возникнуть проблема с пониманием названия флажка в Excel:

enter image description here

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

Используйте этот пример кода, чтобы увидеть имена и отобразить тексты, которые фактически используют ваши флажки:

For Each CheckBox In Sheets("Summary").CheckBoxes
    MsgBox "Name: " & CheckBox.Name & " Text: " & CheckBox.Text
Next CheckBox

Он выдаст что-то вроде этого:

enter image description here

Если я прав, чтобы решить вашу проблему, вы должны либо дать флажкам правильное имя (имена рабочих листов), либо вместо сравнения Name сравнить, используя свойство Text флажка.

Аспект 2: значение не верно / ложно

Значение флажка не True или False, но значение флажка может быть xlOn или xlOff. Так что не проверяйте True или False, а используйте правильные константы.

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

Dim ws As Worksheet
Dim ClearContent  As Boolean
Dim CheckBox As CheckBox

For Each ws In ActiveWorkbook.Worksheets

    ' Reset ClearContent for each Sheet
    ClearContent = False

    For Each CheckBox In Sheets("Summary").CheckBoxes
        ' Depending on your requests, compare either with Name or with Text
        If CheckBox.Text = ws.Name Then
            ' Use xlOff constant instead of False
            If CheckBox.Value = xlOff Then
                ClearContent = True
            End If

            ' We can exit the foreach loop when we found the correct checkbox
            Exit For
        End If
    Next CheckBox

    If ClearContent Then
        MsgBox "Going to clear " & ws.Name
    End If
Next ws
0 голосов
/ 05 сентября 2018

Следующий код ниже покажет вам, как перебирать флажки ActiveX на вашем листе и проверять, отмечены они или нет:

Sub Test()
    Dim obj As OLEObject

    For Each obj In Sheets("Summary").OLEObjects
    'loop through ActiveX Checkboxes on Worksheet "Summary"
        If obj.progID = "Forms.CheckBox.1" Then
        'is it a Checkbox?
            If obj.Object = False Then
            'is the checkbox unchecked
                ClearContent = True
            End If
        End If
    Next obj
End Sub

UPDATE: Для флажков управления формой будет сделано следующее:

Sub Test2()
    Dim cb As CheckBox

    For Each cb In Sheets("Summary").CheckBoxes
        If cb.Value = False Then
            ClearContent = True
        End If
    Next cb
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...