VBA - 防止运行时错误 1004 - 多次使用宏时出现方法“Union”错误

问题描述 投票:0回答:3

我有一个大型宏,正在编辑文件夹中的多个 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,它就会起作用。问题似乎是一旦变量被设置一次,它就不能被覆盖。

vba excel
3个回答
2
投票

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(如果这更适合您的需求)。


0
投票
here

找到了答案。对我来说,问题是使用联盟调用的正确上下文,即范围所在工作表中的应用程序。所以在你的情况下: 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) 获取应用程序。


0
投票

将 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 错误。

© www.soinside.com 2019 - 2024. All rights reserved.