Оператор Case — скрыть / не показывать на основе условного значения

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь скрыть столбец, если значение case равно no.

Я сохранил это на листе, а не в модуле.

 Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.Activate

    If Not Application.Intersect(Range("C9"), Range(Target.Address)) Is     Nothing Then
        Select Case Target.Value
           Case Is = "Yes":
              Rows("10:10").EntireRow.Hidden = False
           Case Is = "No":
              Rows("10:10").EntireRow.Hidden = True
        End Select

    End If
End Sub
  

Комментарии:

1. Выполните код с помощью F8 и сообщите нам, достигнут ли регистр «Нет». Лучше всего использовать сбой с учетом регистра (например, «нет» вместо «No»), но может быть ряд других причин.

2. Как вы вводите значение в C9? Если по формуле, вы должны использовать событие вычисления на рабочем листе.

Ответ №1:

Событие вычисления на рабочем листе

  • Загрузка рабочей книги (Dropbox)
  • Если Yes и No изменяются с помощью формулы, Worksheet Change событие не будет запущено при изменении значения.
  • Скопируйте первый код в стандартный модуль, например Module1 (VBE >> Вставить >> Модуль).
  • Скопируйте второй код в модуль sheet, например Sheet1 .
  • Скопируйте третий код в этот модуль Workbook.

Модуль1

 Option Explicit

Public strYesNo As String

Sub YesNo(CellRange As Range, HideRow As Long)

    Const str1 As String = "Yes"
    Const str2 As String = "No"

    With CellRange
        If .Value <> strYesNo Then
            Select Case strYesNo
                Case str1
                    .Worksheet.Rows(HideRow).Hidden = False
                Case str2
                    .Worksheet.Rows(HideRow).Hidden = True
            End Select
            strYesNo = .Value
        End If
    End With

End Sub

Sub YesNo1()

    Const cSheet As Variant = "Sheet1"
    Const cRange As String = "C9"
    Const cCol As Long = 10

    YesNo ThisWorkbook.Worksheets(cSheet).Range(cRange), cCol

End Sub
  

Лист1

 Option Explicit

Private Sub Worksheet_Calculate()
    YesNo1
End Sub
  

Эта рабочая тетрадь

 Option Explicit

Private Sub Workbook_Open()
    YesNo1
End Sub
  

Комментарии:

1. Спасибо всем! если да / нет — это список, влияет ли это на что-нибудь? похоже, все еще не работает .. : (

2. @hothatsc: Я изменил код и добавил ссылку для скачивания рабочей книги.

Ответ №2:

Возможно, это связано с проверкой на ошибку с учетом регистра. Попробуйте этот код и сообщите нам, решит ли это проблему:

 Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.Activate

    If Not Application.Intersect(Range("C9"), Range(Target.Address)) Is Nothing Then
        Select Case LCase(Target.Value)
            Case Is = "yes":
                Rows("10:10").EntireRow.Hidden = False
            Case Is = "no":
                Rows("10:10").EntireRow.Hidden = True
        End Select
    End If

End Sub
  

Комментарии:

1. Приятно! Спасибо!! сейчас это работает, но если я изменю значение обратно на yes .. оно не будет отображаться.

2. @hothatsc Всегда пожалуйста. Я провел несколько тестов, и это работает, только если вы пишете yes или no в ячейке C9 . У вас это сработало?

3. Да, спасибо!! это произошло!! Извините за вопрос, но есть ли способ поместить код в качестве общедоступного модуля и вызвать его в sheet? Я спрашиваю, потому что у меня есть пара строк и листов, которые я хотел бы повторить задачу. Будет ли разумнее ввести код один раз в модуле, а затем вызывать его всякий раз?

4. @hothatsc Я рад, что у вас это сработало. Я могу помочь вам с этим, но если мы хотим следовать правилам, я думаю, вам следует открыть новый вопрос, и тогда я смогу ответить на новый. Если это было полезно, можете ли вы принять мой ответ? Спасибо! 🙂

5. Спасибо!! конечно, подойдет. извиняюсь, здесь совершенно новое 🙂