Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-获取没有内置函数的第二个最后修改的文件(FSO)_Vba_Excel - Fatal编程技术网

VBA-获取没有内置函数的第二个最后修改的文件(FSO)

VBA-获取没有内置函数的第二个最后修改的文件(FSO),vba,excel,Vba,Excel,我正在尝试使用Excel VBA获取文件夹中上次修改文件之前的文件,我已成功获取上次修改的文件,但无法获取第二个文件。 下面是我用来获取上次修改的文件的代码,没有使用系统函数或内置函数 Sub LastFileModified() Dim fso As New Scripting.FileSystemObject Dim fill As Scripting.File Dim i As Integer Dim ForStep As Integer D

我正在尝试使用Excel VBA获取文件夹中上次修改文件之前的文件,我已成功获取上次修改的文件,但无法获取第二个文件。 下面是我用来获取上次修改的文件的代码,没有使用系统函数或内置函数

Sub LastFileModified()

    Dim fso As New Scripting.FileSystemObject
    Dim fill As Scripting.File


    Dim i As Integer
    Dim ForStep As Integer

    Dim Arr() As Variant

    ReDim Arr(fso.GetFolder("C:\Users\Shahim\Desktop\xxxx").Files.Count - 1, 1) As Variant

  i = 0

For Each fill In fso.GetFolder("C:\Users\Shahim\Desktop\xxxx").Files

    Arr(i, 0) = fill.Name
    Arr(i, 1) = CDbl(fill.DateLastModified)

    i = i + 1

Next fill


Dim filename As String
Dim Initializer As Double

Initializer = Arr(0, 1)

For ForStep = LBound(Arr) To UBound(Arr)


        If Arr(ForStep, 1) > Initializer Then

        Initializer = Arr(ForStep, 1)
        filename = Arr(ForStep, 0)

        End If



Next ForStep

Debug.Print filename

Erase Arr

End Sub

最初的答案对我不起作用,原因有二

  • fileArr(i,2)未声明为日期,有时Excel无法解释较大的日期。当我试图将此设置为日期时,它说我无法设置数组的暗显
  • 如果包含临时文件,则不会跳过这些文件
  • 这是对我有用的东西

    Function SecodLastModified(Directory)
    
    Dim FileSys As FileSystemObject
    Dim objFile As File, objFile1 As File
    Dim myFolder
    Dim strFilename As String, strFolder As String, myDir As String
    Dim strFilenameFirst As String, strFilenameSecond As String, strFilenameSecond1 As String
    Dim dteFile As Date, dteFileSecond1 As Date, dteFileFirst As Date, dteFileSecond As Date
    Dim openLastFile
    
    'set up filesys objects
    Set FileSys = New FileSystemObject
    Set myFolder = FileSys.GetFolder(Directory)
    
    dteFileSecond1 = DateSerial(1900, 1, 1)
    dteFile = DateSerial(1900, 1, 1)
    'loop through each file and get date last modified. If largest date then store Filename
    For Each objFile In myFolder.Files
        For Each objFile1 In myFolder.Files
            ' To prevent opening temporary files
            If objFile1.Name Like "*.xlsx" And Left(objFile1.Name, 2) <> "~$" Then
                If objFile1.DateLastModified > objFile.DateLastModified Then
                    dteFileSecond = objFile.DateLastModified
                    strFilenameSecond = objFile.Name
                    dteFileFirst = objFile1.DateLastModified
                    strFilenameFirst = objFile1.Name
                    ' If second file date is greater than current second file, store away as the second file
                    If dteFileSecond > dteFileSecond1 Then
                        dteFileSecond1 = objFile.DateLastModified
                        strFilenameSecond1 = objFile.Name
                    End If
                End If
            End If
        Next
    Next objFile
    
    Set SecodLastModified = Workbooks.Open(Directory & "\" & strFilenameSecond1)
    Set FileSys = Nothing
    Set myFolder = Nothing
    End Function
    
    函数secodlastmedited(目录)
    将文件系统设置为FileSystemObject
    Dim objFile作为文件,objFile1作为文件
    调暗我的文件夹
    Dim strFilename作为字符串,strFolder作为字符串,myDir作为字符串
    Dim strFilenameFirst作为字符串,strFilenameSecond作为字符串,strFilenameSecond1作为字符串
    Dim dteFile As Date,dteFileSecond1 As Date,dteFileFirst As Date,DTEFILESCOND As Date
    Dim openLastFile
    '设置文件系统对象
    Set FileSys=New FileSystemObject
    设置myFolder=FileSys.GetFolder(目录)
    dteFileSecond1=DateSerial(1900,1,1)
    dteFile=DateSerial(1900,1,1)
    '循环遍历每个文件并获取上次修改的日期。如果是最大日期,则存储文件名
    对于myFolder.Files中的每个objFile
    对于myFolder.Files中的每个objFile1
    '以防止打开临时文件
    如果objFile1.Name像“*.xlsx”并向左(objFile1.Name,2)“~$”那么
    如果objFile1.DateLastModified>objFile.DateLastModified,则
    dteFileSecond=objFile.DateLastModified
    strfilenamessecond=objFile.Name
    dteFileFirst=objFile1.DateLastModified
    strFilenameFirst=objFile1.Name
    '如果第二个文件日期大于当前第二个文件,则存储为第二个文件
    如果dteFileSecond>dteFileSecond1,则
    dteFileSecond1=objFile.DateLastModified
    strFilenameSecond1=objFile.Name
    如果结束
    如果结束
    如果结束
    下一个
    下一个objFile
    Set secodlastmedited=Workbooks.Open(目录&“\”&strFilenameSecond1)
    Set FileSys=Nothing
    设置myFolder=Nothing
    端函数
    
    最初的答案对我不起作用,原因有二

  • fileArr(i,2)未声明为日期,有时Excel无法解释较大的日期。当我试图将此设置为日期时,它说我无法设置数组的暗显
  • 如果包含临时文件,则不会跳过这些文件
  • 这是对我有用的东西

    Function SecodLastModified(Directory)
    
    Dim FileSys As FileSystemObject
    Dim objFile As File, objFile1 As File
    Dim myFolder
    Dim strFilename As String, strFolder As String, myDir As String
    Dim strFilenameFirst As String, strFilenameSecond As String, strFilenameSecond1 As String
    Dim dteFile As Date, dteFileSecond1 As Date, dteFileFirst As Date, dteFileSecond As Date
    Dim openLastFile
    
    'set up filesys objects
    Set FileSys = New FileSystemObject
    Set myFolder = FileSys.GetFolder(Directory)
    
    dteFileSecond1 = DateSerial(1900, 1, 1)
    dteFile = DateSerial(1900, 1, 1)
    'loop through each file and get date last modified. If largest date then store Filename
    For Each objFile In myFolder.Files
        For Each objFile1 In myFolder.Files
            ' To prevent opening temporary files
            If objFile1.Name Like "*.xlsx" And Left(objFile1.Name, 2) <> "~$" Then
                If objFile1.DateLastModified > objFile.DateLastModified Then
                    dteFileSecond = objFile.DateLastModified
                    strFilenameSecond = objFile.Name
                    dteFileFirst = objFile1.DateLastModified
                    strFilenameFirst = objFile1.Name
                    ' If second file date is greater than current second file, store away as the second file
                    If dteFileSecond > dteFileSecond1 Then
                        dteFileSecond1 = objFile.DateLastModified
                        strFilenameSecond1 = objFile.Name
                    End If
                End If
            End If
        Next
    Next objFile
    
    Set SecodLastModified = Workbooks.Open(Directory & "\" & strFilenameSecond1)
    Set FileSys = Nothing
    Set myFolder = Nothing
    End Function
    
    函数secodlastmedited(目录)
    将文件系统设置为FileSystemObject
    Dim objFile作为文件,objFile1作为文件
    调暗我的文件夹
    Dim strFilename作为字符串,strFolder作为字符串,myDir作为字符串
    Dim strFilenameFirst作为字符串,strFilenameSecond作为字符串,strFilenameSecond1作为字符串
    Dim dteFile As Date,dteFileSecond1 As Date,dteFileFirst As Date,DTEFILESCOND As Date
    Dim openLastFile
    '设置文件系统对象
    Set FileSys=New FileSystemObject
    设置myFolder=FileSys.GetFolder(目录)
    dteFileSecond1=DateSerial(1900,1,1)
    dteFile=DateSerial(1900,1,1)
    '循环遍历每个文件并获取上次修改的日期。如果是最大日期,则存储文件名
    对于myFolder.Files中的每个objFile
    对于myFolder.Files中的每个objFile1
    '以防止打开临时文件
    如果objFile1.Name像“*.xlsx”并向左(objFile1.Name,2)“~$”那么
    如果objFile1.DateLastModified>objFile.DateLastModified,则
    dteFileSecond=objFile.DateLastModified
    strfilenamessecond=objFile.Name
    dteFileFirst=objFile1.DateLastModified
    strFilenameFirst=objFile1.Name
    '如果第二个文件日期大于当前第二个文件,则存储为第二个文件
    如果dteFileSecond>dteFileSecond1,则
    dteFileSecond1=objFile.DateLastModified
    strFilenameSecond1=objFile.Name
    如果结束
    如果结束
    如果结束
    下一个
    下一个objFile
    Set secodlastmedited=Workbooks.Open(目录&“\”&strFilenameSecond1)
    Set FileSys=Nothing
    设置myFolder=Nothing
    端函数
    
    这很好,但这里的要点是我不想使用Sort或Max等方法,请看,当我得到最后修改的文件时,我可以使用Max函数。谢谢谢谢,这很好,但这里的重点是我不想使用像Sort或Max这样的方法,当我得到最后修改的文件时,我可以使用Max函数。谢谢你,这真是太好了