-1

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

例如。

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);

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

4

2 回答 2

1

如果您可以打开工作簿

您可以使用该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) 你的意思是 cell A1

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

解决方案的两个来源:https ://exceljet.net/formula/dynamic-workbook-reference和https://www.contextures.com/xlFunctions05.html如果您想进一步阅读或微调/麻烦-拍摄公式。

但是,如上所述,该INDIRECT功能仅在另一个工作簿打开时才有效。如果您关闭源工作簿,并F9在工作簿中执行所有结果(或重新打开),您将#REF!再次获得结果,因此我建议您在获得结果后复制/粘贴为值。
另请参见此处:使用 INDIRECT 在关闭的 Excel 工作簿中引用值?

已关闭工作簿的解决方法

该解决方案基本上会将对其他工作簿的直接单元格引用创建为文本字符串,然后您将其复制/粘贴为值,然后您可以单击每个单元格,因此公式会“激活”并从中获取结果另一个工作簿,或者您使用 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,将显示来自不同工作簿的所有值。

于 2018-11-26T09:17:13.997 回答
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
于 2018-11-26T09:40:14.997 回答