【问题标题】:Runtime Error '1004':, Method 'Intersect' of object '_Global' failed运行时错误“1004”:对象“_Global”的方法“相交”失败
【发布时间】:2019-05-25 16:34:33
【问题描述】:

如果我不在要运行脚本的同一页面上,我会收到运行时错误 1004,我想知道为什么...

这里是代码。

Option Explicit

Sub PO_Tracking()

Dim wsPOD As Worksheet
Dim wsPOT As Worksheet
Dim wsPOA As Worksheet
Dim cel As Range
Dim lastrow As Long, i As Long, Er As Long

Set wsPOD = Sheets("PO Data")
Set wsPOT = Sheets("PO Tracking")
Set wsPOA = Sheets("PO Archive")

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With

With wsPOD
    'first bring columns F:G up to match their line
    For Each cel In Intersect(.UsedRange, .UsedRange.Offset(5), .Columns(6))

        If cel = vbNullString And cel.Offset(, -2) <> vbNullString Then
            .Range(cel.Offset(1), cel.Offset(1, 1)).Copy cel
            cel.Offset(1).EntireRow.Delete
        End If

    Next

    'now fil columns A:D to match PO Date and PO#
    For Each cel In Intersect(.UsedRange, .UsedRange.Offset(5), .Columns(1))

        If cel = vbNullString And cel.Offset(, 5) <> vbNullString Then
            .Range(cel.Offset(-1), cel.Offset(-1, 3)).Copy cel
        End If
    Next

'Blow away rows that are useless
    lastrow = wsPOD.Range("A6").End(xlDown).Row
    wsPOD.Range("M5:P5").Copy wsPOD.Range("M6:P" & lastrow)
    Calculate

    With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))
        .AutoFilter 1, "<>Different"
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With

    With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("P"))
        .AutoFilter 1, "<>Full"
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End With
    wsPOD.UsedRange.Copy Sheets.Add.Range("A1")


'Final Adjustments before transfering over to new sheet.
    With ActiveSheet
        .AutoFilterMode = False
        Intersect(.UsedRange, .Columns("A")).Cut .Range("Q1")
        Intersect(.UsedRange, .Columns("D")).Cut .Range("R1")
        Intersect(.UsedRange, .Columns("C")).Cut .Range("S1")
        Intersect(.UsedRange, .Columns("B")).Cut .Range("T1")
        Intersect(.UsedRange, .Columns("G")).Cut .Range("U1")
        Intersect(.UsedRange, .Columns("F")).Cut .Range("V1")
        Intersect(.UsedRange, .Range("Q:V")).Copy wsPOT.Cells(Rows.Count, "B").End(xlUp).Offset(1)
        .Delete
    End With

    lastrow = wsPOD.Cells(Rows.Count, "B").End(xlUp).Row
    wsPOT.Range("R1:X1").Copy
    wsPOT.Range("B3:H" & lastrow).PasteSpecial xlPasteFormats
    wsPOT.Range("N2:O2").Copy wsPOT.Range("N3:O" & lastrow)
    wsPOT.Range("P1:Q1").Copy wsPOT.Range("I3:J" & lastrow)
    wsPOT.Range("K3:K" & lastrow).Borders.Weight = xlThin
End With



Application.CutCopyMode = False

End Sub

错误在这里:

**With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))**
    .AutoFilter 1, "<>Different"
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With

【问题讨论】:

  • Activesheet 应该是哪个表? “采购订单数据”?
  • 运行该脚本的工作表是 PO Tracking,该脚本旨在从 PO Data 中获取其数据,对其进行组织,然后将其输出到 PO 跟踪。
  • Activesheet 替换为wsPOD。所以它变成了With Intersect(wsPOD.UsedRange, wsPOD.Columns("N")) 现在它将从任何工作表运行
  • 谢谢,我在想类似的事情,但不知道如何表达:)

标签: excel vba


【解决方案1】:

你不能在两张纸上有一个范围的交集,所以如果 ActiveSheet 不是 wsPOD,那么

With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))

根据定义必须失败。

编辑 ... 并查看 @SiddharthRout 的修复评论。

【讨论】:

  • 我什至要补充一点,将所有工作表引用设置为变量并远离 ActiveSheet 是一种很好的 VBA 实践,除非绝对必要。这样一来,您始终知道并控制您正在与哪个工作表进行交互。
【解决方案2】:

为什么会出错,请参阅 Doug Glancy 的回答。

另外,对于如何避免,使用类似

Dim rng1 As Range, rng2 As Range
Set rng1 = wsPOD.UsedRange
Set rng2 = ActiveSheet.Columns("N")
If (rng1.Parent.Name = rng2.Parent.Name) Then
    Dim ints As Range
    Set ints = Intersect(rng1, rng2)
    If (Not (ints Is Nothing)) Then
        With ints
            ' Do your job
        End With
    End If
End If

在使用之前验证Intersection 通常是一种很好的做法。

【讨论】:

  • 警告:rng1.Parent.Name = rng2.Parent.Name 可以是True(并导致后续Intersects 1004 错误),用于不同打开的工作簿中的同名工作表!最好像我在回答中那样比较父对象/工作表本身:stackoverflow.com/a/56303096/1915920
【解决方案3】:
  1. 为了避免错误,必须像这样检查工作表是否相等 (myRange.Parent):

    if rng1.Parent is rng2.Parent then if Not Intersect( rng1, rng2 ) Is Nothing then _
        '... your conditional code here ...
    
    • 提示:这里要注意的重要一点是,您不能将这两个条件与... And ... 联系起来,因为 VBA 会评估所有条件并且在评估第一个条件后不会停止,即使它是 False :-/李>
  2. 或确保范围的工作表相同(例如ws1),意味着明确指定/创建/相交您的Range 对象,类似于此):

    if Not Intersect( ws1.Range("A1:A2"), ws1.Range("A2:B2") ) Is Nothing then _
       '... your conditional code here ...
    

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多