Excel VBA格式化为表格,然后更改所有表格的方向

我试图让下面的代码为只有数据的列创build一个表格,并为工作簿中的每个工作表创build一个表格,然后在将所有工作表的方向更改为横向之后,但是它做了两件奇怪的事情:

  1. 不循环表单。

  2. 将所有列放入表中,而不仅仅是具有数据的列。

可以这样做只查找数据列并将其格式化为表格?

Sub Format_As_Table() Dim tbl As ListObject Dim rng As Range Dim sh As Worksheet For Each sh In ThisWorkbook.Sheets Set rng = Range(Range("A1"), Range("A1").SpecialCells(xlLastCell)) Set tbl = ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes) tbl.TableStyle = "TableStyleMedium15" Next sh Application.ScreenUpdating = False Call Orientation End Sub '====================================================================== Sub Orientation() Dim sh As Worksheet For Each sh In ThisWorkbook.Sheets With ActiveSheet.PageSetup .Orientation = xlLandscape End With Next sh Application.ScreenUpdating = False End Sub 

您可以将两个Sub组合成一个。

您的原始代码循环遍历表单,但下面的对象不完全符合循环的当前sh 。 相反,他们引用了ActiveSheet ,当你运行这个代码时,无论表单是活动的。

一旦添加了With sh ,并在下面用一个嵌套对象. 作为前缀,所有对象都将完全符合sh 。 例如:

 Set Rng = .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)) 

注意 :使用SpecialCells(xlLastCell)获取最后一个单元格可能不是最可靠的方法。 在这里阅读不同的方法和优势。

 Option Explicit Sub Format_As_Table_and_Orientation() Dim Tbl As ListObject Dim Rng As Range Dim sh As Worksheet Application.ScreenUpdating = False For Each sh In ThisWorkbook.Sheets With sh Set Rng = .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)) Set Tbl = .ListObjects.Add(xlSrcRange, Rng, , xlYes) Tbl.TableStyle = "TableStyleMedium15" .PageSetup.Orientation = xlLandscape End With Next sh Application.ScreenUpdating = True End Sub