4

この質問と同様に(ただし、私の場合は VSTO SE ではありません)、Visual Studio 2005 および Excel 2003 で純粋な VSTO を使用して UDF を作成することはできないことを確認したいだけです。したがって、完全に明確にするために、私の質問は:

Visual Studio 2005 と VSTO ソリューションを使用して、VBA やその他のトリックを使用せずに Excel 2003 UDF を作成することは可能ですか?

私は ManagedXLL、ExcelDNA、Excel4Net などを認識していますが、現時点では考慮したくありません。

ありがとう

4

5 に答える 5

8

COMとVBAのどちらを回避する方法があるかについては、それが可能だとは思いません(少なくとも、非常に汚いトリックがなければ)。その理由は、Officeが外部コード(つまり、アドイン)を実行できる唯一の方法はCOM経由であるためです。VSTOでさえ、その下にある古いIDTExtensibility2COMインターフェイスをまだ使用しています。IDTExtensibility2は、MicrosoftOfficeアプリケーションのすべてのアドインが実装する必要のあるCOMインターフェイスです。

VSTOの前は、OfficeアドインはこのIDTExtensibility2インターフェイスを自分で実装する必要がありました。このようなCOMベースのアドイン(またはCOMに表示されるマネージドアドイン)では、ここで説明するようにUDFを追加するだけです。

ただし、VSTOでは、抽象化の追加レイヤーがあります。VSTOは、VSTOランタイムによって提供されるdllであるIDTExtensibility2を実装するいわゆるソリューションローダーを使用します。これは、アドインがCOMに表示されなくなったことを意味します。したがって、UDFをVSTOアドインに追加した場合、Officeには表示されません。

Paul Stubbsは、ブログでVSTOとVBAの操作方法を説明してい ます。VSTOマネージコードでExcelUDFを作成する方法

  1. VSTOの関数を使用してクラスを作成します

    <System.Runtime.InteropServices.ComVisible(True)>
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function 
    End Class
    
  2. クラスをVSTOのVBAに接続します

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    
  3. マネージコードのフックとVBAの関数のラッパーを作成します

    スプレッドシートまたはドキュメントのVBAモジュール内

    Dim managedObject As Object
    
    Public Sub RegisterCallback(callback As Object)
        Set managedObject = callback
    End Sub
    
    Public Function GetNumberFromVSTO() As Integer
        GetNumberFromVSTO = managedObject.GetNumber()
    End Function
    

これでセルに入力できます=GetNumberFromVSTO() 。Excelが開始すると、セルの値は42になります。

于 2009-02-18T20:03:35.433 に答える
2

なぜこれをやりたいのか理解できませんか?

VSTO と (.NET からの) COM 相互運用機能を介した UDF の公開は、2 つの異なるタスクです。VSTO プロジェクト内で UDF メソッドをホストする必要があるのはなぜですか?

.net UDF アセンブリを登録する方法は、VSTO プロジェクトとは別のプロジェクトにある必要があることを意味します。ただし、2 つのアプリ間でデータを共有したい場合は、さまざまなネイティブ .net メソッドを使用するか、VSTO プロジェクト内の適切な範囲オブジェクトから UDF 関数を単に "呼び出す" 必要があります。

VSTO に UDF が必要だと感じる理由はありますか?

于 2009-07-31T03:52:42.183 に答える
1

Eric Carter が説明したように UDF を作成し、Excel の範囲を UDF にパラメーターとして渡します。指定された範囲を使用して、VSTO を介して Excel のオブジェクト モデルにアクセスできます。Excel.Workbook wb = rg1.Worksheet.Application.ActiveWorkbook;

于 2010-10-23T22:40:08.033 に答える
0

私は、VS2005 と VSTO を使用して Excel 2003 で UDF を作成する方法に慣れていません。VBA を少しでも使用する必要はありません。これについてもう少し詳しく説明している2つのリンクを次に示します。

http://geekswithblogs.net/Denis/archive/2007/01/03/102623.aspx

http://blogs.msdn.com/pstubbs/archive/2004/12/31/344964.aspx

于 2009-02-17T18:41:40.977 に答える