【发布时间】:2017-12-05 16:33:35
【问题描述】:
这是一个使用 VBA 的复制粘贴问题。我基本上想从许多不同的工作簿中获取一个数字。我的问题是这个号码在不断更新,所以我认为如果不打开工作簿,我就无法拥有该号码的最后一个版本。 工作簿很大,打开和加载数据(从外部来源 (bloomberg) 获取数据)需要时间。 我的第一个线索是打开工作簿,然后让它们充电,然后从中获取数据。我的问题是,我需要设置一个计时器来这样做(并让我的工作簿加载),在这个计时器期间,我的工作簿无法上传数据,所以我最终得到了我的旧数据......
所以我找到的唯一解决方案是执行两个不同的宏。一个打开所有工作簿,然后第二个关闭并保存并从中获取数据...
你们有更好的主意吗?
我的问题是,工作簿太大了,我需要最多 5 x 5 打开它们,并且每次都这样做......
我复制粘贴我的代码,我知道这是非常基本的,如果您想到任何更好的代码或使其工作的方法,请告诉我。
Sub OpenWorkbooks()
workbooks.Open Filename :="C/.../file1.xlsx"
workbooks.Open Filename :="C/.../file2.xlsx"
workbooks.Open Filename :="C/.../file3.xlsx"
.
.
End sub
现在关闭然后复制粘贴其他人写入的值。
Sub GetNumber()
Dim wWbPath As String, WbName As String
Dim WsName As String, CellRef As String
Dim Ret As String
Workbooks("file1").Close SaveChanges:=True
wbPath = "C:/etc...."
WbName = "file1.xlsx"
WsName = "Sheet1"
CellRef = "AD30"
arg = "'" & wbPath & "[" & wbName & "]" & _
wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
Worksheets("Sheet1").Range("A1") = ExecuteExcel4Macro(arg)
End sub
如前所述,您认为有更好的方法吗?我想为每个文件执行整个步骤,但我不能因为计时器停止刷新我的电子表格,我需要一个计时器,因为我的工作表需要时间来加载。 所以1-全部打开,2-全部关闭并保存并复制数字...但是我需要批量执行,因为如果我打开所有它会崩溃...
我的另一个问题是,我怎样才能使代码更好?最终,我希望在我打开的工作簿中有一个电子表格,其中我将拥有每个工作簿打开和复制/粘贴的所有路径。然后我想要一个循环路径的宏,打开工作簿等待(但计时器不起作用......)然后复制粘贴并关闭。
替代方案总是循环路径,但按块循环。我会将所有路径放在单元格 A1:A10 上,我可以有一个循环打开 A1:A10 中存在的路径,然后第二个宏关闭并使用 A1:A10 中的路径保存工作簿
欢迎任何想法,
谢谢
【问题讨论】:
-
这个随便吧,不过很多语言都可以打开excel文件。您可能会发现以编程方式与另一种语言(可能是 python)交互的过程比为 Excel 本身编写宏要容易得多。这看起来像是对 python 的一个很好的介绍:automatetheboringstuff.com/chapter12.
-
@DanFarrell 感谢您的回复!不幸的是,它需要是 VBA 应用程序 Button 类型,因为我不会成为它的用户......我也更喜欢 Python......
-
我们需要更多信息,但从你所写的内容来看,我认为你让事情变得困难。您应该只有一个代码可以一一打开工作簿并复制您需要的任何数据。这样,您将获得更新的数据,并且不需要太多内存。当您打开工作簿时,它们是否连接到一些需要更新的外部资源?
-
@Ibo 谢谢你的回复 那是我的问题。工作簿需要时间来刷新,因为真实的提要数据来自外部源。所以我需要设置一个计时器,以确保在我的宏副本的第二部分过去之前,工作簿可以很好地更新。问题是......在这个计时器期间,我的工作簿停止刷新。如果我设置了 10 秒的单圈时间,在这 10 秒内,我的工作簿也将停止刷新......所以不可能那样......
-
@DanFarrell 很难说使用 Python 自动化 Office 比使用 VBA 更容易。这就是 VBA 的目的。事实上,这可以说是 VBA 比 Python 更擅长的唯一项。