VBA中的特殊复制粘贴

这是使用VBA的复制粘贴问题。 我基本上想从许多不同的工作簿中获取一个数字。 我的问题是这个数字正在不断更新,所以我不认为如果不打开工作簿,我可以拥有最后一个数字。 工作簿很大,需要时间来打开和加载数据(从外部数据源(bloomberg)获取数据)。 我的第一个线索是打开工作簿,然后让他们充电,然后从中获取数据。 我的问题是,我需要设置一个计时器(并让我的工作簿加载),并在此计时器中,我的工作簿不能上传数据,所以我结束了我的旧数据…

所以我find的唯一的解决办法是做两个不同的macros。 一打开所有的工作簿,然后第二closures并保存它,并从中抓取数据…

你们有更好的主意吗?

我的问题是,工作簿是如此之大,我需要打开他们5最大5,每次都做…

我复制粘贴你我的代码,我知道这是非常基本的,如果你想任何更好的代码或方式使其工作,请让我知道。

Sub OpenWorkbooks() workbooks.Open Filename :="C/.../file1.xlsx" workbooks.Open Filename :="C/.../file2.xlsx" workbooks.Open Filename :="C/.../file3.xlsx" . . End sub 

现在要closures,然后复制粘贴其他人写的值。

 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 – closures所有,并保存所有,并复制数字…但我需要批量的原因,如果我打开它所有的崩溃…

我的另一个问题是,我怎么能使代码更好? 最终,我想在我的开放工作簿中有一个电子表格,在这里我将拥有打开和复制/粘贴每个工作簿的所有path。 那么我想要一个循环path的macros,打开工作簿等待(但计时器不工作…),然后复制粘贴并closures。

该altrnative总是循环的path,但块。 我将把所有的path放在单元格A1:A10上,我可以有一个循环打开A1:A10中的path,然后第二个macrosclosures并保存工作簿,path为A1:A10

任何想法都欢迎,

谢谢

 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 

这似乎在closures之前完成了查询,但是您也可以尝试取消选中启用后台刷新,这将确保在执行其他操作之前更新数据。

在这里输入图像说明

你可以用不同的方式实现这一点。 一种是将值存储在工作表或数据库中,每次要刷新并获取新值时,都会将新值与旧值进行比较,如果值不同(单元格值肯定更新),请继续执行代码。 只是为了让代码摆脱等待,你应该设置一个最长的时间,如过期时间。 我会做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中断,在返回macros之前处理所有未决事件。 这意味着它将从外部资源刷新您的工作簿,然后继续执行其余的代码。

如果您使用的是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