Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 运行时错误';1004';:,方法';相交';对象的'_全球';失败_Excel_Vba - Fatal编程技术网

Excel 运行时错误';1004';:,方法';相交';对象的'_全球';失败

Excel 运行时错误';1004';:,方法';相交';对象的'_全球';失败,excel,vba,Excel,Vba,如果我不在脚本要运行的页面上,我会遇到运行时错误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 =

如果我不在脚本要运行的页面上,我会遇到运行时错误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
选项显式
子采购订单跟踪()
将wsPOD设置为工作表
将wsPOT设置为工作表
将wsPOA设置为工作表
暗淡的cel As范围
昏暗的最后一排一样长,我一样长,呃一样长
设置wsPOD=工作表(“采购订单数据”)
设置wsPOT=工作表(“订单跟踪”)
设置wsPOA=工作表(“PO存档”)
应用
.ScreenUpdate=False
.DisplayAlerts=False
.EnableEvents=False
.Calculation=xlCalculationManual
以
使用wsPOD
'首先使F:G列与它们的行匹配
对于相交中的每个单元格(.UsedRange、.UsedRange.Offset(5)、.Columns(6))
如果cel=vbNullString和cel.Offset(,-2)vbNullString,则
.范围(单元格偏移量(1),单元格偏移量(1,1))。复制单元格
单元偏移量(1).EntireRow.Delete
如果结束
下一个
'现在填写A:D列以匹配采购订单日期和采购订单#
对于相交中的每个单元格(.UsedRange、.UsedRange.Offset(5)、.Columns(1))
如果cel=vbNullString和cel.Offset(,5)vbNullString,则
.范围(单元格偏移(-1),单元格偏移(-1,3))。复制单元格
如果结束
下一个
“吹走无用的行
lastrow=wsPOD.Range(“A6”).End(xlDown).Row
wsPOD.Range(“M5:P5”)。复制wsPOD.Range(“M6:P”和lastrow)
算计
带Intersect(wsPOD.UsedRange、ActiveSheet.Columns(“N”))
.自动筛选1,“不同”
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
以
带Intersect(wsPOD.UsedRange、ActiveSheet.Columns(“P”))
.AutoFilter 1,“已满”
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
以
wsPOD.UsedRange.Copy Sheets.Add.Range(“A1”)
'转移到新工作表之前的最终调整。
使用ActiveSheet
.AutoFilterMode=False
相交(.UsedRange、.Columns(“A”)).Cut.Range(“Q1”)
相交(.UsedRange,.Columns(“D”)).Cut.Range(“R1”)
相交(.UsedRange、.Columns(“C”)).Cut.Range(“S1”)
相交(.UsedRange,.Columns(“B”)).Cut.Range(“T1”)
相交(.UsedRange、.Columns(“G”)).Cut.Range(“U1”)
相交(.UsedRange,.Columns(“F”)).Cut.Range(“V1”)
相交(.UsedRange,.Range(“Q:V”))。复制wsPOT.Cells(Rows.Count,“B”)。结束(xlUp)。偏移量(1)
.删除
以
lastrow=wsPOD.Cells(Rows.Count,“B”).End(xlUp).Row
wsPOT.Range(“R1:X1”)。复制
wsPOT.Range(“B3:H”和lastrow).paste特殊XLPaste格式
wsPOT.Range(“N2:O2”)。复制wsPOT.Range(“N3:O”和lastrow)
wsPOT.Range(“P1:Q1”)。复制wsPOT.Range(“I3:J”和lastrow)
wsPOT.Range(“K3:K”和lastrow).Borders.Weight=xlThin
以
Application.CutCopyMode=False
端接头
错误在这里:

**With Intersect(wsPOD.UsedRange, ActiveSheet.Columns("N"))**
    .AutoFilter 1, "<>Different"
    .SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
**带Intersect(wsPOD.UsedRange、ActiveSheet.Columns(“N”))**
.自动筛选1,“不同”
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
以

两张图纸上的范围不能相交,因此如果ActiveSheet不是wsPOD,则

带Intersect(wsPOD.UsedRange、ActiveSheet.Columns(“N”))

从定义上讲,它必须失败


编辑。。。请参阅@SiddharthRout的评论以了解修复方法。

有关错误的原因,请参阅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
在使用前,通常最好先验证
交叉
离子

  • 为避免错误,必须检查工作表是否相等(
    myRange.Parent
    ),如下所示:

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


  • Activesheet应该是哪张?“采购订单数据”?运行脚本的工作表是采购订单跟踪,该脚本用于从采购订单数据中获取其数据,对其进行组织,然后在采购订单跟踪时输出。将
    Activesheet
    替换为
    wsPOD
    。所以它变成了Intersect(wsPOD.UsedRange,wsPOD.Columns(“N”))的
    现在它可以从任何工作表上运行。谢谢,我曾经这样想,但不知道怎么说:)我甚至会补充说,VBA的一个很好的做法是将所有工作表引用设置为变量,远离ActiveSheet,除非绝对必要。这样,您就可以随时知道并控制正在与哪个工作表交互。注意:
    rng1.Parent.Name=rng2.Parent.Name
    可以是
    True
    (并导致后续的
    Intersect
    s 1004错误)用于不同打开工作簿中类似的命名工作表!最好像我在回答中那样比较父对象/图纸本身:
    if Not Intersect( ws1.Range("A1:A2"), ws1.Range("A2:B2") ) Is Nothing then _
       '... your conditional code here ...