Условно раскройте листы в Excel / vba - PullRequest
0 голосов
/ 29 апреля 2019

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

После активации кнопки команды в форме пользователя у меня есть следующее:

Private Sub ContinueCommand_Click()
Dim Valid As Boolean, wks As Worksheet, c As Integer, actCol As Long    
    actCol = ActiveSheet.Range("A1").End(xlToRight).Column
    For Each wks In ActiveWorkbook.Worksheets
        For c = 1 To actCol
            If ActiveCell.Value = "Target" Then
                wks.Visible = xlSheetVisible
                Exit For
            End If
        Next c
    Next wks
    Valid = True
If Valid = True Then
Unload Me
End If
End Sub

Я позаимствовал из нескольких источников, в том числе здесь для использования ActiveCell определяет, существует ли значение , не скрывает листы , находит значения в диапазоне и ищет строку .Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Как я уже говорил в моих комментариях, есть некоторые проблемы с тем, как вы решили реализовать это.

Ваш цикл For c = 1 To actCol не нужен.Это легко увидеть, потому что c на самом деле нигде в цикле не используется.

Предположим, что ваше целевое значение находится в wks.Range("A100") (1-й ряд и 100-й столбец).

Ваш код будет выполнять ту же самую операцию 100 раз и получит точно такой же результат.Это то, что заставляет вас использовать Exit For, что является плохой практикой.

Если я правильно понял ваш первоначальный пост, если Target существует в конкретной рабочей таблице, то все ячейки до Target пусты.

В этом случае Target будет либо в wks.Range("A1"), либо в wks.Range("A1").End(xlToRight).Если его нет ни в одной из этих двух ячеек, его вообще нет в этом конкретном листе, что означает, что 1-я строка полностью пуста.Вам не нужно проверять больше ячеек, кроме этих двух.

Ваш код не проверяет, находится ли Target в wks.Range("A1").

Также ваше использование Application.Match заставляет меня поверить, что вы, вероятно, были введены в заблуждение распространенным заблуждением, что wks.Range("A1").End(xlToRight) - это диапазон ячеек, начинающийся с A1 и простирающийся вплоть до последнегопустая ячейка в 1-м ряду.

Правда в том, что wks.Range("A1").End(xlToRight) является одиночной ячейкой , а не диапазоном ячеек.Выбор A1 и затем нажатие CTRL+right arrow покажет вам, какая именно это ячейка.

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

Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
    If sht.Range("A1").Value = "Target" Or sht.Range("A1").End(xlToRight).Value = "Target" Then
        sht.Visible = xlSheetVisible
    Else
        MsgBox "target was not found in " & sht.Name
    End If
Next sht
0 голосов
/ 30 апреля 2019

Я хочу поблагодарить Брюса Уэйна, Скотта Крейнера, Ставроса Джона, Дарелла Х., которые помогли мне приблизиться к этому ответу. Конечный результат выглядел так:

Private Sub ContinueCommand_Click()
Dim wks As Worksheet    
    For Each wks In ActiveWorkbook.Worksheets
       If Not IsError(Application.Match("Target", wks.Range("A1").End(xlToRight), 0)) Then
                wks.Visible = xlSheetVisible
            End If
    Next wks
Unload Me
End Sub

Если у кого-нибудь в будущем возникнут проблемы с запуском этого, дайте мне знать, и я опубликую более полную версию.

...