“如果不是instr”不起作用,我认为它应该在vba中

我有一份合同清单,其中一栏是供应商名称,另一份是结束date,我想要做的是将所有通过的date设为红色,除非合同来自特定的供应商。 我以前使用InStr来检查一个单元格是否有一个string,因为我刚刚开始与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 

期望它会着色供应商名称中没有“flowserve”的合同的合格date。 但是相反,它似乎只是将InStr在任何地方找不到任何东西,而将所有通过的date着色。

然后我试着去做

 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是不行的。

现在,即使我有一种解决scheme,我希望有人能解释第一个代码中出了什么问题。 希望我已经清楚了。

在此先感谢大家!

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 

您必须非常小心使用NotInteger数值。 看下面的例子:

 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 

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

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

为什么不创build自己的定制function,就像你期望的一样呢?

 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