Scripting.FileSystemObject 和 INSTR 以及 VBA 代码中的 IF THEN 的问题
Problem with Scripting.FileSystemObject and INSTR and IF THEN in VBA code
我不明白为什么这不起作用
xSource = vrtSelectedItem '<<== C:\Users\Me\Desktop\Document01.pdf
Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
If Not InStr(xSource, ".jpg") Or Not InStr(xSource, ".bmp") Or Not InStr(xSource, ".png") _
Or Not InStr(xSource, ".tif") Or Not InStr(xSource, ".tga") Or Not InStr(xSource, ".jpeg") _
Or Not InStr(xSource, ".doc") Or Not InStr(xSource, ".pdf") Or Not InStr(xSource, ".rtf") _
Or Not InStr(xSource, ".htm") Or Not InStr(xSource, ".html") Or Not InStr(xSource, ".txt") _
Or Not InStr(xSource, ".docx") Or Not InStr(xSource, ".tdm") Or Not InStr(xSource, ".wri") _
Or Not InStr(xSource, ".xls") Or Not InStr(xSource, ".xlsx") Or Not InStr(xSource, ".xlsm") _
Or Not InStr(xSource, ".ods") Or Not InStr(xSource, ".odt") Then
MsgBox "File type not allowed"
Exit Sub
Else
.....
尽管文件包含 .pdf,但我收到 MsgBox“文件类型不允许”!这也发生在我列出的所有其他文件类型中,实际上将它们从错误消息中排除!谁能给我一些建议?谢谢
TL;DR: InStr
不是 return 一个 Boolean
,而是一个 Variant
(Long
) 指定一个字符串在另一个字符串中第一次出现的位置。
简化说明问题:
xSource = "C:\Users\Me\Desktop\Document01.pdf"
Debug.Print InStr(xSource, "pdf")
Debug.Print Not InStr(xSource, "pdf")
Debug.Print CBool(Not InStr(xSource, "pdf"))
returns
32
-33
True
InStr
不是 return 布尔值,而是一个字符串在另一个字符串中第一次出现的 position。而不是使用 Not
,通常会检查 InStr
的结果是否为 > 0
以确定是否找到匹配。
在数值表达式上使用 Not
执行按位求反,如上所示,这会导致匹配结果最终计算为 True
。事实上,没有匹配 also 评估为 True
(CBool(Not(0))
returns True
).
这是执行此操作的替代方法:
Private Function IsValidFileType(ByVal filePath As String) As Boolean
Dim FSO As Scripting.FileSystemObject
Set FSO = New Scripting.FileSystemObject
Dim extension As String
extension = FSO.GetExtensionName(filePath)
Select Case extension
Case "jpg", "bmp", "png" '< and so on
IsValidFileType = True
Case Else
IsValidFileType = False
End Select
End Function
我不明白为什么这不起作用
xSource = vrtSelectedItem '<<== C:\Users\Me\Desktop\Document01.pdf
Set FSO = VBA.CreateObject("Scripting.FileSystemObject")
If Not InStr(xSource, ".jpg") Or Not InStr(xSource, ".bmp") Or Not InStr(xSource, ".png") _
Or Not InStr(xSource, ".tif") Or Not InStr(xSource, ".tga") Or Not InStr(xSource, ".jpeg") _
Or Not InStr(xSource, ".doc") Or Not InStr(xSource, ".pdf") Or Not InStr(xSource, ".rtf") _
Or Not InStr(xSource, ".htm") Or Not InStr(xSource, ".html") Or Not InStr(xSource, ".txt") _
Or Not InStr(xSource, ".docx") Or Not InStr(xSource, ".tdm") Or Not InStr(xSource, ".wri") _
Or Not InStr(xSource, ".xls") Or Not InStr(xSource, ".xlsx") Or Not InStr(xSource, ".xlsm") _
Or Not InStr(xSource, ".ods") Or Not InStr(xSource, ".odt") Then
MsgBox "File type not allowed"
Exit Sub
Else
.....
尽管文件包含 .pdf,但我收到 MsgBox“文件类型不允许”!这也发生在我列出的所有其他文件类型中,实际上将它们从错误消息中排除!谁能给我一些建议?谢谢
TL;DR: InStr
不是 return 一个 Boolean
,而是一个 Variant
(Long
) 指定一个字符串在另一个字符串中第一次出现的位置。
简化说明问题:
xSource = "C:\Users\Me\Desktop\Document01.pdf"
Debug.Print InStr(xSource, "pdf")
Debug.Print Not InStr(xSource, "pdf")
Debug.Print CBool(Not InStr(xSource, "pdf"))
returns
32
-33
True
InStr
不是 return 布尔值,而是一个字符串在另一个字符串中第一次出现的 position。而不是使用 Not
,通常会检查 InStr
的结果是否为 > 0
以确定是否找到匹配。
在数值表达式上使用 Not
执行按位求反,如上所示,这会导致匹配结果最终计算为 True
。事实上,没有匹配 also 评估为 True
(CBool(Not(0))
returns True
).
这是执行此操作的替代方法:
Private Function IsValidFileType(ByVal filePath As String) As Boolean
Dim FSO As Scripting.FileSystemObject
Set FSO = New Scripting.FileSystemObject
Dim extension As String
extension = FSO.GetExtensionName(filePath)
Select Case extension
Case "jpg", "bmp", "png" '< and so on
IsValidFileType = True
Case Else
IsValidFileType = False
End Select
End Function