首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA -防止运行时错误1004 -方法'Union‘错误时使用宏多次

VBA -防止运行时错误1004 -方法'Union‘错误时使用宏多次
EN

Stack Overflow用户
提问于 2015-07-28 16:02:57
回答 2查看 1.5K关注 0票数 1

我有一个很大的宏,它正在一个文件夹中编辑一些excel电子表格。在宏的一个阶段,我将删除电子表格中所有未使用的行,包括那些没有内容但由于格式出现在

代码语言:javascript
运行
复制
lastRow = ActiveSheet.UsedRange.Rows.Count

当我循环遍历每个电子表格的大型宏并到达代码部分时,我会遇到一个运行时错误1004 -方法'Union‘。我在'ISSUE HERE下面指出了一个错误,在这里我很难分配一个Excel.Range变量。它第一次工作,但第二次崩溃。我尝试过在循环之后将变量初始化为Null,但这不起作用。我还考虑了动态更改变量名称的可能性,但我也不确定如何做到这一点。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
   Set Temprng = Excel.Union(Temprng, .Rows(Temprow))

如果这个宏再次运行,并且变量名从Temprng更改为Temprng2,它就会工作。问题似乎是,一旦设置了变量一次,它就不能被覆盖。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-28 16:32:35

我并不是一见钟情,所以这并不能直接解决你的问题,但是你可以尝试一下:

代码语言:javascript
运行
复制
For Temprow = XlastRow To 1 Step -1
    If Application.WorksheetFunction.CountA(.Rows(Temprow)) = 0 Then
        .Rows(TempRow).Delete
    End If
Next TempRow

通过向后遍历行,您不必担心当行更改数字时,您的计数器会被弄糟。而且,由于您不必担心这一点,所以您不必使用Union

编辑:如果您只是试图得到真正的最后一行,您可以使用Find来避免所有这些,即

代码语言:javascript
运行
复制
lngLastRow = sht.Cells.Find(What:="*", After:=Cells(1, 1), LookIn:=xlFormulas, Lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row 

比起其他方法,我更喜欢这种方法,但是您可以找到更多的这里。find方法是该页面上的最后一个方法。您还可以处理LookIn参数,如果这更适合您的需要,可以将其更改为xlValues。

票数 2
EN

Stack Overflow用户

发布于 2018-04-18 00:30:29

我不确定这是否是您的问题,但我在Union操作中遇到了一个类似的问题,并发现了一个答案这里。对我来说,问题是为Union调用使用正确的上下文,即范围所在的工作表中的应用程序。所以在你的情况下:

代码语言:javascript
运行
复制
Set Temprng = Tempwks.Parent.Application.Union(Temprng, .Rows(Temprow))

而不是:

代码语言:javascript
运行
复制
Set Temprng = Excel.Union(Temprng, .Rows(Temprow))

从工作表(Tempwks.Parent)获取工作簿,从该工作簿(Tempwks.Parent.Application)获取应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31681596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档