1

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

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
4

1 回答 1

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和视为布尔值。如果它不能将它们转换为布尔值,它会抱怨。text2text3

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

  1. 指出您的错误发生在哪一行
  2. 告诉我们错误信息是什么
  3. 尽可能多地减少代码,同时仍然重现问题(更少的人来帮助你!)

这里有很多信息,如果您有任何问题,我鼓励您在评论中提出:)。另外,使用即时窗口(编辑器中的 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
于 2013-02-26T23:38:20.850 回答