在单元循环中搜索三个字符串

时间:2013-02-26 23:18:01

标签: excel-vba vba excel

我正在尝试在一列单元格中搜索三个字符串之一。如果找不到三个字符串,我想复制当前整行并将其粘贴到下一个空行的新工作表中。这是我的代码,它给了我一些问题。我相信错误是我定义字符串进行比较的地方。我已经创建了新表。

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

1 个答案:

答案 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是一个逻辑运算符,并尝试将变量texttext2text3视为布尔值。如果它不能将它们变成布尔值,它会抱怨。

此外,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,顺便说一下:)。您的问题完全没问题,但如果您执行以下操作,它将帮助您获得答案:

  1. 指明错误发生在
  2. 上的哪一行
  3. 告诉我们错误消息是什么
  4. 尽可能地减少代码,同时仍然可以重现问题(人们可以帮助您做的更少!)
  5. 这里有很多信息,如果您有任何问题我鼓励您在评论中提问:)。另外,使用立即窗口(编辑器中的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