Макрос Excel VBA, автофильтрованные данные и скрытие столбцов

У меня проблема с макросом Excel. Я использую Excel 2003. У меня много данных в моем документе Excel, и мне нужно сделать макрос, чтобы я мог видеть определенные данные.

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

Я хочу сделать следующее: 1. Отфильтровать данные по определенным критериям столбца. 2. Используйте макрос, который: - выполняет поиск во всех столбцах в диапазоне (скажем, в диапазоне G: BV) для значения «1» - когда значение «1» находится в любой ячейке столбца, оно остается нетронутым - когда значение «1» столбец не найден должен быть скрыт

Я изо всех сил пытался найти что-нибудь о своей проблеме, но безуспешно. Пока что я придумал этот код:

Sub FindHid()

Dim vFind
Dim rSearch As Range

On Error GoTo 0

vFind = 1

Application.ScreenUpdating = True

For i = 7 To 75

With ActiveSheet.Columns("G:G")
   Set rSearch = .Find(vFind, LookIn:=xlValues, MatchCase:=False)

   If rSearch Is Nothing Then
      .EntireColumn.Hidden = True

      Else
      .EntireColumn.Hidden = False

   End If
End With
Set rSearch = Nothing
Next i

End Sub

person lowak    schedule 17.07.2013    source источник


Ответы (3)


Я бы не стал использовать метод Find. Попробуйте что-нибудь вроде:

NRows = ActiveSheet.UsedRange.Rows.Count
For R = 2 To NRows
  If Rows(R).Hidden Then
person stenci    schedule 17.07.2013
comment
Как я уже упоминал в другом ответе, я не владею VBA. Итак, если вы намекнете, куда мне его поставить? Я имею в виду, должен ли я заменить его на .Find или? - person lowak; 18.07.2013

Мой код:

Sub HideNonOnes()
    Dim rngToSearch As Range
    Dim rng As Range
    Dim rngToHide As Range

    Set rngToSearch = Range("G2", Range("G2").End(xlDown).End(xlToRight))

    For Each rng In rngToSearch.Columns
        If Evaluate("ISNA(MATCH(1," & rng.Address & ",0))") Then
            If rngToHide Is Nothing Then
                Set rngToHide = rng.Range("A1")
            Else
                Set rngToHide = Union(rngToHide, rng.Range("A1"))
            End If
        End If
    Next rng
    If Not rngToHide Is Nothing Then
        rngToHide.Columns.Hidden = True
    End If
End Sub

Он создает диапазон rngToHide перед тем, как скрыть все эти столбцы за один раз.

person Andy G    schedule 17.07.2013
comment
Это работает, но я думаю, что то, как вы устанавливаете rngToSearch, немного опасно. Что делать, если столбец G пуст? В итоге вы получите диапазон $G$2:$XFD$1048576. - person Jon Crowell; 18.07.2013
comment
@HeadofCatering Спасибо;) Да, я бы не стал использовать этот метод в целом, я просто использовал его, чтобы получить диапазон для работы. End () обычно не следует использовать, если мы не можем гарантировать наличие некоторых данных или проверить, какую строку / столбец он возвращает. - person Andy G; 18.07.2013
comment
Хм ... Я забыл упомянуть, что я совершенно необразован в VBA, и все, что я пытаюсь сделать, это вставить код и посмотреть, работает ли он. Обычно я понимаю это по-своему, так что, наверное, просто не понимаю;) И что ж ... это просто не работает. Когда я отфильтровал данные и использовал ваш код, все столбцы начинались с G hid. Это не совсем то, что мне было нужно. Я могу предоставить вам пример того, как это выглядит, однако я не знаю, могу ли я прикрепить что-нибудь к stackoverflow. - person lowak; 18.07.2013

Это не лучшее решение моей проблемы, но работает:

Sub FindHid()

Dim vFind
Dim rSearch As Range

'On Error GoTo ErrorHandle
Application.ScreenUpdating = False

vFind = 1

Range("F1").Select

For i = 1 To 68
    ActiveCell.Offset(0, 1).Range("A1").Select
    Range(Selection, Selection.End(xlDown)).Select

    Set rSearch = Selection.Find(vFind, LookIn:=xlValues, LookAt:= _
        xlWhole, MatchCase:=True)

        If rSearch Is Nothing Then
            Selection.EntireColumn.Hidden = True

        Else
            Selection.EntireColumn.Hidden = False

        End If

Next i
Application.ScreenUpdating = True
Range("A1").Select

End Sub
person lowak    schedule 19.07.2013