3

我正在使用excel做一些数据分析工作。场景是这样的:我使用一些 excel 插件组件从远程站点获取数据。例如,=get_the_latest_data(ID)输入A1,则调用此函数,并将 ID 的数据A2填入A11。我的目标是

for each id in id_array
    sheet1.range("a1") = get_the_latest_data(id)
    create a new sheet named id
    save data from a2 to a11 to thi new sheet
next

我的问题是函数需要一些时间get_the_latest_data才能从远程获取所有数据。因此,在我的代码中,新工作表无法获得正确的结果。在将数据从 sheet1 复制到新工作表之前,我尝试使用 application.wait。但它没有用。

有什么方法可以确保在从远程获取所需数据后将数据复制到新工作表中?顺便说一句,我无权访问get_the_latest_data.

4

2 回答 2

3

通常,VBA 仅在前一步完全完成后才执行下一步。除非调用触发了一些后台操作(例如,刷新启用了“后台刷新”的数据连接。

您可以执行以下操作来解决问题:

禁用后台刷新:如果您查看连接的属性,请取消选择“启用后台刷新”

等到刷新完成数据查询特定检查:通过以下方式修改您的代码:

    Range("A11").Clear '启用检查
    subCallToTriggerDataLoadHere
    While Range("A11").Value "" ' 或任何其他特定检查以查看您的刷新是否完成
        做事件
    文德
    ...

使用查询的 AfterRefresh 事件: 有关详细信息,请参阅此帖子

于 2013-01-16T07:20:33.557 回答
0

这似乎是第三方数据供应商的典型案例,他们的泛型数据请求是ashynchronus的,这对用户的公开程度不是很好。在这种情况下,您可能需要与您的供应商核实您正在调用的方法的行为。必须至少设置某种boolean类型的变量以选择具有异步或同步请求/检索。

例如。如果您要发送一个索引代码以获得前 10 名成员,那么此方法现在正在收集您的所有索引代码并用所有数据回击您。因此,请检查返回的数据是否可以拆分,例如它是一个多维数组,您可以根据id. 否则,请与此应用程序的 API 开发人员交谈,因为DoEvents他们可能太弱而无法处理此问题。


我建议您使用 anarrayList/collection 项来保存从您的方法返回的每个 id 的数据。完成后,您可以开始创建工作表,因为您已经在本地捕获了数据。

Dim al as Object

Set al = CreateObject("System.Collections.ArrayList")
for each id in id_array
    al.add get_the_latest_data(id) '--possibly returning a variant
next

'--for each item in arrayList then you create a sheet by outputing the data    

for i = 0 to al.Count
   '--Create new sheet put your code here
   '--transpose the data 
   Sheets(i+1).Range("A2").Resize(UBound(al(i))) = Application.Transpose(al(i))
Next i

于 2013-01-16T10:31:22.590 回答