Скрытие столбцов в VBA Excel - PullRequest
0 голосов
/ 23 ноября 2018

У меня 4 листа в 1 книге Excel.Я пытаюсь сохранить Sheet1, Sheet2 и Sheet4 в массиве.Затем я хочу, чтобы программа скрыла все столбцы в массиве, которые не имеют значения «FY» в строке 8. Цель этого состоит в том, чтобы иметь возможность легко просматривать строки FY и не допустить, чтобы Sheet3 скрывал любые столбцы.

Вот снимок экрана файла Excel: enter image description here

и вот мой фрагмент кода:

Sub FY_HIDE222()    
    Dim keyCells As Range
    Dim ws As Variant
    ws = Array("Sheet1", "Sheet2", "Sheet4")

    For Each sh In ws
        For Each keyCells In ws.Range("C8:ZZ8").Cells
            If keyCells.Value <> "FY" Then
                keyCells.EntireColumn.Hidden = True
            End If
        Next keyCells
    Next sh
End Sub

Я получаюсинтаксическая ошибка в этой строке:

For Each keyCells In ws.Range("C8:ZZ8").Cells

, говорящая «keyCells = nothing» ... Помогите мне подумать, так как я считаю, что в переменной keyCells должны храниться FY, Q1, Q2 и т. д.

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать объединение, чтобы собрать квалификационные диапазоны на одном листе и спрятаться за один раз.Если вы хотите пройти лишнюю милю, вы можете переписать цикл, чтобы зациклить столбцы диапазона и выйти из цикла любого столбца в первой соответствующей ячейке, поскольку вы все равно скрываете весь столбец.

Public Sub test()
    Dim wsName, i As Long, c As Range, unionRng As Range
    wsName = Array("Sheet1", "Sheet2", "Sheet4")

    For i = LBound(wsName) To UBound(wsName)
        For Each c In Worksheets(wsName(i)).Range("C8:ZZ8")
            If c.Value <> "FY" Then
                If Not unionRng Is Nothing Then
                    Set unionRng = Union(unionRng, c)
                Else
                    Set unionRng = c
                End If
            End If
        Next c
        If Not unionRng Is Nothing Then 
            unionRng.EntireColumn.Hidden = True
            Set unionRng = Nothing
        End If
    Next i
End Sub
0 голосов
/ 23 ноября 2018

Показать некоторые, Показать все

enter image description here

Option Explicit

Sub FY_HIDE222()

  Const cStrRange = "C8:ZZ8"
  Const cStrText = "FY"

  Dim objWs As Worksheet
  Dim objCell As Range
  Dim vntSheets As Variant
  Dim intCounter As Integer

  vntSheets = Array("Sheet1", "Sheet2", "Sheet4")

  For intCounter = LBound(vntSheets) To UBound(vntSheets)

    Set objWs = ThisWorkbook.Worksheets(vntSheets(intCounter))

    For Each objCell In objWs.Range(cStrRange)

      If objCell.Value <> cStrText Then
        objCell.EntireColumn.Hidden = True
      End If

    Next

  Next

End Sub

У меня Excel 2003, поэтому я использовал Z8 вместо ZZ8, что очевидно в следующемизображение.

enter image description here

Sub FY_SHOW222()

  Dim objWs As Worksheet
  Dim vntSheets As Variant
  Dim intCounter As Integer

  vntSheets = Array("Sheet1", "Sheet2", "Sheet4")

  For intCounter = LBound(vntSheets) To UBound(vntSheets)

    Set objWs = ThisWorkbook.Worksheets(vntSheets(intCounter))

    objWs.Columns.EntireColumn.Hidden = False

  Next

End Sub

enter image description here

0 голосов
/ 23 ноября 2018

Чтобы все было максимально просто

Dim wsName, i As Long, c As Range
wsName = Array("Sheet1", "Sheet2", "Sheet4")

    For i = LBound(wsName) To UBound(wsName)
        For Each c In Sheets(i).Range("C8:ZZ8")
            If c.Value <> "FY" Then c.EntireColumn.Hidden = True
        Next c
    Next i
0 голосов
/ 23 ноября 2018

Переменная `sh извлекает только строковое значение, а не объект Worksheet.Попробуйте

Sub FY_HIDE222()
Dim keyCells As Range
Dim wsName As Variant
Dim ws As Worksheet
wsName = Array("Sheet1", "Sheet2", "Sheet4")
    For Each sh In wsName
        Set ws = ThisWorkbook.Sheets(sh)
        For Each keyCells In ws.Range("C8:ZZ8").Cells
            If keyCells.Value <> "FY" Then
                keyCells.EntireColumn.Hidden = True
            End If
        Next keyCells
    Next sh
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...