【问题标题】:Excel vba: Import multiple text files, and move files after import?Excel vba:导入多个文本文件,并在导入后移动文件?
【发布时间】:2015-05-05 11:35:59
【问题描述】:

我真的希望有人可以帮助解决这个问题。目前我正在使用 vba 将文本文件中的每一行文本导入一行的新列中。每次我运行该函数时,都会在前一行下方创建一个新数据行。

结果:

Row 1 (Showing Data from TextFile 1)
Column A     Column B           Column C
Data         Data               Data

Row 2 (Showing Data from TextFile 2)
Column A     Column B           Column C
Data         Data               Data

所以这一切都很好,在我从文件中导入文本后,文件从我的目录“unactioned”移动到一个名为“actioned”的目录。

所以目前我的代码还没有完成,我目前必须定义文本文件名,以便我可以将文本文件中的数据导入到我的电子表格中,然后我再次定义我想要的文本文件名要移动,此代码目前仅适用于 1 个文本文件。但是我想要做的是,如果我的文件夹“未执行”中有几个文本文件,那么我想将这些文本文件中的每一个导入一个新行,并移动我们刚刚导入数据的所有文本文件从到我的文件夹同时“行动”

这是我的代码:

Sub ImportFile()

    Dim rowCount As Long

    rowCount = ActiveSheet.UsedRange.Rows.Count + 1

    If Cells(1, 1).Value = "" Then rowCount = 1


    Close #1
    Open "Y:\Incident Logs\Unactioned\INSC89JH.txt" For Input As #1
    A = 1
     Do While Not EOF(1)
            Line Input #1, TextLine
            Cells(rowCount, A) = TextLine
            A = A + 1
        Loop
    Close #1


 Dim d As String, ext, x
Dim srcPath As String, destPath As String, srcFile As String
srcPath = "Y:\Incident Logs\Unactioned\"
destPath = "Y:\Incident Logs\Actioned\"
ext = Array("*.txt", "*.xls")
For Each x In ext
    d = Dir(srcPath & x)
        Do While d <> ""
            srcFile = srcPath & d
            FileCopy srcFile, destPath & d
            Kill srcFile
            d = Dir
        Loop
Next


End Sub

请有人告诉我如何修改这段代码来做我需要它做的事情?提前致谢

【问题讨论】:

    标签: excel text import


    【解决方案1】:

    我建议将您的代码分解为多个函数。

    您可以将 ImportFile 方法更改为不杀死所有文件,而只杀死它所操作的文件,然后让它一次操作一个特定文件。例如:

    Sub ImportFile(directory As String, filename As String)
        Dim rowCount As Long
        rowCount = ActiveSheet.UsedRange.Rows.Count + 1
        If Cells(1, 1).Value = "" Then rowCount = 1
    
        Close #1
        Open directory & filename For Input As #1
        A = 1
         Do While Not EOF(1)
                Line Input #1, TextLine
                Cells(rowCount, A) = TextLine
                A = A + 1
            Loop
        Close #1
    
        'Move the file and delete it
        Dim srcPath As String, destPath As String
        srcPath = directory & filename
        destPath = "C:\Incident Logs\Actioned\" & filename
        FileCopy srcPath, destPath
        Kill srcPath
    End Sub
    

    然后,这是how to iterate files in a folder 上的另一个 stackoverflow 帖子

    因此,稍作调整,您就可以得到类似的东西:

    Sub ImportAllFiles()
        ImportFilesWithExtension "*.txt"
        ImportFilesWithExtension "*.xls*"
    End Sub
    
    Sub ImportFilesWithExtension(extension As String)
        Dim StrFile As String, myDir As String
        myDir = "C:\Incident Logs\Unactioned\"
        StrFile = Dir(myDir & extension)
        Do While Len(StrFile) > 0
            ImportFile myDir, StrFile
            StrFile = Dir
        Loop
    End Sub
    

    【讨论】:

      【解决方案2】:

      我也会把它分解成函数:

      Sub ImportFile()
      
          Dim rLastCell As Range
          Dim vFolder As Variant
          Dim vFile As Variant
          Dim colFiles As Collection
      
      
          With ThisWorkbook.Worksheets("Sheet1") 'Note - update sheet name.
      
              'First find the last cell on the named sheet.
              Set rLastCell = .Cells.Find( _
                  What:="*", _
                  LookIn:=xlValues, _
                  SearchDirection:=xlPrevious)
      
              If rLastCell Is Nothing Then
                  'Set LastCell to A2.
                  Set rLastCell = .Cells(2, 1)
              Else
                  'Set LastCell to column A, last row + 1
                  Set rLastCell = .Range(rLastCell.Row + 1, 1)
              End If
      
              vFolder = GetFolder()
              Set colFiles = New Collection
      
              EnumerateFiles vFolder, "\*.txt", colFiles
      
              For Each vFile In colFiles
                  'Do stuff with the file.
      
                  'Close the file and move it.
                  MoveFile CStr(vFile), "S:\Bartrup-CookD\Text 1\" & Mid(vFile, InStrRev(vFile, "\") + 1, Len(vFile)) 'Note - update folder name.
              Next vFile
      
          End With
      
      End Sub
      

      这会将所有文件放入一个集合中:

      Sub EnumerateFiles(ByVal sDirectory As String, _
          ByVal sFileSpec As String, _
          ByRef cCollection As Collection)
      
          Dim sTemp As String
      
          sTemp = Dir$(sDirectory & sFileSpec)
          Do While Len(sTemp) > 0
              cCollection.Add sDirectory & "\" & sTemp
              sTemp = Dir$
          Loop
      End Sub
      

      这将要求您选择一个文件夹:

      ' To Use    : vFolder = GetFolder()
      '           : vFolder = GetFolder("S:\Bartrup-CookD\Customer Services Phone Reports")
      Function GetFolder(Optional startFolder As Variant = -1) As Variant
          Dim fldr As FileDialog
          Dim vItem As Variant
          Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
          With fldr
              .Title = "Select a Folder"
              .AllowMultiSelect = False
              If startFolder = -1 Then
                  .InitialFileName = Application.DefaultFilePath
              Else
                  If Right(startFolder, 1) <> "\" Then
                      .InitialFileName = startFolder & "\"
                  Else
                      .InitialFileName = startFolder
                  End If
              End If
              If .Show <> -1 Then GoTo NextCode
              vItem = .SelectedItems(1)
          End With
      NextCode:
          GetFolder = vItem
          Set fldr = Nothing
      End Function
      

      这会将文件从文件夹 A 移动到文件夹 B:

      '----------------------------------------------------------------------
      ' MoveFile
      '
      '   Moves the file from FromFile to ToFile.
      '   Returns True if it was successful.
      '----------------------------------------------------------------------
      Public Function MoveFile(FromFile As String, ToFile As String) As Boolean
      
          Dim objFSO As Object
      
          Set objFSO = CreateObject("Scripting.FileSystemObject")
      
          On Error Resume Next
          objFSO.MoveFile FromFile, ToFile
          MoveFile = (Err.Number = 0)
          Err.Clear
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多