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 排序代码仅适用于一张纸,但不适用于多张的主要内容,如果未能解决你的问题,请参考以下文章

Outlook VBA 代码仅适用于一台计算机

用于在多张纸上循环的范围内查找最大值和最小值的 VBA 代码

自动排序不适用于一张 Google 表格中的多张表格

重定向适用于登录但不适用于注销

自定义 403 页面适用于一种环境,而不适用于另一种环境

自动旋转代码适用于 iPhone 但不适用于 iPad