2016-01-21 6 views
2

Я пытаюсь написать макрос, который будет циклически выбирать количество листов, чтобы скрыть пустые строки на каждом листе. В столбце «A» на каждом листе содержится 1 или 0. Если это 0, я хочу скрыть строку.Excel VBA циклический выбор рабочих листов

Вот мой код, который я списал с разных сайтов. Моя самая большая проблема - знать, какие объекты мне нужно манипулировать.

enter code here 
Public Sub HideRows() 
Dim beginRow As Double 
Dim endRow As Double 
Dim ChkCol As Double 
Dim RowCnt As Double 
Dim ws As Worksheet 
Dim ArrayOne As Variant 
Dim InxW As Long 

beginRow = 10 
endRow = 185 
ChkCol = 1 

ArrayOne = Array("GB", "Adj. B", "Adj. F", "JC-Results", "PI-Results", "MK-Results", "TD-Results") 


For InxW = LBound(ArrayOne) To UBound(ArrayOne) 
    For RowCnt = beginRow To endRow 
    If Cells(RowCnt, ChkCol).Value = 0 Then 
     Cells(RowCnt, ChkCol).EntireRow.Hidden = True 
    Else 
     Cells(RowCnt, ChkCol).EntireRow.Hidden = False 
    End If 
    Next RowCnt 

Next 



End Sub 

ответ

5

Попробуйте это:

Public Sub HideRows() 
Dim beginRow As Double 
Dim endRow As Double 
Dim ChkCol As Double 
Dim RowCnt As Double 
Dim ws As Worksheet 
Dim ArrayOne As Variant 
Dim InxW As Long 

Application.ScreenUpdating = False 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

beginRow = 10 
endRow = 185 
ChkCol = 1 

ArrayOne = Array("GB", "Adj. B", "Adj. F", "JC-Results", "PI-Results", "MK-Results", "TD-Results") 


For InxW = LBound(ArrayOne) To UBound(ArrayOne) 
    With Sheets(ArrayOne(InxW)) 
     For RowCnt = beginRow To endRow 
      If .Cells(RowCnt, ChkCol).Value = 0 Then 
       .Rows(RowCnt).Hidden = True 
      Else 
       .Rows(RowCnt).Hidden = False 
      End If 
     Next RowCnt 
    End With 

Next InxW 

Application.ScreenUpdating = True 
Application.EnableEvents = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 

Основная проблема заключается в том, что вы не говорите Excel, который листа для поиска, так что она ищет только активного листа, как в начале кода.

Поместив все в блок With и используя . перед всеми объектами диапазона, вы узнаете, какой лист использовать.

Также поворот вычислений, обновление экрана и выключение событий поможет ускорить выполнение кода, поскольку он не будет останавливаться на этом.

+1

Есть ли термин для использования '.' при использовании' With'? Я всегда задавался вопросом, к чему это относится, когда вы используете десятичный знак как «заполнитель» для 'With [whatever]'. – BruceWayne

+2

@BruceWayne Когда я вводил объяснение, я задавался вопросом о том же. –

+2

Хм, я просто начну говорить: «Вам нужно закрепить свое заявление« С »с периодом». Это звучит хорошо, а? – BruceWayne

1

AutoFilter method быстрая работа над этим. Отказ от скрытия выпадающих меню будет точно имитировать скрытие строк, а также добавление дополнительных методов их скрытия.

Public Sub HideRows() 
    Dim beginRow As Long, endRow As Long, chkCol As Long 
    Dim ndx As Long, arrOne As Variant 

    Application.ScreenUpdating = False 

    beginRow = 10 
    endRow = 185 
    chkCol = 1 
    arrOne = Array("sheet1", "GB", "Adj. B", "Adj. F", "JC-Results", _ 
        "PI-Results", "MK-Results", "TD-Results") 

    For ndx = LBound(arrOne) To UBound(arrOne) 
     With Worksheets(arrOne(ndx)) 
      If .AutoFilterMode Then .AutoFilterMode = False 
      With .Cells(beginRow - 1, chkCol).Resize(endRow - beginRow + 2, 1) 
       .Columns(1).AutoFilter Field:=1, Criteria1:="<>0", _ 
              VisibleDropDown:=False 
       Debug.Print .Address 
      End With 
     End With 
    Next ndx 

    Application.ScreenUpdating = True 

End Sub 

Там не было никакого обсуждения на бланках, но которые могут быть легко добавлены в Criteria2 с XlAutoFilterOperator из xlOr.

Смежные вопросы