3

私はいくつかのデータ分析作業を行うためにExcelを使用しています。シナリオは次のようになります。リモートサイトからデータを取得するために、いくつかのExcelプラグインコンポーネントを使用します。たとえば、を入力=get_the_latest_data(ID)するA1と、この関数が呼び出され、IDのデータがに入力さA2A11ます。私の目標は

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 "" 'または、更新が完了したことを確認するその他の特定のチェック
        DoEvents
    ウェンド
    ...

クエリの AfterRefresh イベントを使用します。 詳細については、この投稿を参照してください。

于 2013-01-16T07:20:33.557 に答える
0

これは、一般的なデータ要求が非同期であり、ユーザーにあまり公開されていないサードパーティのデータ ベンダーの典型的なケースのようです。このような場合、呼び出しているメソッドの動作についてベンダーに確認する必要がある場合があります。boolean少なくとも非同期または同期要求/取得のいずれかを選択するには、何らかのタイプの変数を設定する必要があります。

例えば。上位 10 メンバーを取得するために 1 つのインデックス ティッカーを送信している場合、このメソッドは現在、すべてのインデックス ティッカーを収集し、すべてのデータを返します。したがって、返されたデータが分割できるかどうかを確認します。たとえば、に基づいてデータをシートに分割できる多次元配列ですid。それ以外の場合は、このアプリケーションの API 開発者に相談しDoEventsてください。弱すぎてこれを処理できない可能性があります。


各 ID のメソッドから返されたデータを保持するために、arrayList/collection アイテムを使用することをお勧めします。完了したら、既にローカルでデータを取得しているため、シートの作成を開始できます。

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 に答える