通常の手筋
ふつうはLastRowから行きます。
適当に書くと
Dim iRow , LastRow
LastRow = ActiveSheet.UsedRange.Rows.Count
For iRow = LastRow To 1 Step -1
If Rows(iRow).Hidden Then Rows(iRow).Delete
Next
しかし
最終行の下にさらに隠し行がある場合、単純に削除ができない場合があることが発生
そこで
ubara先生のサイトを参考に作ったのが以下のもの
Dim iRow As Long
Activesheet.Activate ' 目的のシートを表示させる(つまり選択する)
For iRow = Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row To Cells.SpecialCells(xlCellTypeLastCell).Row Step -1
If Rows(iRow).Hidden Then Rows(iRow).Delete
Next
Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
でとにかく何らかの入力がある最終セルの行数を取得。これは隠し行でもカウントする...(1)
Cells.SpecialCells(xlCellTypeLastCell).Row
は表示されているセルの最終行をとる...(2)
(1)が(2)より大きい(つまり必ず隠し行が発生する)場合(2)から(1)まで減算し、隠し行なら削除する。
また、この方式は1シートに表が複数あるとうまくいかない可能性があります。