使用excel VBA打开文件,根据单元格的值,用相同的值从dynamic组合

这是目标。 用户打开从networking驱动器的只读工作簿。 select一个文件名称的单元格,并单击macrosbutton,它会find并打开每个文件有多less匹配的单元格值。

什么是达到这个结果的最有效的方法? 请记住:

  • 用户不希望等待excel每次打开工作簿时都用文件编译目录结构。
  • 文件名将始终与包含文件夹名称的某个部分匹配
    • 文件135A1200将在文件夹135A12XX
  • 几十个不同级别的子文件夹的文件夹/子文件夹
  • 成千上万个不断变化的文件
  • 文件夹层次结构是半永久性的
  • 一致的文件/文件夹命名格式如下:
    • 将始终以三个数字开头
    • 接着是一到三个字母
    • 然后是四到七个数字,例如135A1200或246FP317101
  • 因为这么多的未知数,不想使用集合等等

我正在考虑有一个循环,将采取的价值,从该值build立一个path,同时也validationpath存在之前继续前进,然后到达最后的子文件夹时,find许多匹配的文件价值和做任何事情。 我在循环和添加X子文件夹时遇到了问题,因为它们与选定的值不匹配,并且并不总是知道X将在不同的子文件夹集中。

135A1200-101将等于\ path \ 135 \ 135A \ 135A1XXX \ 135A12XX \ 135A1200_S_01.file

要么

246FP317101-31将等于\ path \ 246 \ 246F \ 246FP \ 246FP317101.file

  • \\path\ 135 \
    • 135A \
      • 135A0XXX \
      • 135A1XXX \
      • 135A10XX \
      • 135A11XX \
      • 135A12XX \
        • 135A1200_S_01.file
        • 135A1200_S_02.file
        • 135A1200_S_03.file
      • 135A13XX \
      • 135A3XXX \
      • 135ASKXXX \
    • 135D \
    • 135F \
    • 135GGG \
    • 135LL \
  • \\path\ 321 \
  • \\path\ 246 \
    • 246F \
      • 246F13 \
      • 246F14 \
      • 246F15 \
      • 246F16 \
      • 246FF \
      • 246FP \
        • 246FP317101.file

这是我有哪些工作可以更简单的一组文件和文件夹。

Public Sub pickFiles() Dim File As Variant Dim subPath As String File = Selection(1, 1).Value Select Case Left(File, 1) Case "Q" If Left(File, 6) = "Q11-12" Then subPath = "folder\QXX\Q11\" & Left(File, 6) ElseIf Left(File, 6) = "Q11-14" Then subPath = "folder\QXX\Q11\" & Left(File, 6) ElseIf Left(File, 6) = "Q11-22" Then subPath = "folder\QXX\Q11\" & Left(File, 6) Else subPath = "folder\QXX\" & Left(File, 3) End If openCompFile File, subPath Case "P" subPath = "folder\PXX\" & Left(File, 3) openCompFile File, subPath Case Else msgbox "That's not a valid file number", vbInformation End Select End Sub Private Sub openCompFile(ByRef File As Variant, ByRef subPath As String) Dim mainPath As String Dim fso As New FileSystemObject Dim Folder As Folder 'Dim File As Variant Dim FileCollection As New Collection mainPath = "X:\folder\" & subPath Set Folder = fso.GetFolder(mainPath) For Each File In Folder.Files If Left(File.Name, 9) = Left(File, 9) Then FileCollection.Add File Next File If FileCollection.Count = 0 Then msgbox Left(File, 9) & " was not found.", vbInformation Else For Each File In FileCollection ShellExecute 0, "Open", File.Path, vbNullString, vbNullString, 1 Next End If End Sub 

我不知道这将是多快,因为它似乎是使用networking驱动器,但我的想法是使用命令的内置DIRfunction来查找所有的文件。 (不要把这个与VBA内置的DIR命令混淆,VBA DIR不会search子文件夹,CMD的DIR会。

我不是100%确定的,我确切地知道你的所有文件名是什么样的,但是看起来,根据示例数据,连字符左边的文件名部分总是每个文件的文件名的一部分被打开。 例如: 135A1200-101应始终打开3个文件: 135A1200_S_01.file135A1200_S_02.file135A1200_S_03.file246FP317101-3将打开246FP317101.file 。 假设我理解文件命名约定,是真的, 359AS12005-33将打开这些文件359AS12005_S_05359AS12005.file

如果是这样,请试试这个代码:

 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Function RunCMD(ByVal strCMD As String) As String 'Runs the provided command Dim oShell As Object 'New wshShell Dim cmd As Object 'WshExec Dim x As Integer Const WshRunning = 0 On Error GoTo wshError x = 0 RunCMD = "Error" Set oShell = CreateObject("Wscript.Shell") Set cmd = oShell.Exec(strCMD) 'Debug.Print strCMD 'Stop Do While cmd.Status = WshRunning Sleep 100 'for 1/10th of a second x = x + 1 If x > 1200 Then 'We've waited 2 minutes so kill it cmd.Terminate RunCMD = "Error: Timed Out" End If Loop RunCMD = cmd.StdOut.ReadAll & cmd.StdErr.ReadAll Set oShell = Nothing Set cmd = Nothing Exit Function wshError: RunCMD = cmd.StdErr.ReadAll Resume Next End Function Sub FindFiles() Dim strSearchResults As String Dim strBaseFileName As String Dim strFileName As Variant Dim arrFileNames As Variant strBaseFileName = Left(Selection(1, 1).Value, InStr(1, Selection(1, 1).Value, "-", vbTextCompare)) strSearchResults = RunCMD("cmd /c ""Dir X:\folder\" & strBaseFileName & "* /a:-d /b /d /s""") Debug.Print strSearchResults 'Split the results into an array the can be looped through arrFileNames = Split(strSearchResults, vbCrLf, -1, vbTextCompare) Debug.Print UBound(arrFileNames) For Each strFileName In arrFileNames Debug.Print strFileName Next End Sub 

注意事项:FindFiles子文件获取第一个连字符的所有文本,并使用它来search每个任意文本string开头的文件的子目录。 如果这不是你正在寻找的,那么希望这可以指向你使用Windows DIR命令(而不是VBA的DIR命令,在这种情况下不起作用)相对有效的方法来find一个解决scheme。