如何引用文件,每个文件都位于不同的文件夹中?

时间:2018-11-26 09:00:32

标签: excel vba

我有100个Excel文件,每个文件都位于驱动器的diffrent文件夹中。

例如。

file 1 = C:\DATA_DIR\TEST_1\2018_11_26.0001\Excel.xlsx  
file 2 = C:\DATA_DIR\TEST_1\2018_11_26.0002\Excel.xlsx 
file 3 = C:\DATA_DIR\TEST_1\2018_11_26.0003\Excel.xlsx
.
.
.
file 100 = C:\DATA_DIR\TEST_1\2018_11_26.0100\Excel.xlsx

在每个Excel文件中,数据位于cell (1,1)

我想从每个Excel文件中获取数据,并将其保存在一个列中的一个Excel文件中。

我拥有的代码足以应付少量数据,

a=xlsread('K:\Repeatability\C1X\2018-11-07.0001\Radial_Accuracy.xlsx'); 

b=xlsread('K:\Repeatability\C1X\2018-11-07.0002\Radial_Accuracy.xlsx'); 

N=[a(1:1,:) ; b(1:1,:)] 
xlswrite('K:\Repeatability_Test\New.xlsx',N);

在这种情况下以及将来,我将拥有大量数据。我不想指定每个文件夹的位置。

2 个答案:

答案 0 :(得分:0)

以防您可以打开工作簿

您可以使用INDIRECT函数。
在A列中,您将自动填充数字1到100。
在B列中,输入以下公式,将其复制下来:
=INDIRECT("'C:\DATA_DIR\TEST_1\[2018_11_26.0"&TEXT(A1,"000")&"\Excel.xlsx]Sheet1'!$A$1")

我使用Sheet1作为工作表的名称,但是您必须使用实际名称进行更改。我以为cell(1,1)是指单元格A1

下一步,我将选择B列,然后将结果复制/粘贴为C列中的值,以摆脱对其他excel文件的100个引用,这将减慢打开或重新计算每次工作簿。

该解决方案的两个来源:https://exceljet.net/formula/dynamic-workbook-referencehttps://www.contextures.com/xlFunctions05.html,如果您想进一步阅读或对公式进行微调/故障排除。

但是,如上所述,INDIRECT函数仅在打开另一个工作簿时才起作用。如果关闭源工作簿,并在工作簿中对所有结果进行F9处理(或再次重新打开),则会再次得到#REF!,因此,我建议复制/粘贴获得结果后,按值进行赋值。
另请参见:Referencing value in a closed Excel workbook using INDIRECT?

已关闭工作簿的解决方法

该解决方案基本上将对其他工作簿的直接单元格引用创建为文本字符串,然后将其复制/粘贴为值,然后单击每个单元格,因此该公式将被“激活”并得到您从其他工作簿中获得的结果,或者使用Excel的“文本到列”功能并自动执行此操作。

一些细节。再次假设您在A列中有1到100之间的数字。将其放在B1中:="='C:\DATA_DIR\TEST_1\[2018_11_26.0"&TEXT(A1,"000")&"\Excel.xlsx]Sheet1'!$A$1"并向下复制。

现在,您必须选择此范围(或整个B列),然后将值粘贴为C列。如果现在单击单元格C1并点击Enter,您将看到公式执行后,您会看到实际结果(即另一个工作簿中的值)。如果您有很多单元格,这将非常麻烦,因此只需选择列C,转到Data > [Data Tools] Text To Columns,单击Finish,就会显示不同工作簿中的所有值。

答案 1 :(得分:0)

Public Sub NonRecursiveMethod()

    Dim fso, oFolder, oSubfolder, oFile, queue As Collection
    Dim wbk As Workbook
    Dim sht As Worksheet
    Dim counter As Long

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set queue = New Collection
    queue.Add fso.GetFolder("C:\DATA_DIR\TEST_1\")

    Set sht = ActiveSheet

    counter = 1

    Do While queue.Count > 0
        Set oFolder = queue(1)
        queue.Remove 1

        For Each oSubfolder In oFolder.SubFolders
            queue.Add oSubfolder
        Next oSubfolder

        For Each oFile In oFolder.Files
            Workbooks.Open Filename:=oFile
            sht.Cells(counter, 1).Value = Cells(1, 1).Value
            counter = counter + 1
            ActiveWorkbook.Close savechanges:=False
        Next oFile
    Loop

End Sub