从多个excel工作簿中提取和编译数据

zzlelutf  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(113)

我很难将许多工作簿的列提取到一个编译文件中,在该文件中我绘制了编译数据的图表...困难在于,如果我没有打开工作簿,则引用的文件不起作用。其次,我尝试过打开和复制值(通过VBA),但是这是非常慢的...而且有时这两种方法都不起作用。即使我也使用了完整的文件路径和文件名(与Dir()和一切...)。不管出于什么原因,这里呈现的这段代码工作起来要快得多,但只有在工作簿打开的情况下。
我想部分原因是我不熟悉从其他工作簿中提取和编译数据的最佳方法...对于任何提示都会很棒!:)dbugprints只是为了概述一切都按预期运行。

Sub hente_inn_celleverdier_original()
'Filenames are listed here: (165 + i, 8) (H166 and underneath) *Edit: wrote wrong celladdress here (G166), fixed now...*
'In the target files, EP23 and EQ23 tells the number of cells in that column/list extempting: "", blank, etc.
'(7, 263 + 2 * i [= 265]) is the upper left cell in the table which we are filling in the compilation file…
Application.ScreenUpdating = False
For i = 1 To 38 '=Number of series(number of files I am extracting these values from) 

Debug.Print (Cells(165 + i, 8)) ' Prints filename (except part with filetype &".xlsx")
A = Workbooks(Cells(165 + i, 8) & ".xlsx").Sheets(1).Range("EP23")
Debug.Print A' Prints number from EP23.
Cells(7, 263 + 2 * i).Value2 = "='[" & Cells(165 + i, 8) & ".xlsx]CPTU'!EP28"
Cells(7, 263 + 2 * i).Select
Selection.AutoFill Destination:=Range(Cells(7, 263 + 2 * i), Cells(6 + A, 263 + 2 * i)),Type:=xlFillDefault

B = Workbooks(Cells(165 + i, 8) & ".xlsx").Sheets(1).Range("EQ23")
Debug.Print B' Prints number from EQ23.
Cells(7, 264 + 2 * i).Value2 = "='[" & Cells(165 + i, 8) & ".xlsx]CPTU'!EQ28"
Cells(7, 264 + 2 * i).Select
Selection.AutoFill Destination:=Range(Cells(7, 264 + 2 * i), Cells(6 + B, 264 + 2 * i)), Type:=xlFillDefault
Next 'i
Application.ScreenUpdating = True
End Sub
vi4fp9gy

vi4fp9gy1#

我很乐意按照您的要求提供一个示例。我不太明白您在提供的代码中做了什么,但我会尝试改编这个示例
首先,在所有内容之上声明类型组,包括任何sub(就像处理公共变量一样):

Type WInfo
  WName as string
  WNum as long 'or double, if it is not an integer
end Type

然后在一个sub中设置一个特殊的变量,设置你认为需要的最大条目数(在你的例子中是38个,但是为了确定,我们假设是200个)

Sub hente_inn_celleverdier_original()
Dim WIn(200) As WInfo

填充WName变量...

for i = 1 to 38
  WIn(i - 1).WName = Workbooks(Cells(165 + i, 8) & ".xlsx").Sheets(1).Range("EP23")'The entries begin un No.0 with this method
next i

你可以用一个循环调用WIn(i - 1).WName中的值。WIn(0).WName将是第一个工作簿的名称,WIn(1).WName是下一个...所以不需要复制粘贴。
下一步是找到获取每个工作簿信息的方法。例如,声明一个函数,从[本视频][1]中使用的关闭的工作簿获取信息。不要使用“A”变量,而是使用另一个for i = 1循环,填充Type组的WIn(i - 1).WNUM变量。

相关问题