如何使用多个文本文件初始化数组 - VBA

时间:2016-03-15 01:22:31

标签: arrays excel vba excel-vba multiple-files

尝试创建循环以打开活动工作簿文件夹中的每个.txt文件,以便能够从每个.txt文件中提取数据。

(来自.txt文件的数据将用于初始化数组)

我创建的当前代码为代码行提供了编译错误Invalid Use of Property
folder2 = ActiveWorkbook.path

我知道folder2被定义为Folder数据类型,因此分配字符串ActiveWorkbook.path变量(以查找当前工作文件夹位置)很可能导致问题。

通过活动工作簿文件夹中的所有.txt文件(或引用工作簿文件夹路径的正确方法)的正确方法是什么?

参考: How to import all text files from a folder

有问题的代码段:

' Loop thru all files in the folder
    folder = ActiveWorkbook.path

    path = folder & "\*.txt"

    Filename = Dir(path)

    ' Get a FileSystem object
    Set fso = New FileSystemObject

    ' get the directory you want
    folder2 = ActiveWorkbook.path

    For Each file In folder.Files

        Set FileText = file.OpenAsTextStream(ForReading)

完整代码:

Option Explicit

Sub Initialize_barcode_lookup_Array()

 Dim fso As FileSystemObject
 Dim folder As String, path As String, count_txt_files As Long, Filename As String
 Dim folder2 As folder
 Dim file As file
 Dim FileText As TextStream
 Dim TextLine As String
 Dim Items() As String
 Dim i As Long, j As Long, k As Long
 Dim cl As Range

 Dim shipping_plan As Long      'Number of shipping plans text files imported
 Dim barcode_lookup() As String
 Dim lastRow As Long
 Dim longest_lastRow As Long
 Dim counter As Long
 Dim FNSKU_Input As String


    'Count the number of files in working directory ( - 1, for the Excel spreadsheet)
        folder = ActiveWorkbook.path

        path = folder & "\*.txt"

        Filename = Dir(path)

        Do While Filename <> ""
            count_txt_files = count_txt_files + 1
                Filename = Dir()
        Loop

        'Range("Q8").Value = count
        MsgBox count_txt_files & " : files found in folder"


    'Define longest_lastRow
    longest_lastRow = 0

    'Define i
    i = 0

    ' Loop thru all files in the folder
    folder = ActiveWorkbook.path

    path = folder & "\*.txt"

    Filename = Dir(path)

    ' Get a FileSystem object
    Set fso = New FileSystemObject

    ' get the directory you want
    folder2 = ActiveWorkbook.path 'fso.GetFolder("D:\YourDirectory\")

    For Each file In folder.Files

        Set FileText = file.OpenAsTextStream(ForReading)

        'Define lastRow
        lastRow = Range("A1").End(xlDown).Row   'Last row of the data set

           'Make sure longest_lastRow is the largest value found of lastRow within all _
           'shipping plan .txt files
           If lastRow > longest_lastRow Then longest_lastRow = lastRow

        'Redimension Array barcode_lookup()
        ReDim barcode_lookup(count_txt_files - 1, longest_lastRow, 9)

        ' Read the file one line at a time
        Do While Not FileText.AtEndOfStream
            TextLine = FileText.ReadLine
            cl = TextLine

            'Initialize Array
                For j = 0 To (lastRow - 1) 'UBound(barcode_lookup(lastRow - 1))
                    For k = 0 To 9
                        barcode_lookup(i, j, k) = cl
                        cl = cl.Offset(0, k + 1).Value
                    Next k
                    'Set cl one row down, and set column back to 0
                    cl = cl.Offset(j + 1, k - 9)
                Next j
        Loop

        ' Clean up
        FileText.Close

        i = i + 1
    Next file

    Set FileText = Nothing
    Set file = Nothing
    Set folder2 = Nothing
    Set fso = Nothing

End Sub

1 个答案:

答案 0 :(得分:1)

尝试使用GetFolder命令获取文件夹:

set folder2 = fso.getfolder(ActiveWorkbook.path)

由于它是一个对象变量,因此需要Set命令。

(另请注意,文件夹是FSO中的保留名称,因此您可能希望使用不同的变量名称,以避免混淆和可能的错误。)