#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. Спасибо!! конечно, подойдет. извиняюсь, здесь совершенно новое 🙂