【发布时间】:2021-09-19 02:44:18
【问题描述】:
我正在从几个工作表创建一个数组,并使用 For Each 循环访问它们。通过这种方法我已经完成了很多工作,最后一个小任务是对工作表上的表格进行排序。 有人可以帮我理解为什么这段代码不起作用,是否有可能实现这一点,或者我做错了什么? 如果我直接使用工作表 CodeName(例如 Sheet1)一切正常。对于循环中的大部分任务,我仅使用 sh 变量来引用工作表的 CodeName,并且仅在少数情况下,如果 sh 不工作,则 sh.CodeName 正在完成这项工作,但不适用于此任务。 Watches 窗口显示如下:
sh 是类型 Variant/Object/Sheet1 sh.CodeName 是 Variant/String 类型,值为 "Sheet1"
提前高度感谢任何帮助。
Sub test()
' Create array from all worksheets using the Code Names
Dim arr As Variant
arr = Array(Sheet1, Sheet2, Sheet3, Sheet4, Sheet5, Sheet6, Sheet7)
Dim sh As Variant
Dim Table As String
' Loop trough the sheets
For Each sh In arr
' Table 1 of Sheet1 and so on...
Table = "Table " & Right(sh.CodeName, 1)
sh.ListObjects(Table).Sort. _
SortFields.Clear
sh.ListObjects(Table).Sort. _
SortFields.add key:=Range(Table & "[[#All],[ID]]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With sh.ListObjects(Table). _
Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next sh
End Sub
【问题讨论】:
-
如果我设置表格以匹配您的代码,您的代码就可以工作。我注意到您在表名称中包含一个空格。这不是默认命名。因此,除非您自己更改了表名,否则工作表上不会有这些名称的表。
-
如果每张纸上只有一张桌子,使用
sh.ListObjects(1)而不是sh.ListObjects(Table)会更可靠 -
stackoverflow.com/users/445425/chris-neilsen - 你是对的,这只是发布代码时的拼写错误。我把代码手动听到为了使用更友好的名字。
-
谢谢克里斯尼尔森。我会试试看 - 看起来更干净,更有意义。