当我在多个工作表上运行此代码时,我得到一个"运行时错误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的长度在不同的工作表中有所不同。有什么想法吗?
答案 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