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