VBA 排序代码仅适用于一张纸,但不适用于多张
Posted
技术标签:
【中文标题】VBA 排序代码仅适用于一张纸,但不适用于多张【英文标题】:VBA sort code works for one sheet only but not multiple ones 【发布时间】:2014-11-26 06:30:21 【问题描述】:当我在多张工作表上运行此代码时,我收到“运行时错误 1004:排序引用无效。确保它在您要排序的数据内,并且第一个排序依据框不在相同或空白”:
Dim i As Long
For i = 6 To Worksheets.Count
'more code here
Dim ranged As range
Dim lRow As Long
With ThisWorkbook.Sheets(i)
lRow = .range("AJ" & .Rows.Count).End(xlUp).Row
Set ranged = .range("AJ2:AJ" & lRow)
.Sort.SortFields.Add Key:=ranged, _
SortOn:=xlSortOnValues, _
Order:=xlDescending, _
DataOption:=xlSortNormal
With .Sort
.SetRange ranged
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
'more code here
next i
我不确定为什么这不起作用,但特别令人困惑的是,当我尝试仅通过将 With ThisWorkbook.Sheets(i) 更改为 With ThisWorkbook.Sheets("Sheetname" (在不同的工作表中是不同的。有什么想法吗?
【问题讨论】:
先尝试清除排序字段。 【参考方案1】:您获取工作表名称的方式是问题所在。
您开始将 i 从 6 迭代到 Worksheets.count.. 有了这个,假设您有 10 张工作表,在完成之前您只会迭代 4 个 i。
但主要问题是您可能没有 Sheets(i) 的工作表名称。 i 在这里是一个变量,而且它不是一个字符串。因此,您需要在放置在 Sheets() 中的变量的另一端有一个字符串。
我认为您要完成的是使用字符串的工作表名称列表。使用变量 i 作为 Long 或 Integer 来遍历它们。 “i”是数字,name(i) 是字符串。 '这个例子假设你有 6 张纸。用你的初始变量声明在顶部声明它。
Dim name(1 to 6) As String
name(1) = "Sheet1"
name(2) = "TotalSales"
name(3) = "MonthlyRevenue"
name(4) = "Sheet 4 Name"
name(5) = "Whatever This sheet is called"
name(6) = "Last Sheet Name"
或任何您的工作表名称。然后,当您调用表格时,您将使用更多类似的东西。
For i = 1 to 6
'YOUR CODE THAT YOU ALREADY ENTERED THAT WORKS WHEN THE SHEET NAME IS CORRECT
With ThisWorkbook.Sheets(name(i))
Next i
【讨论】:
以上是关于VBA 排序代码仅适用于一张纸,但不适用于多张的主要内容,如果未能解决你的问题,请参考以下文章