"如果不是instr"不像我认为应该在vba

时间:2015-04-24 12:15:15

标签: excel vba excel-vba

我有一张包含合同列表的表单,其中包含供应商名称列和一个结束日期列表,我想要做的是将所有通过日期设置为红色,除非合同来自特定供应商。 我以前使用InStr来检查一个单元格是否有一个字符串,所以因为我刚刚开始使用vba我想在循环中插入以下内容

If Not InStr(LCase(Data.Cells(i, 4).Value), "flowserve") Then
    If CDate(Data.Cells(i, "h").Value) < Date Then _
        Data.Cells(i, "h").Font.Color = -16776961
End If

期望它会为没有&#34; flowserve&#34;的合同的合格日期着色。在供应商名称中。但相反,它似乎只是为所有传递的日期着色,好像InStr没有在任何地方找到任何东西。

然后我试着做

If InStr(LCase(Data.Cells(i, 4).Value), "flowserve") Then
    'do nothing
Else
    If CDate(Data.Cells(i, "h").Value) < Date Then _
        Data.Cells(i, "h").Font.Color = -16776961
End If

这可以按照我的意愿运作,所以我猜测Not无法正常工作。

现在即使我有一个解决方案,我也希望有人可以解释第一个代码中出了什么问题。希望我很清楚。

提前感谢大家!

4 个答案:

答案 0 :(得分:7)

https://msdn.microsoft.com/en-us/library/8460tsh1%28v=vs.90%29.aspx

InStr返回的值不是布尔值,请尝试将其与返回的值进行比较。

If InStr(LCase(Data.Cells(i, 4).Value), "flowserve") = 0 Then
    If CDate(Data.Cells(i, "h").Value) < Date Then _
        Data.Cells(i, "h").Font.Color = -16776961
End If

答案 1 :(得分:2)

使用Not Integer时,您必须非常小心。请参阅以下示例:

Sub InStrTest()

Dim DataCellsTrue As String
Dim DataCellsFalse As String

DataCellsTrue = "flowserve"
DataCellsFalse = "haha"

Debug.Print InStr(LCase(DataCellsTrue), "flowserve") 'return 1
Debug.Print Not InStr(LCase(DataCellsTrue), "flowserve") 'return -2
Debug.Print CBool(InStr(LCase(DataCellsTrue), "flowserve")) 'return true
Debug.Print Not CBool(InStr(LCase(DataCellsTrue), "flowserve")) 'return false
Debug.Print InStr(LCase(DataCellsFalse), "flowserve") 'return 0
Debug.Print Not InStr(LCase(DataCellsFalse), "flowserve") 'return -1
Debug.Print CBool(InStr(LCase(DataCellsFalse), "flowserve")) 'return false
Debug.Print Not CBool(InStr(LCase(DataCellsFalse), "flowserve")) 'return true

End Sub

答案 2 :(得分:1)

不要使用布尔转换......而是:

If InStr(LCase(Data.Cells(i, 4).Value), "flowserve") = 0 Then

答案 3 :(得分:0)

为什么不创建自己的自定义函数,它的功能与您期望的一样?

Public Function Contains(ByVal toSearch As String, ByVal toFind As String) As Boolean
    Contains = (Instr(toSearch, toFind) <> 0)
End Function

然后你可以说

If Not Contains(LCase(Data.Cells(i, 4).Value), "flowserve") Then
    If CDate(Data.Cells(i, "h").Value) < Date Then _
        Data.Cells(i, "h").Font.Color = -16776961
End If

并且它的工作方式与您想要的完全相同。

另请注意,您不必LCase任何事情。请改用Instr的文本比较选项。

Public Function Contains(ByVal toSearch As String, ByVal toFind As String) As Boolean
    Contains = (Instr(1, toSearch, toFind, vbTextCompare) <> 0)
End Function

If Not Contains(Data.Cells(i, 4).Value, "flowserve") Then
    If CDate(Data.Cells(i, "h").Value) < Date Then _
        Data.Cells(i, "h").Font.Color = -16776961
End If