Vba 使用Sheets.Range.Offset的行上的应用程序或对象定义错误

Vba 使用Sheets.Range.Offset的行上的应用程序或对象定义错误,vba,excel,Vba,Excel,我是个新手。我有一个excel文件,其中有10张表,6张表以6名员工的名字命名,接下来的3张表带有一些信息(与我的代码无关),第10张表名为Temp 员工表的每一列都有以下数据(D&E为空): 我想在名为Temp的工作表中整理所有这些数据,如下所示: | A | B | C | D | | 17-Sep-13 | Project A | 6 | foo | | 18-Sep-13 | Project A | 7 | foo | | 18-Sep-13 | Pr

我是个新手。我有一个excel文件,其中有10张表,6张表以6名员工的名字命名,接下来的3张表带有一些信息(与我的代码无关),第10张表名为Temp

员工表的每一列都有以下数据(D&E为空):

我想在名为Temp的工作表中整理所有这些数据,如下所示:

| A         | B         | C | D   |
| 17-Sep-13 | Project A | 6 | foo |
| 18-Sep-13 | Project A | 7 | foo |
| 18-Sep-13 | Project B | 1 | foo |
| 17-Sep-13 | Project A | 6 | bar |
| 18-Sep-13 | Project A | 7 | bar |
| 18-Sep-13 | Project B | 1 | bar |
下面是我的代码:

Sub ListRelevantEntries()
  Dim s As Integer
  Dim C As Range

  For s = 1 To Worksheets.Count - 4  
    If Sheets(s).Cells(Rows.Count, "F").End(xlUp) _
          .Value = "Report last updated on this day" Then
      'Execution stops on the below line with an
      ' "Application-defined or object defined error"
      Sheets(s).Range(Cells(Rows.Count, "F").End(xlUp) _
          .Offset(1, 0), Cells(Rows.Count, _ "A").End(xlUp)) _
          .Copy(Sheets("Temp").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0))

      Sheets("Temp").Select
      Sheets("Temp").Cells(Rows.Count, "C").End(xlUp).Offset(0, 1).Select
      For Each C In Sheets("Temp").Range(Cells(Rows.Count,"C").End(xlUp). _
        Offset(0, 1), Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)).Cells
        C = Sheets(s).Name
      Next
    ElseIf Not Sheets(s).Cells(Rows.Count, "F").End(xlUp) _
          .Value = "Report last updated on this day" _
          And Not Sheets(s).Cells(Rows.Count, "F").End(xlUp).Value = "" Then
  MsgBox "Extra Words entered " & ActiveSheet.Cells(Rows.Count, "F") _
      .End(xlUp).Offset(1, 0).Value & " in " & Sheets(s).Name
    End If
  Next

  Sheets("Temp").Range("1:1").Delete  
End Sub

很抱歉问这么长的问题。我想不出其他解释的方法了

替换为类似

With Sheets(s)
        .Range(.Cells(.Rows.Count, "F").End(xlUp).Offset(1, 0), .Cells(.Rows.Count, "A").End(xlUp)).Copy Sheets("Temp").Cells(Sheets("Temp").Rows.Count, "A").End(xlUp).Offset(1, 0)
End With

由于未返回对工作表的引用,因此出现错误。 快速修复方法是添加以下内容:

Sheets(s).Select
第6行之前或第4行之后

但为了更好地编码,请尝试使用中的内容。

该链接讨论了如何通过声明和设置所有对象来避免使用select。

如果清理代码,错误会容易得多。在开始处添加工作表变量

Dim ws As Worksheet
然后在第一个For语句之后,将目标工作表分配给它

  Set ws = Worksheets(s)
请注意,我使用了
工作表
而不是
工作表
。它们是不同的,不要把它们混在一起。
Sheets
集合可以包括图表和工作表,它代表每个选项卡。“工作表”集合仅包含工作表对象。在
For
循环中,您使用了
工作表
,然后在循环中使用了
工作表
。如果工作簿中有任何图表,此操作将中断

好的,现在您有了这个
ws
变量,其中包含对工作表的引用,继续并在for循环的主体内将所有
sheet
替换为
ws
。在执行此操作时,修复对
单元格
的所有调用。无论您在哪里编写类似
ws.Range(单元格(1,“F”))
的内容,您都在犯错误
Cells
单独指向
ActiveSheet.Cells
您想要的位置
ws.Cells
。否则,您将尝试在
ws
不是
ActiveSheet
的任何时候创建跨工作表范围。范围的其他属性也是如此,例如
。因此,现在您要停止的代码行应该更像这样:

ws.Range(ws.Cells(ws.Rows.Count, "F").End(xlUp) _
      .Offset(1, 0), ws.Cells(ws.Rows.Count, "A").End(xlUp)) _
      .Copy Sheets("Temp").Cells(Sheets("Temp").Rows.Count, "A") _
      .End(xlUp).Offset(1, 0)
注意,我还删除了传递给
.Copy
的参数周围的括号。在VBA中,除非返回值,否则调用不带括号的方法。因此
MyMethod“要通过的值”
result=MyMethod(“要通过的值”)
但不是
MyMethod(“要通过的值”)

修复所有这些之后,如果仍然产生错误,我建议使用调试器。打开手表窗口,开始将有问题的线路分成几段,检查它们,并找出问题所在

因此,首先您可以为
ws
创建一个手表,并确保它是正确的表。然后可能会将该监视编辑为
ws.Cells(ws.Rows.Count,“F”).End(xlUp)
,然后查看是否得到了正确的单元格


哦,还有,如果你做得很好,你不需要调用任何类似
工作表的东西。选择
。激活
。事实上,建议您在绝大多数情况下避免这些操作,除非您通过更改用户的视图与用户交互。

单元格默认情况下,没有工作表限定符的单元格指的是活动工作表,因此您应该始终使用类似(例如)
工作表的单元格(…
@TimWilliams会记住这一点。谢谢分享。@AndASM誓言这是一个令人惊讶的答案,不仅消除了我的疑虑,让我的代码发挥了作用,还教会了我很多。非常感谢。我希望在我知识渊博的时候能够帮助像我这样的人:)再次感谢您。感谢您的回答。我的代码与上面AndASM的答案一致。但是,您的回答帮助我注意到with语句的用法。谢谢。通过您提供的链接。非常有用。非常感谢!
ws.Range(ws.Cells(ws.Rows.Count, "F").End(xlUp) _
      .Offset(1, 0), ws.Cells(ws.Rows.Count, "A").End(xlUp)) _
      .Copy Sheets("Temp").Cells(Sheets("Temp").Rows.Count, "A") _
      .End(xlUp).Offset(1, 0)