我有一张包含合同列表的表单,其中包含供应商名称列和一个结束日期列表,我想要做的是将所有通过日期设置为红色,除非合同来自特定供应商。
我以前使用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
无法正常工作。
现在即使我有一个解决方案,我也希望有人可以解释第一个代码中出了什么问题。希望我很清楚。
提前感谢大家!
答案 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