这是使用VBA的复制粘贴问题。我基本上想从许多不同的工作簿中获取一个数字。我的问题是这个数字正在迅速更新,所以我认为如果不打开工作簿,我就不能拥有该数字的最后一个数字。 工作簿很大,需要时间来打开和加载数据(从外部源(bloomberg)获取数据)。 我的第一个线索是打开工作簿,然后让他们收费,然后从中获取数据。我的问题是,我需要设置一个计时器来执行此操作(并让我的工作簿加载)并且在此计时器期间我的工作簿无法上传数据,因此我最终得到了我的旧数据......
所以我发现的唯一解决方案是做两个不同的宏。一个打开所有工作簿,然后第二个关闭并保存并从中获取数据......
你们有更好的主意吗?
我的问题是,工作簿太大了我需要打开5到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
如上所述,您认为有更好的方法吗?我想为每个文件执行整个步骤,但我不能,因为计时器停止刷新我的spreadhseet,我需要一个计时器,因为我的工作表需要时间加载。 所以1 - 打开全部,2-全部关闭并保存所有并复制数字...但是如果我打开所有崩溃的话我需要批量处理...
我的另一个问题是,我怎样才能让代码变得更好?最后,我希望在我的开放式工作簿中有一个电子表格,我可以在其中打开并复制/粘贴每个worbook的所有路径。然后我想要一个循环路径的宏,打开工作簿等待(但计时器不工作......)然后复制粘贴并关闭。
altrnative总是循环路径但是按块。我将所有路径放在单元格A1:A10上,我可以有一个循环打开A1:A10中的路径,然后第二个宏关闭并保存工作簿,路径为A1:A10
欢迎任何想法,
谢谢
答案 0 :(得分:1)
您可以通过不同方式实现这一目标。一种是将值存储在工作表或数据库中,每次要刷新并获取新值时,将新值与旧值进行比较,如果不同(单元格值确定更新),则继续执行代码。只是为了让代码不再等待你应该设置一个最长时间,就像一个到期时间。我会做20次迭代,每次5秒。所以基本上你应该在你的代码中有这样的设置:
for i=1 to 20
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 5
waitTime = TimeSerial(newHour, newMinute, newSecond)
' ~~> get new value here and compare it to the old value
next i
Application.Wait waitTime
if newValue<>oldValue then
exit for
else
'do nothing, just wait
end if
或者你可以简单地让Windows控制,完成任务并继续:
'~~> your code here before refresh
Activeworkbook.RefreshAll
DoEvents
'~~> rest of your code here after refresh
DoEvents
让Windows暂时从Macro中断处理所有待处理事件,然后再返回宏。这意味着它将从外部资源刷新您的工作簿,然后继续执行其余的代码。
如果您使用的是Excel 2010及更高版本,则可以使用比DoEvents更好的控件:
ThisWorkbook.RefreshAll 'or activeworkbook, choose as you need
Application.CalculateUntilAsyncQueriesDone 'the code execution will halt here until the refresh job is done
答案 1 :(得分:1)
Sub testopenRefreshClose()
Call openRefreshClose("C/.../file1.xlsx")
Call openRefreshClose("C/.../file1.xlsx")
End Sub
Sub openRefreshClose(wbPathName As String)
Dim wb As Workbook
Set wb = Workbooks.Open(wbPathName) ' open and assign to workbook object
wb.RefreshAll ' refresh the data
wb.Close SaveChanges:=True ' close the workbook
End Sub
这似乎是在关闭之前完成运行查询,但您也可以尝试取消选中启用后台刷新,这将确保在采取其他操作之前更新数据。