0

私が見つけたすべてを説明しますが、要するに、コードビハインドでセル A1 の値を設定したいだけです。Create Excel Add-in - get cell value plus other linksを試しましたが、これらすべての手法はマクロで実行した場合にのみ機能しますが、関数から実行したいです。

それでは、説明を始めましょう。

関数と Sub で同じコードを実行すると、奇妙な動作が発生する理由がわかりません。次の例を見てください。

Dim TimeToRun

Sub Macro1()

    'Dim addIn As COMAddIn
    'Dim automationObject As Object
    'Set addIn = Application.COMAddIns("ProbeAddIn")
    'Set automationObject = addIn.Object

    'automationObject.ImportData

    MsgBox "Hello world"

End Sub

Sub Macro2()

    TimeToRun = Now + TimeValue("00:00:01")

    Application.OnTime TimeToRun, "Macro1" ' run Macro1 on 1 seconds

End Sub


Function Test()

    TimeToRun = Now + TimeValue("00:00:01")

    Application.OnTime TimeToRun, "Macro1" ' run Macro1 on 1 seconds

End Function

Macro2と 関数Testのコードは同じであることに注意してください。Macro2 を実行すると正常に動作するのはなぜですか (メッセージ ボックスが表示されます)。しかし、セルに移動して入力=Test()すると、同じコードを持っていてもエラーが発生します。

この例を示しているのは、マクロを直接実行して実行すると、Macro1 でコメント アウトしたコードがうまく機能するためです。そのコードを関数 Test 内に配置すると、機能しません。そのコードは、Visual Studio のアドイン プロジェクトで次のメソッドを実行しています。

ここに画像の説明を入力

例外は次のとおりです。

System.Runtime.InteropServices.COMException はユーザー コードによって処理されませんでした HResult=-2146827284 Message=HRESULT からの例外: 0x800A03EC
Source="" ErrorCode=-2146827284 StackTrace: System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32) で[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.Range.set_Value2(Object value) at ReadWrite.ImportData() in C:\Users\Antonio\Dropbox_Temp\visual studio\Probe add in test\ProbeAddIn\ProbeAddIn \Class1.cs:82 行目 InnerException:

実行したため、その例外が発生しました:

Function Test()

    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("ProbeAddIn")
    Set automationObject = addIn.Object                

    automationObject.ImportData

End Function

それ以外の

Sub Test()

    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("ProbeAddIn")
    Set automationObject = addIn.Object

    automationObject.ImportData

End Function

マクロと関数内のコードを同じように実行するにはどうすればよいですか? ユーザーがマクロを実行したときではなく、ユーザーが式を入力したときにそのメソッドの実行をトリガーしたいと考えています。関数にマクロを実行させても、同じ例外が発生します例外が発生しない唯一の方法は、最初に実行されるものがマクロである場合です...

4

1 に答える 1

2

確かではありませんが、関数が起動されたときに Excel アプリケーションが編集モードになっているため、外部からの入力を受け入れることができないため、データを挿入しようとすると例外が発生する可能性があります。

クリーンな方法で継続的にセルを更新したい場合は、RTD サーバーが必要です。

セルから次のように呼び出すだけです。

=RTD("my.super.rtdserver",,"mydata")

RTD サーバーは Excel に新しいデータを通知し、準備ができたらExcel にコールバックしてデータを取得できるようにすることがあります。

于 2012-12-19T21:44:37.017 に答える