我有一个大型宏,正在编辑文件夹中的多个 Excel 电子表格。在宏的一个阶段,我删除电子表格上任何未使用的行,包括那些没有内容的行,但由于格式出现在
中lastRow = ActiveSheet.UsedRange.Rows.Count
当我循环遍历每个电子表格的大宏并到达代码部分时,我遇到运行时错误 1004 - 方法“Union”。我在下面指出了错误,我在分配 Excel.Range 变量时遇到困难。它第一次工作,但第二次就崩溃了。我尝试在循环后将变量初始化为 Null,但这不起作用。我还考虑了动态更改变量名称的可能性,但我也不知道如何做到这一点。
'ISSUE HERE
编辑 - 只是为了确认,这段代码的功能没有任何问题,它执行了所需的操作,只是当我多次运行它时,它在以下特定行上出现运行时错误 1004。
Dim Tempwks As Excel.Worksheet
Dim Temprng As Excel.Range
Dim Temprow As Long
Dim XlastRow As Long
''''''''''''''''
Set Tempwks = Excel.ActiveSheet
XlastRow = lastRow
With Tempwks
For Temprow = 1 To XlastRow
If Application.WorksheetFunction.CountA(.Rows(Temprow)) = 0 Then
If Temprng Is Nothing Then
Set Temprng = .Rows(Temprow)
Else
' ISSUE HERE
Set Temprng = Excel.Union(Temprng, .Rows(Temprow))
End If
End If
Next Temprow
End With
If Not Temprng Is Nothing Then
Call Temprng.EntireRow.Delete
End If
如果这个宏再次运行并且变量名称从 Temprng 更改为 Temprng2,它就会起作用。问题似乎是一旦变量被设置一次,它就不能被覆盖。
Set Temprng = Excel.Union(Temprng, .Rows(Temprow))
通过向后浏览各行,您不必担心随着行数字的变化而弄乱计数器。由于您不必担心这一点,因此您不必使用
For Temprow = XlastRow To 1 Step -1
If Application.WorksheetFunction.CountA(.Rows(Temprow)) = 0 Then
.Rows(TempRow).Delete
End If
Next TempRow
。
编辑:如果您只是想获得真实的最后一行,您可以使用
Union
来避免所有这些,即
Find
与其他方法相比,我更喜欢这种方法,但您可以在这里
找到更多信息。 find 方法是该页面上的最后一个方法。您还可以修改 LookIn 参数并将其更改为 xlValues(如果这更适合您的需求)。
找到了答案。对我来说,问题是使用联盟调用的正确上下文,即范围所在工作表中的应用程序。所以在你的情况下:
lngLastRow = sht.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, Lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
代替:
Set Temprng = Tempwks.Parent.Application.Union(Temprng, .Rows(Temprow))
从工作表 (Tempwks.Parent) 获取工作簿并从该工作簿 (Tempwks.Parent.Application) 获取应用程序。
将 xls 调暗为 Excel.Application 调暗 wsh 作为工作表 暗淡图表 调暗 rng1 作为范围 调暗 rng2 作为范围 将 rng3 调暗为范围
''''设置范围并创建图表对象的代码....
cht.SetSourceDate 源:=范围(xls.UNION(rng1, rng2, rng3).Address))
更正:
cht.SetSourceDate 源:=wsh.Range(xls.UNION(rng1, rng2, rng3).Address))
您必须小心使用默认对象语法的宏记录器生成的代码。让你的代码明确以避免 1004 错误。