Помогите скрыть колонки по заданному значению

Автор Вася_Пупкин, 14.09.2015, 13:04

« назад - далее »

Вася_Пупкин

Добрый день,
друзья, помогите с решением.

Есть выпадающий список и 6-ть. колонок с заглавием "Объект сравнения №..."
Ожидаемый результат: при выборе из выпадающего списка (ВС) количество объектов сравнения (например 3 шт.) остальные колонки (Объект сравнения №4, №5, №6) должны скрываться.

Пробовал применить следующий макрос:
Option Explicit
Sub test()
    Dim sht As Worksheet
    Dim a As Integer
        Set sht = ThisWorkbook.Worksheets("СП")
       If sht.Cells(3, 4) = 1 Then
        For a = 6 To 10
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 6 To 10
            sht.Columns(a).Hidden = False
        Next a
    End If
    If sht.Cells(3, 4) = 2 Then
        For a = 7 To 10
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 7 To 10
            sht.Columns(a).Hidden = False
        Next a
    End If
    If sht.Cells(3, 4) = 3 Then
        For a = 8 To 10
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 8 To 10
            sht.Columns(a).Hidden = False
        Next a
    End If
        If sht.Cells(3, 4) = 4 Then
        For a = 9 To 10
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 9 To 10
            sht.Columns(a).Hidden = False
        Next a
    End If
            If sht.Cells(3, 4) = 5 Then
        For a = 10 To 10
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 10 To 10
            sht.Columns(a).Hidden = False
        Next a
    End If
                If sht.Cells(3, 4) = 6 Then
        For a = 11 To 11
            sht.Columns(a).Hidden = True
        Next a
    Else
        For a = 11 To 11
            sht.Columns(a).Hidden = False
        Next a
    End If
End Sub

Результат: программа отображает 5-ть колонок при значениях ВС от 1 до 5 и 6-ть колонок при значении 6.

Текст форматировали, а код забыли [МОДЕРАТОР]

vikttur

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Not Application.Intersect(Range("D3"), Target) Is Nothing Then
        With Application: .ScreenUpdating = False: .EnableEvents = False: End With
       
        Columns("E:J").Hidden = True
        Columns(Cells(3, 4).Value + 4).Hidden = False
       
        With Application: .ScreenUpdating = True: .EnableEvents = True: End With
    End If
End Sub

Вася_Пупкин

#2
Проработал сабж.
Немного усложню вопрос.
При выборе значения 1-6 выпадающего списка листа "СП", на листе "СП" должно остаться соответствующее число колонок E-J, значения остальных колонок должны быть исключены из расчёта. На листах "А-1" и "Расчет Км СП "  нужно скрыть соответствующие группы полей (подсвечено заливкой).

vikttur

ЦитироватьПроработал сабж
И что вынесли? Только вопрос? Пробовали продолжить сами?

Вася_Пупкин

#4
Использовал следующий код:
Option Explicit
Sub test()
    Dim sht As Worksheet
    Dim i As Integer
    Dim num As Byte
   
    Set sht = ThisWorkbook.Worksheets(СП")
    num = sht.Cells(3, 4)
    For i = 5 To num + 4
            sht.Columns(i).Hidden = False
    Next i
    For i = num + 5 To 10
            sht.Columns(i).Hidden = True
    Next i
End Sub


Загвоздка в следующем:

  • данные расположены на 3-х листах;
  • скрывать в одном случае нужно колонки, в другом - строки;
  • на листе А1 необходимо скрыть сгруппированные строки.

cheshiki1

Цитата: Вася_Пупкин от 15.09.2015, 09:26
  • скрывать в одном случае нужно колонки, в другом - строки;
проверяйте лист по названию и применяйте скрытие или по столбцу или по строке.

vikttur

Зря отказываетесь от события Worksheet_Change. Или на это есть причины?
Зачем применять два цикла для скрытия/отображения, если можно одним махом, как я показал?

Цитироватьзначения остальных колонок должны быть исключены из расчёта
скрывать... нужно колонки... строки;
на листе А1 необходимо скрыть сгруппированные строки
Этот все не по теме.

Вася_Пупкин

Цитата: cheshiki1 от 15.09.2015, 09:36
Цитата: Вася_Пупкин от 15.09.2015, 09:26
  • скрывать в одном случае нужно колонки, в другом - строки;
проверяйте лист по названию и применяйте скрытие или по столбцу или по строке.

Как быть с группой строк на листе А1?
Пытался применить код и к строкам. Пока безрезультатно. Пожалуйста помогите с синтаксисом цикла работы со строками внутри оператора with.

Вася_Пупкин

#8
Кнопка цитирования не для ответа [МОДЕРАТОР]
Здравствуйте vikttur,
Никаких предубеждений относительно события Worksheet_Change у меня нет. Единственное, почему я не применил ваш метод, в итоге мы получаем не тот результат, который мне нужен. Скрипт отображает только одну колонку соответствующего объекта сравнения, вместо двух, трех, четырех  нужных.

vikttur

Цитироватьпри выборе из выпадающего списка (ВС) количество объектов сравнения (например 3 шт.) остальные колонки (Объект сравнения №4, №5, №6) должны скрываться.
А это кто писал?

Вася_Пупкин

Уважаемый vikttur.

Возможно я не совсем конкретно выразился. Имелось ввиду при выборе значения 3, остаются объекты 1,2,3, объекты 4,5,6 скрываются, при выборе 5 , отображаются объекты 1,2,3,4,5, 6-й объект скрывается.
Если у вас есть вопросы относительно тех. задания, не стесняйтесь, задавайте. С удовольствием отвечу на все.

vikttur

Замените две строки. Получится такое:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Not Application.Intersect(Range("D3"), Target) Is Nothing Then
        With Application: .ScreenUpdating = False: .EnableEvents = False: End With
       
        With Target
            Columns("E:J").Hidden = False
            If .Value < 6 Then Range(Cells(1, .Value + 5), Cells(1, 10)).EntireColumn.Hidden = True
        End With
       
        With Application: .ScreenUpdating = True: .EnableEvents = True: End With
    End If
End Sub