我正在尝试在一列单元格中搜索三个字符串之一。如果找不到三个字符串,我想复制当前整行并将其粘贴到下一个空行的新工作表中。这是我的代码,它给了我一些问题。我相信错误是我定义字符串进行比较的地方。我已经创建了新表。
Dim LastRow As Long
LastRow = Worksheets("Spiff Download Reporting").Range("E65536").End(xlUp).Row
Dim text As String
Dim text2 As String
Dim text3 As String
Dim NextRow As Integer
text = InputBox("Enter PLUS Name")
text2 = InputBox("Enter HERO Name")
text3 = InputBox("Enter Outboard Motor Plan Name")
For n = LastRow To 2 Step -1
If InStr(1, Worksheets("Spiff Download Reporting").Range(Cells(n, 6)).Value, text Or text2 Or text3, vbTextCompare = 1) = 0 Then
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
End If
Next n
答案 0 :(得分:1)
尝试更改此内容:
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。输入此为InStr
的第三个参数无效; InStr
只接受0,1或2。 vbTextCompare
是值为1的变量,vbBinaryCompare
是值为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
并按Enter键查看结果。或者模拟您对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