VBA – 防止运行时错误1004 – 使用macros多次的方法“联合”错误

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

lastRow = ActiveSheet.UsedRange.Rows.Count 

当我循环遍历每个电子表格的大macros,并到达代码段时,遇到运行时错误1004 – 方法“联合”。 我已经在'ISSUE HERE下面指出了我在分配Excel.Rangevariables时遇到的困难。 它第一次工作,但第二次崩溃。 我已经尝试初始化variables作为空循环之后,但是这是行不通的。 我也考虑过dynamic改变variables名称的可能性,但我不知道该怎么做。

 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 

编辑 – 只是为了确认,这段代码的function没有任何问题,它是做什么的,只是当我多次运行它时,会在下面的特定行中出现运行时错误1004。

  Set Temprng = Excel.Union(Temprng, .Rows(Temprow)) 

如果这个macros再次运行,并且variables名称从Temprng更改为Temprng2,它将工作。 这个问题似乎是,一旦variables被设置一次,它不能被覆盖。

我没有看到它的权利,所以这不直接解决你的问题,但你可以尝试这个,而不是:

 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更多。 find方法是该页面上的最后一个。 如果您更好地满足您的需求,您也可以混淆LookIn参数并将其更改为xlValues。