【问题标题】:How to reference files, each in a different folder?如何引用文件,每个文件都在不同的文件夹中?
【发布时间】:2018-11-26 09:00:31
【问题描述】:

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

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

【问题讨论】:

  • 您可以使用excel vba将这些数据绘制并输出到一个excel文件中
  • 欢迎来到 Stack Overflow。请注意,由于这不是免费的代码编写服务,因此有必要显示您迄今为止尝试过的内容以及遇到的问题或错误(通过显示您的代码),或者至少显示您的研究内容和所做的努力.否则,它只是要求我们为您完成所有工作。阅读How to Ask 可能会帮助您改进您的问题。
  • @KetanSahu 正如我在评论中所说,请edit 您的问题并添加您已有的代码。如果我们能看到您已经做了什么,我们只能帮助改进该代码。
  • 嘿@Pᴇʜ,正如我在问题中所说,我有一个用于处理少量数据的代码。但是,我被更多的数据困住了。我不知道该怎么做。我之前在这里使用的少量数据 id 的代码。 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);
  • 完成,更新:D

标签: excel vba


【解决方案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 作为工作表的名称,但是您必须使用实际名称进行更改。我假设使用单元格(1,1)你的意思是单元格A1。

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

解决方案的两个来源:https://exceljet.net/formula/dynamic-workbook-reference 和 https://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,就会出现来自不同工作簿的所有值。

【讨论】:

  • 你好@peter,谢谢你的回复。我理解你的代码,但它没有在我的文件中显示任何价值。只显示#REF!。我检查了一切,但没有得到如何纠正它。顺便说一句,我很感谢您的帮助。亲切的问候,科坦
  • @KetanSahu 文件需要打开,但我正在使用替代(解决方法)解决方案更新我的答案。
  • @KetanSahu 变通解决方案对您有用吗?
  • 不幸的是没有,然后我不得不放弃这项工作。但是,我非常感谢您的努力和建议。谢谢:D
  • @KetanSahu 很抱歉听到这个消息。如果您想详细说明为什么/如何对您不起作用,请告诉我,所以也许我可以提供帮助。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-08
    • 2021-05-27
    • 2021-12-19
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多