尝试改变这个:
If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text Or text2 Or text3, vbTextCompare = 1) = 0 Then
到:
If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text, vbTextCompare) < 1 And _
InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text2, vbTextCompare) < 1 And _
InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text3, vbTextCompare) < 1 Then
该表达式text Or text2 Or text3
会导致错误,因为它是一个逻辑运算符并Or
尝试将变量text
和视为布尔值。如果它不能将它们转换为布尔值,它会抱怨。text2
text3
此外,vbTextCompare = 1
将评估为 True,其数值为 -1。输入 this 作为第三个参数InStr
是无效的;InStr
这里只接受 0、1 或 2。vbTextCompare
是一个值为 1vbBinaryCompare
的变量, 是一个值为 0 的变量,并且vbDatabaseCompare
保持值为 2。
另外,我建议您更改以下内容:
Rows(n).EntireRow.Copy
Worksheets("Vendor Paid").Activate
NextRow = Sheets("Vendor Paid").Range("A" & Rows.Count).End(xlUp).Row + 1
Rows(NextRow).EntireRow.Select
ActiveSheet.Paste
Worksheets("Spiff Download Reporting").Activate
Rows(n).EntireRow.Delete Shift:=xlUp
到:
With Worksheets("Spiff Download Reporting")
.Rows(.Range("A:A").End(xlUp).Row+1).Value = Worksheets("Vendor Paid").rows(n).value
End With
Worksheets("Vendor Paid").Rows(n).EntireRow.Delete
请注意:我建议在代码模块的顶部使用 Option Explicit。只需直接到模块顶部并键入(在它自己的行上)Option Explicit。这意味着您不能在不首先声明变量的情况下使用变量,就像您似乎对 n 所做的那样。
顺便说一句,欢迎来到 SO :)。您的问题完全可以,但如果您执行以下操作,它将帮助您获得答案:
- 指出您的错误发生在哪一行
- 告诉我们错误信息是什么
- 尽可能多地减少代码,同时仍然重现问题(更少的人来帮助你!)
这里有很多信息,如果您有任何问题,我鼓励您在评论中提出:)。另外,使用即时窗口(编辑器中的 Ctrl+G)来评估我告诉你的一些事情。尝试输入? vbTextCompare = 1
并按回车键查看结果。或者模拟 InStr 的第二个参数:查看使用字符串? "a" Or "b" Or "c"
时会发生什么。Or
编辑
当你的错误发生时,点击调试。然后,按 ctrl+g 调出即时窗口。现在尝试输入以下几行,一次一行,然后按 Enter:
? Worksheets("Spiff Download Reporting") Is Nothing
? Cells(n, 6) Is Nothing
? Worksheets("Spiff Download Reporting").Range(Cells(n, 6)) Is Nothing
至少其中两行应该出现错误,让我知道是哪一行。
带声明
当您将主要访问代码中单个对象的方法和属性时,使用 with 语句。该对象在关键字之后指定With
。然后,您可以访问该对象的方法和属性,而无需使用它的名称。一个基本的例子:
' We are working with the Spiff Download Reporting sheet
With Worksheets("Spiff Download Reporting")
'Because we've used the With statement we don't need to
'specify the target object's name each time we access a
'property (e.g. the name) or method of that object
MsgBox(.Name)
End With
' End with is essentially stating that we are no longer
' predominantly working with the object we specified
' earlier