首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何仅通过比较文件名来打开特定的excel文件?

如何仅通过比较文件名来打开特定的excel文件?
EN

Stack Overflow用户
提问于 2020-05-15 19:03:50
回答 4查看 159关注 0票数 0

我目前正在从事一个项目,该项目要求我从给定目录中的数百个电子表格中编译数据。我的问题是,我不知道如何处理不同的子修改文件。例如,文件名为:

  • 文件名R1a.xlsx
  • 文件名R1b.xlsx
  • 文件名R1c.xlsx
  • 文件名R2a.xlsx
  • 文件名R2b.xlsxH 210F 211

对于上述文件,我只需从1c和2b读取即可。是否有一个很好的方法来确定哪些文件需要读取,或者至少有人能指出我可以查看的方向?我最初的想法是遍历文件名中的字符,并检查一个数字后面最大的字母,但这似乎是很难正确编码的。

提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-17 18:45:33

处理这个问题的方法有很多。如果您的文件名域真正固定为R{num}{prio}.xlsx,那么请注意,当{prio}.xlsx被去掉时,文件名构成有效的{prio}.xlsx单元地址。从示例中得到的单元格地址是R1R2。现在,您可以使用当前电子表格的R列作为稀疏向量来存储每个单元格(又名文件)所观察到的最高优先级。当检查了所有文件名并存储了它们的最高优先级时,现在只需遍历R列来获取所选的文件以进行处理。

下面是处理上述文件名域的代码..。

代码语言:javascript
运行
复制
Sub ProcessFilesBasedOnFnamePriority()
    Dim filenames, fname As Variant
    Dim maxRowNum, nRowNum, i As Long
    Dim strFilePrefix, strCellPrio As String

    maxRowNum = 1
    filenames = listfiles("c:\temp\lots_of_files")

    ' make an assumption that all filenames begin with the same
    ' single-char prefix character.
    strFilePrefix = Left(filenames(1), 1)

    For Each fname In filenames
        Dim dotpos, suffixLen As Integer
        Dim strCellAddr, strFnamePrio

        dotpos = InStr(1, fname, ".")
        suffixLen = Len(Mid(fname, dotpos))
        ' assume priority is specified by a single char in fname
        strFnamePrio = LCase(Mid(fname, dotpos - 1, 1))
        strCellAddr = Left(fname, Len(fname) - (suffixLen + 1)) ' "+1" to account for priority char
        strCellPrio = Range(strCellAddr)
        If (Trim(strCellPrio) = "") Then
            Range(strCellAddr) = strFnamePrio  ' store first prio occurrence
        Else
            ' assume filename prio characters (e.g., [a-z]) sort lexicographically
            If strFnamePrio > strCellPrio Then
                Range(strCellAddr) = strFnamePrio
            End If
        End If
        nRowNum = CLng(Mid(strCellAddr, 2))
        If nRowNum > maxRowNum Then
            maxRowNum = nRowNum
        End If
    Next

    For i = 1 To maxRowNum
        strCellPrio = Trim(Range(strFilePrefix & CStr(i)))
        If strCellPrio <> "" Then
            fname = strFilePrefix & CStr(i) & strCellPrio & ".xlsx"
            Debug.Print fname    ' <-- do analysis on fname
        End If
    Next i
End Sub

listfiles的代码是here。请注意,此解决方案将而不是处理不符合假定命名模式的丢失文件。你需要加些支票才能把它们清除掉。

票数 0
EN

Stack Overflow用户

发布于 2020-05-15 20:03:00

可以将需要匹配的部分文件名列表存储在数组中。然后循环遍历数组中的部分名称并预置部分名称,循环遍历目录以查找匹配项。VBA提供了InStr函数,您可以用来测试文件名是否包含数组中的部分名称。

伪码:

代码语言:javascript
运行
复制
myArray = [ 1c, 2b]

ForEach partialName in myArray 
  ForEach file in myDirectory
    If InStr(fileName, partialName) Then
      // Do something interesting
    End If
  Next file
Next partialName
票数 0
EN

Stack Overflow用户

发布于 2020-05-17 19:03:12

使用excel工作表或表格格式来表示所需的文件。

excel工作表只需要两列,A表示文件名而没有子修订,B列表示所需的子修订。

编译和组合这些信息,然后vba实现使用excel工作表/表格格式来迭代和读取这些文件。

使用任何语言来组成表格格式(在我的例子中,python是首选的),并尝试使用任何您可以“确定子修订”的东西。

这使您可以更容易地调试结果,并使用任何语言来编译格式化或表格分隔的文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61826568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档