0

2 つのボタンを持つ非常に単純なモーダルフォームを作成しました。1 つはフォームを閉じるだけで、もう 1 つは を呼び出しますApplication.RTD.RefreshData。Excel 2003 ではこれで問題なく動作しますが、Excel 2010 ではApplication.RTD.RefreshDataクラッシュします。

実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラー

フォームをモードレスとして作成すると、Excel 2003 と Excel 2010 の両方ですべて正常に動作します。

価値があるのは、これがフォームの背後にあるすべてのコードです。

Private Sub RefreshDataButton_Click()
  Application.RTD.RefreshData
End Sub

Private Sub CloseButton_Click()
  Call Unload(Me)
End Sub

そして、シートで次のコードを使用してフォームを呼び出します。

Private Sub CommandButton1_Click()
  Dim form As UserForm1
  Set form = New UserForm1
  form.Show vbModal
End Sub

私はこれに関する情報を求めて Google と SO を調べましたが、役に立ちませんでした。Application.RTD.RefreshDataこれは Excel 2010 の既知の問題ですか、それともモーダル フォームから呼び出すことは本当に許可されていないのでしょうか?

編集: Excel セッションに RTD サーバーがないとわかる限り、それを追加する必要があります。

EDIT2: 詳細な調査: Excel 2003 または 2007 ではエラーは発生しません。2010 年と 2013 年に発生します。

4

1 に答える 1

1

通常の RTD サーバーでは、Excel コールバックを使用して UpdateNotify() を呼び出すと、Excel はスロットル設定と現在の「ビジー」度に基づいて RefreshData() を呼び出すタイミングを決定します。「ビジー」の定義には、通常、数式の再計算、シートの保存、モーダル ダイアログを開くことが含まれます。

Excel は、例外をスローしてビジーであると見なすと、外部コンポーネントから自身を保護します。貪欲なアドインやマクロが原因でアプリケーションが不安定になったりロックアップしたりすることを望まないため、これは理にかなっています。基本的に、Excel オブジェクト モデルの任意の部分にアクセスするコード内のすべての呼び出し (RefreshData() への呼び出しを含む) は、Excel が "ビジー" であると判断した場合に例外をスローできます。Excel の新しいバージョンでは、「ビジー」の定義が厳しくなったと思われます。これが、モーダル ダイアログでこの不一致が見られる理由です。

于 2014-03-05T11:14:14.843 に答える