Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2015, 08:22   #1
Demetros
Форумчанин
 
Регистрация: 28.01.2014
Сообщений: 126
По умолчанию Оптимизировать код.

Народ, доброе время суток. Сделал для себя макрос "как есть" , но мне кажется его еще можно немного допилить. Помогите оптимизировать код:

Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address(0, 0) = "B20" Then
            Лист1.Rows(21).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B21" Then
            Лист1.Rows(22).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B22" Then
            Лист1.Rows(23).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B23" Then
            Лист1.Rows(24).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B24" Then
            Лист1.Rows(25).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B25" Then
            Лист1.Rows(26).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
        If Target.Address(0, 0) = "B26" Then
            Лист1.Rows(27).EntireRow.Hidden = IIf(Target.Value = "", True, False)
        End If
И так еще несколько десятков раз...

End Sub


Судя по внешнему виду сюда, как мне кажется, можно воткнуть цикл, но как это сделать моих познаний VBA не хватает.

Последний раз редактировалось Serge_Bliznykov; 28.04.2015 в 10:23.
Demetros вне форума Ответить с цитированием
Старый 28.04.2015, 08:52   #2
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Вы бы лучше файл добавили - исходные данные можно заменить на что угодно
27102014 вне форума Ответить с цитированием
Старый 28.04.2015, 10:18   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' выход, если изменено больше одной ячейки
    If Target.Cells.Count > 1 Then Exit Sub

    ' при изменении одной из ячеек диапазона B20:B26
    If Not Intersect(Target, Me.Range("B20:B26")) Is Nothing Then
        Target.Offset(1).EntireRow.Hidden = Target.Value = ""
    End If
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 28.04.2015, 10:27   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim c As Range
  For Each c In Target.Cells
    If Not Application.Intersect(c, Лист1.[b20:b9999]) Is Nothing Then
      c.EntireRow.Hidden = c = ""
    End If
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 28.04.2015, 23:25   #5
Demetros
Форумчанин
 
Регистрация: 28.01.2014
Сообщений: 126
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' выход, если изменено больше одной ячейки
    If Target.Cells.Count > 1 Then Exit Sub

    ' при изменении одной из ячеек диапазона B20:B26
    If Not Intersect(Target, Me.Range("B20:B26")) Is Nothing Then
        Target.Offset(1).EntireRow.Hidden = Target.Value = ""
    End If
End Sub
Спасибо огромное! Работает, даже больше чем хотелось за что отдельное спасибо.
Demetros вне форума Ответить с цитированием
Старый 28.04.2015, 23:27   #6
Demetros
Форумчанин
 
Регистрация: 28.01.2014
Сообщений: 126
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim c As Range
  For Each c In Target.Cells
    If Not Application.Intersect(c, Лист1.[b20:b9999]) Is Nothing Then
      c.EntireRow.Hidden = c = ""
    End If
  Next
End Sub
Спасибо за отклик. Тоже работает, но с обратным эффектом.
Demetros вне форума Ответить с цитированием
Старый 29.04.2015, 00:11   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я провтыкал, что по состоянию В20 скрываем/показываем строку 21))
для "правильного эффекта" используйте так
Код:
c.Offset(1).EntireRow.Hidden = c = ""
предложенный вариант обработает ситуацию, когда в колонке В например копированием (или с помощью DELETE) было изменено сразу произвольное количество ячеек, а не обязательно по одной
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать код по IE 7 nibufep JavaScript, Ajax 1 08.03.2015 13:31
Оптимизировать код strannick Microsoft Office Excel 9 14.11.2012 00:59
Оптимизировать код satka Microsoft Office Access 2 01.12.2011 14:36
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57