我有一个很大的宏,它正在一个文件夹中编辑一些excel电子表格。在宏的一个阶段,我将删除电子表格中所有未使用的行,包括那些没有内容但由于格式出现在
lastRow = ActiveSheet.UsedRange.Rows.Count当我循环遍历每个电子表格的大型宏并到达代码部分时,我会遇到一个运行时错误1004 -方法'Union‘。我在'ISSUE HERE下面指出了一个错误,在这里我很难分配一个Excel.Range变量。它第一次工作,但第二次崩溃。我尝试过在循环之后将变量初始化为Null,但这不起作用。我还考虑了动态更改变量名称的可能性,但我也不确定如何做到这一点。
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编辑--只是为了确认,这段代码的功能没有什么问题,它做了所需的事情,只是当我多次运行它时,它会在下面的特定行中产生运行时的错误1004。
Set Temprng = Excel.Union(Temprng, .Rows(Temprow))如果这个宏再次运行,并且变量名从Temprng更改为Temprng2,它就会工作。问题似乎是,一旦设置了变量一次,它就不能被覆盖。
发布于 2015-07-28 16:32:35
我并不是一见钟情,所以这并不能直接解决你的问题,但是你可以尝试一下:
For Temprow = XlastRow To 1 Step -1
If Application.WorksheetFunction.CountA(.Rows(Temprow)) = 0 Then
.Rows(TempRow).Delete
End If
Next TempRow通过向后遍历行,您不必担心当行更改数字时,您的计数器会被弄糟。而且,由于您不必担心这一点,所以您不必使用Union。
编辑:如果您只是试图得到真正的最后一行,您可以使用Find来避免所有这些,即
lngLastRow = sht.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, Lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row 比起其他方法,我更喜欢这种方法,但是您可以找到更多的这里。find方法是该页面上的最后一个方法。您还可以处理LookIn参数,如果这更适合您的需要,可以将其更改为xlValues。
发布于 2018-04-18 00:30:29
我不确定这是否是您的问题,但我在Union操作中遇到了一个类似的问题,并发现了一个答案这里。对我来说,问题是为Union调用使用正确的上下文,即范围所在的工作表中的应用程序。所以在你的情况下:
Set Temprng = Tempwks.Parent.Application.Union(Temprng, .Rows(Temprow))而不是:
Set Temprng = Excel.Union(Temprng, .Rows(Temprow))从工作表(Tempwks.Parent)获取工作簿,从该工作簿(Tempwks.Parent.Application)获取应用程序。
https://stackoverflow.com/questions/31681596
复制相似问题