首页 > 解决方案 > 在文件名字符串中查找第一个“_”

问题描述

我想遍历一个目录并按文件名对文件进行分组,直到文件名_中的第一个。

文件的结构是

经理姓名_员工姓名_Assessment.xlsx

我希望这将字符串组合在一起,直到第一个下划线。我不能指定字符长度,因为经理有不同的名字。

我在想改变If Right(filename,4)语句应该做我想做的事,但我不能指定字符限制。

Public Sub Move_Files()

Dim sourceFolder As String, fileName As String
Dim destinationFolder As String, foundDestinationFolder As String
Dim missingFolders As String

sourceFolder = "C:\Assessment\"
If Right(sourceFolder, 1) <> "\" Then sourceFolder = sourceFolder & "\"

'Loop through *.xls files in source folder

missingFolders = ""
fileName = Dir(sourceFolder & "*.xls")
While fileName <> vbNullString
    **If Right(fileName, 4) = ".xlsx" Then**
        destinationFolder = Left(fileName, InStrRev(fileName, ".") - 1)
        foundDestinationFolder = Find_Subfolder(sourceFolder, destinationFolder)
        If foundDestinationFolder <> "" Then
            Name sourceFolder & fileName As foundDestinationFolder & fileName
        Else
            missingFolders = missingFolders & vbCrLf & destinationFolder
        End If
    End If
    fileName = Dir
Wend

If missingFolders = "" Then
    MsgBox "All subfolders exist.  All files moved to their respective destination folder"
Else
    MsgBox "The following subfolders don't exist:" & vbCrLf & _
            missingFolders
End If

End Sub

在它识别出适合该经理姓名的所有内容后,我只想将这些经理的员工文件分组到一个文件夹中,他们的名字一直到第一个_.

标签: excelvba

解决方案


  1. 如果文件扩展名是.xlsx,则更fileName = Dir(sourceFolder & "*.xls")改为fileName = Dir(sourceFolder & "*.xlsx").
  2. 考虑这个InStr函数,它“返回一个 Variant (Long),指定一个字符串在另一个字符串中第一次出现的位置。”
    • 照原样destinationFolder = Left(fileName, InStrRev(fileName, ".") - 1)查找最后一个周期左侧的所有内容。
    • 因此,如果您希望目标文件夹成为Manager Name,那么也许destinationFolder = Left$(fileName, InStr(fileName, "_") - 1)
    • 请注意,这可以更稳健地处理文件名中 no 的可能性_,或者文件名以 开头_,初始为If InStr(fileName, "_") > 1).

推荐阅读