【问题标题】:VB code searching all excel file in given folder or directoryVB代码搜索给定文件夹或目录中的所有excel文件
【发布时间】:2014-06-17 08:17:54
【问题描述】:

请参阅下面的代码,它工作正常,并在给定目录中搜​​索所有 excel 文件。但我无法理解这段代码

疑问:NoOfFolders(Iterator1) 是一个动态数组,当再次调用函数 fnFolderStructure 时,NoOfFolders 数组再次被创建。但是即使值 NoOfFolders(0)NoOfFolders(1) 也发生了变化,但是当再次使用以前的值调用它时仍然如此。

即使在写入NoOfFolders(Iterator1) 之后,它如何能够保留值。

fnCheckFiles("C:\Temp\Sahil")

Function fnFolderStructure(sAddress)
        i=0
        Dim NoOfFolders()
        Set objFSO1 = CreateObject("Scripting.FileSystemObject") 
        Set objFolder2 = objFSO1.GetFolder(sAddress) 
        Set FolderIn=objFolder2.SubFolders
        Set FileIn=objFolder2.Files

'       If FileIn.Count>0 Then
'            fnCheckFiles(sAddress)
'       End If  

    If FolderIn.Count>0 Then    
        y=FolderIn.Count        
        ReDim NoOfFolders(y-1)  

        For Each objSubfolder in FolderIn
             NoOfFolders(i)= objSubfolder.Name 
             i=i+1
        Next

        For Iterator1 = 0 To y-1
            sPath1=sAddress&"\"&NoOfFolders(Iterator1)
            fnCheckFiles(sPath1)
        Next

'            Set colSubfolders = FolderIn.Subfolders
'           Call fnFolderStructure(sPath1)
        End If
End Function

Function fnCheckFiles(sAddress)
            Set objFSO1 = CreateObject("Scripting.FileSystemObject") 
            Set objFolder4 = objFSO1.GetFolder(sAddress)        
            ''sFileName=objFolder4.Name
            For Each objFile In objFolder4.Files 
                sFileName=objFile.Name              
                if (InStr(1,sFileName,"xlsx",1)) then       
                    msgbox objFile.Name     
                End IF      
            Next


        if objFolder4.SubFolders.Count>0 then
            fnFolderStructure(sAddress)
        End if
End Function

【问题讨论】:

  • 我不确定我是否完全理解您的问题,但如果您重新调整数组并且想要保留现有值,则需要使用 redim preserve。除此之外,您是否需要将名称存储在一个数组中 - 如果您除了在 for 循环中使用它们之外没有做任何其他事情,那么将您的 for-iterator-loop 集成到第一个循环中可能会更容易。
  • 嗨,我给的路径是“C:\Temp\Sahil”假设有两个文件夹A,B。一个文件夹有一个excel表“A.xlsx”和文件夹C。文件夹C还有一个excel“C.xlsx”。现在文件夹“C:\Temp\Sahil”中的文件夹 B 有一个文件夹“F”和 excel“B.xlsx”。文件夹“F”有excel“F.xlsx”。因此,此代码将通过调用递归函数来命名每个文件夹中的所有 excel。NoOfFolders 数组被重新定义并一次又一次地分配新值。那么它为什么仍然保留价值。以及这段代码是如何工作的。 ——

标签: vba excel qtp


【解决方案1】:

即使在写入之后它如何能够保留值 NoOfFolders(Iterator1)

该语句没有写入数组。数组 NoOfFolders 用在四个地方...

1) 将值声明为动态数组

Dim NoOfFolders()

2) 重新调整变量以匹配它将保存的文件夹名称数量的大小

ReDim NoOfFolders(y - 1)

3) 将文件夹的名称分配给数组中的相应位置。这是将值写入数组的唯一位置。

NoOfFolders(i) = objSubFolder.Name

4) 从数组中读取文件夹名称,构建子文件夹路径

sPath1 = sAddress & "\" & NoOfFolders(Iterator1)

【讨论】:

  • 嗨,我给的路径是“C:\Temp\Sahil”假设有两个文件夹A,B。一个文件夹有一个excel表“A.xlsx”和文件夹C。文件夹C还有一个excel“C.xlsx”。现在文件夹“C:\Temp\Sahil”中的文件夹 B 有一个文件夹“F”和 excel“B.xlsx”。文件夹“F”有excel“F.xlsx”。因此,此代码将通过调用递归函数来命名每个文件夹中的所有 excel。NoOfFolders 数组被重新定义并一次又一次地分配新值。那么它为什么仍然保留价值。以及这段代码是如何工作的。
  • fnCheckFolders 函数被递归调用,因为它不断被每个子文件夹调用,直到找不到更多子文件夹。每次调用函数时,您关注的数组都不会重新定义。相反,每次调用该函数时都会为该函数分配新内存,并且该内存会一直填充,直到您退出该函数。如果您的文件夹结构是三层深度,那么您最终会在内存中同时存在 3 个数组,每个数组都包含该文件夹结构级别的子文件夹的名称。
  • 您好,我理解您所说的“每次调用函数时都会为其分配新内存”。所以这意味着上面代码中的 NoOfFolders() 数组在不同级别会有不同的值。就像 NoOfFolders(0) 在第一级是 A,它在第三级变为 NoOfFolders(0) "C"。当我在执行后返回它时,NoOfFolders(0) 将再次具有 A 而不是写 NoOfFolders(o)="C"。你能知道任何详细解释这个概念的网站吗?但真的感谢您解释这一点。向你致敬:)
  • 乐于助人。这是我在过去 15 年的编程中某个时候学到的概念之一,所以很抱歉,我不知道有什么好的参考资料可以指点您。我做了一个快速的谷歌搜索,并没有看到任何突出的东西。另外,如果我发布的答案解决了您的问题,请记得将其标记为已接受。
【解决方案2】:
   ====================================================================================================================*/
def getTagValue(def filepath, def tagName,log)
{
    def tagValue = ""
    try
    {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance()
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder()
        Document doc = docBuilder.parse(filepath)
        // Get the root element
        Node company = doc.getFirstChild()
        NodeList nodes = doc.getElementsByTagName(tagName)
        //log.info "Nodes length :" +nodes.getLength()
        Node node = nodes.item(0)
        //log.info node.getTextContent()
        tagValue = node.getTextContent()
        if(tagValue == "")
        {
            tagValue = "tag not found"
        }
    }
    catch(Exception e)
    {
        log.error e.message
        tagValue = "tag not found"
    }
    return tagValue
}

=============================== def List readXpaths(def expectedExcelPath, def expectedExcelSheet, log, context) {

        Fillo.Connection con=getFilloConnection(expectedExcelPath,log)
        String sQuery="Select * from "+expectedExcelSheet+" where TestCaseName='"+context.testCase.name+"'"
        //log.info sQuery

        Recordset rs=getRecordSet(con,sQuery,log)
        List<String> colList=rs.getFieldNames()
        colList.remove("TestCaseName")
        colList.remove("DATA_SET")
        colList.remove("RUN")
        List<String> xpaths=new ArrayList<String>()
        while(rs.next())
        {
            for(String str:colList)
            {           
                if(rs.getField(str)!="")
                {
                    xpaths.add(rs.getField(str))

                }
            }
        }
        return xpaths;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2020-01-03
    • 2021-05-01
    • 2018-04-26
    相关资源
    最近更新 更多