【问题标题】:VBA FileFolderExists pass variableVBA FileFolderExists 传递变量
【发布时间】:2012-07-30 09:07:56
【问题描述】:

我在网上找到了这个功能

    Private Function FileFolderExists(strFullPath As String) As Boolean

    On Error GoTo EarlyExit
    If Not Dir(strFullPath, vbDirectory) = vbNullString then
        FileFolderExists = True
    End If

    EarlyExit:
    On Error GoTo 0
    End Function

我想像这样传递字符串变量

    Dim lineText As String
    ...
    ElseIf FileFolderExists(lineText) = False Then

我收到编译错误“byref 参数类型不匹配”

当我将 byval 放在 strFullPath 之前时,它似乎无法正常工作。 我也尝试过使用 Dir 函数,如果我传递像“C:\test”这样的文字,它会起作用,但如果我传递变量,它就不起作用。

是否有人具有检查文件夹存在并接受字符串变量作为参数的功能?

提前致谢

【问题讨论】:

  • 你在哪一行得到错误
  • 对于上面的代码:在我写的最后一行。调用函数时传递字符串变量lineText时
  • 发布的代码在 Excel 和 Word 中都适用于我。一件事,检查您的 vba 项目中是否缺少引用(在“工具/引用”菜单中)。有时缺少引用会导致误导性的编译错误。

标签: excel vba ms-word


【解决方案1】:

问题似乎是 Word 将 CR 字符添加到每个段落,或者更准确地说,Paragraph 对象的 Text 属性返回段落文本加上 CR 字符。

AFAIK,这是每个段落的 Word 行为,即使是最后一个段落。

这怎么会导致编译错误,我不知道。如果我以米兰为例:

Private Sub FirstLineFolder()
Dim lineText As String

lineText = ActiveDocument.Paragraphs(1).Range.Text
lineText = Left(lineText, Len(lineText) - 1) 'see below

MsgBox DoesFolderExist("C:\") 
MsgBox DoesFolderExist(lineText)
End Sub

如果文档的第一行是有效文件夹,则返回 truetrue。如果我注释了标记的行,程序仍然编译并运行并返回truefalse(具有相同的文档)。

MSDN website上有一些关于它的信息

【讨论】:

    【解决方案2】:

    试试这个:

    Function FolderExists(folderPath As String) As Boolean
    
    Dim f As Object
    Set f = CreateObject("Scripting.FileSystemObject")
    
    On Error GoTo NotFound
    Dim ff As Object
    Set ff = f.GetFolder(folderPath)
    FolderExists = True
    Exit Function
    
    NotFound:
    FolderExists = False
    On Error GoTo 0
    
    End Function
    

    我使用以下方法对其进行了测试:

    Sub Tst()
    
    Dim b As Boolean
    Dim s As String
    s = "c:\temp"
    b = FolderExists(s)
    
    End Sub
    

    它按预期工作。

    一般情况下,我在VBA中所有文件相关的操作都使用Scripting.FileSystemObject,native函数太麻烦了。

    还应该注意的是,我的函数都检查文件夹,而原始函数——从它的名字来看——也许还试图检查文件是否存在。

    【讨论】:

    • 感谢您的回答,但它对我也不起作用。我将在单独的帖子中发布新代码,它应该更好地解释我需要什么
    【解决方案3】:

    新代码,它准确地解释了我需要什么,你应该更容易尝试。

    我希望文件夹位于 Word 文档的第一行,然后我必须检查它是否存在。

    Private Sub FirstLineFolder()
    Dim lineText As String
    
    lineText = ActiveDocument.Paragraphs(1).range.Text
    
    MsgBox DoesFolderExists("C:\") ' this works
    MsgBox DoesFolderExists(lineText) ' this doesnt work, when same folder passed
    End Sub
    

    我和 Martin 的函数都抛出了我在第一篇文章中写的编译错误。

    如果重要的话:Word 是 2010,“选项显式”不写(我继承了代码,我无法更改)

    【讨论】:

    • 我在 Word 2010 中尝试了您的代码(使用我的函数),它运行良好。顺便说一句,将行 lineText = Left(lineText, Len(lineText) - 1) 添加到您的代码中,range.Text 返回字符串加上结束段落字符。
    • 是的,我也找到了!最后我有一个幽灵 Chr(13)。回车。这就是问题所在,没有传递变量。谢谢你的帮助 !顺便说一句,Word 中的每一行是否以 CR 结尾?您有一些记录它的链接,或者可能有一种在 Word 中查看 CR LF 标记的方法?您想将其作为单独的答案发布,以便我接受并给您积分吗?
    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多