【问题标题】:VBA - check if file exist without knowing extensionVBA - 在不知道扩展名的情况下检查文件是否存在
【发布时间】:2018-06-06 06:26:34
【问题描述】:

我有一个 Excel 工作簿,其中 [A] 列有许多文件名。但只有文件名,所以没有任何扩展名。我想遍历每个单元格并检查特定文件夹中的文件是否存在与单元格中的此字符串匹配。

有人在 Google 上找不到任何东西。

谢谢

【问题讨论】:

  • “有人没能在 Google 上找到任何东西”,确实有人现在要求某人为他们工作。这确实是一个帮助修复或升级代码的站点,而不是从头开始创建它,这将是一项工作。话虽如此,我会说您的查询虽然可以做到,但最终是不正确的,该文件夹可能有“File.jpg”、“File.ai”、“File.doc”、“File.xlsx”,所有这些都是有效的点击但如果您不知道要查找的扩展名,即“File.png”,则可能会返回误报。存在一个名为“File”的文件,因此会返回 true,但没有名为“File.png”的文件。
  • 自动更正:不知何故,不是某人。我的想法是操作文件夹部分中每个文件的字符串,从右侧删除所有内容,直到第一个“。”然后出现“\”之后的所有内容。
  • 关于您对不同扩展的关注。只有一个扩展名未知的文件名,但不超过 1 个
  • @smartini,我很确定我的代码可以正常工作。如果你找到它,我不知道你想做什么,但这回答了你的问题。

标签: excel vba search


【解决方案1】:

应该这样做。

Const dirPath As String = "C:\whateveryourPathIs\"

Sub RunIt()
    Dim Rcell As Range
    For Each Rcell In Intersect(Range("A:A"), ActiveSheet.UsedRange).Cells

        If Not IsEmpty(Rcell) Then

            If CheckIfFileExists(dirPath, Rcell.Value) Then
                'whatever you want to happen when it finds a match
                Debug.Print Rcell.Value & " was found"

            End If
        End If

    Next Rcell

End Sub



Private Function CheckIfFileExists(srchDIR As String, MatchMember As String) As Boolean
    Dim file As Variant, nameOfFile As String

    If Right(srchDIR, 1) <> "\" Then srchDIR = srchDIR & "\"

    file = Dir(srchDIR)
    While (file <> "")

        nameOfFile = Left(file, InStrRev(file, ".", -1, vbTextCompare) - 1)


        If UCase(nameOfFile) = UCase(MatchMember) Then
            CheckIfFileExists = True
            Exit Function
        End If

        file = Dir
    Wend
End Function

【讨论】:

  • 谢谢。这个 InStr 搜索也会找到名为“test13”的文件,但我会搜索“test1”,例如
  • 您的代码也可以正常工作,感谢您的更新工作。用户现在可以使用这两个代码。
  • 谢谢@smartini。我不确定您的代码的目标是什么,但您的 for i loop 中没有 i,所以它只是在重复旋转。此外,它看起来没有使用正确的功能。如果您正在使用 right 函数并测试它是否会 "."这只是第一个例子。不需要循环。也许您的意思是mid 函数?我不确定,但我很欣赏这个勾号。祝你好运。
【解决方案2】:

@PGCodeRider 谢谢,我根据需要修改了您的代码,现在可以使用了。任何对代码下方感兴趣的人(“或者在谷歌上也没有找到任何东西”):

Const dirPath As String = "C:\folderpath\..."

Sub RunIt()
    Dim Rcell As Range
    For Each Rcell In Intersect(Range("A:A"), ActiveSheet.UsedRange).Cells

        If Not IsEmpty(Rcell) Then

            If CheckIfFileExists(dirPath, Rcell.Value) Then
                'whatever you want to happen when it finds a match
                Debug.Print Rcell.Value & " was found"

            End If
        End If

    Next Rcell

End Sub

Private Function CheckIfFileExists(srchDIR As String, MatchMember As String) As Boolean
    Dim file As Variant
    Dim length As Long

    If Right(srchDIR, 1) <> "\" Then srchDIR = srchDIR & "\"

        file = Dir(srchDIR)

        While (file <> "")

            length = Len(file)
                For i = 1 To length
                    If Right(file, 1) <> "." Then
                        file = Left(file, length - 1)
                        length = Len(file)
                    Else
                    Exit For
                    End If
                Next i

            file = Left(file, length - 1)

        'If InStr(1, file, MatchMember, vbTextCompare) > 0 Then
            If file = MatchMember Then
                CheckIfFileExists = True
                Exit Function
            End If
            file = Dir
        Wend
End Function

【讨论】:

  • 正如我的其他评论所说...您的for i loop 有一些问题。循环中没有i,我认为您的意思是mid 不是Right
  • 感谢您的提示。确实 for i 循环没有意义,我宁愿做 while (我只想限制循环,因为它有一个最大循环,比如字符串的长度)。 thise Right() 函数的目的是我只想从字符串中删除文件扩展名。 - 有用。但我知道,虽然代码写得不好。
  • 你的编辑没有意义,因为程序没有做它应该做的事情。你试过运行它吗?请看一下首发.打印窗口,你会看到一个循环是必要的。
  • 现在我明白你在做什么了。这是过度和低效的(欢迎使用 SO!!☠?)我将在您的代码中添加一个更正,而不涉及您的代码,这样您就可以看到不同之处。我不认为你的回答提供了我没有提供的任何东西,但我喜欢健康的讨论。您看起来好像刚刚开始使用 VBA,我很欣赏您的创造性方法。我们都去过那里。
  • 对 VBA 并不陌生,但这次我有点生疏了。不过感谢您的帮助!
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 2011-09-23
  • 2022-11-11
  • 2011-03-19
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多