VBA排序代码仅适用于一个工作表但不适用于多个工作表

时间:2014-11-26 06:30:22

标签: excel vba excel-vba

当我在多个工作表上运行此代码时,我得到一个"运行时错误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)to ThisWorkWorkbook.Sheets (" Sheetname")它运行正常,但是当我把它放到上面的结构中来运行多个它时它没有。这个想法是颠倒从AJ2开始到AJ的列的顺序。最后一行包含数据,AJ的长度在不同的工作表中有所不同。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您获取工作表名称的方式就是问题所在。

你开始迭代i从6到Worksheets.count ..有了这个,假设你有10张,你只会在完成之前迭代4 i。

但主要问题是你可能没有Sheets(i)的工作表名称。我是一个变量,而且,它不是一个字符串。所以你需要在放在Sheets()中的变量的另一端有一个字符串。

我认为你要完成的是使用一个名为Strings的工作表名称列表。使用变量i作为Long或Integer来迭代它们。 “我”是NUMBER和名字(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"

或您的工作表名称。然后当你打电话给Sheets时,你会使用更像这样的东西。

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