2012-12-19 58 views
12

Visual Studioには、Excel 2010アドインプロジェクトがあります。私はこのプロジェクトには、以下のモジュールを作成することを持つことができます方法:Visual Studio Excelアドインにユーザー定義関数を追加

enter image description here

を私は私は私のアドオンでそれを使用し、そのモジュールでそのブックを保存することができます知っている私は私のアドインを持つことができればそれは素晴らしいことだろう。そのモジュールを作成してください...

+2

おそらく[this] blogs.msdn.com/b/eric_carter/archive/2004/12/01/writing-user-defined-functions-for-excel-in-net.aspx)が役に立ちます。 –

+0

*** Nooooo!***このパスを下る前に2度考えてください。あなたのコードロジックが次のようにUDFアプローチを使用することを強くお勧めします。a)Excelユーザーがクリティカルロジックを変更して保護する*検出が難しい* b)1つのアドインで、複数のワークブック全体で重複しないc)信頼できる許可d)ユニットtestable e)最新の言語などで書かれている –

答えて

3

私は、VSTOがExcel UDFをサポートしているとは思っていませんが、オートメーションアドイン(Sidのリンクの示唆)を使用することをお勧めします。

また、VBAから管理対象のVSTO関数を呼び出すこともできます。もう一度これはお勧めできませんが可能です。

(リンクからチュートリアルの要約) ここでは、VBAからManaged関数を呼び出す簡単な方法があります。

Private Sub ThisWorkbook_Open() Handles Me.Open 
    Me.Application.Run("RegisterCallback", New MyManagedFunctions) 
End Sub 

VBAでの機能のためにマネージコード用フックとラッパーを作成

VSTOで

<System.Runtime.InteropServices.ComVisible(True)> _ 
Public Class MyManagedFunctions 
    Public Function GetNumber() As Integer 
     Return 42 
    End Function 
End Class 

ワイヤーまでにVSTOで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

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

+0

これは私が今持っているものです。マクロが有効になっているブック(book1.xlsx)を公開せずにプラグインを公開できればいいと思いますので、それは正しいとは思いませんか? –

10

する必要がありますモジュールを作成することが可能です。ただし、これを行うには、Excelで[VBプロジェクトモデルへのアクセスを信頼する]設定を選択する必要があります。信頼設定が選択されていないと、アクセスが拒否されるというエラーが発生します。

using Excel = Microsoft.Office.Interop.Excel; 
using VB = Microsoft.Vbe.Interop; 

Excel.Application eApp = new Excel.Application(); 

eApp.Visible = true; 
Excel.Workbook eBook = eApp.Workbooks.Add(); 

VB.VBProject eVBProj = (VB.VBProject)eBook.VBProject; 
VB._VBComponent vbModule = eVBProj.VBE.ActiveVBProject.VBComponents.Add(VB.vbext_ComponentType.vbext_ct_StdModule); 

String functionText = "Function MyTest()\n"; 
     functionText += "MsgBox \"Hello World\"\n"; 
     functionText += "End Function"; 

vbModule.CodeModule.AddFromString(functionText); 
+0

あなたは厄介です:) –

1

VSTOアドインは、UDFのを作成することはできませんので、あなたは、機能のために別々のアドインを作成する必要があります。このアドインはVSTOアドインと同じDLL内にあることができますが、特殊なトリッキーなしでVSTOとUDFの間で通信することはできません。

私は約blog postです。これは、VSTOとUDFを含む完全なサンプルプロジェクトを提供します。

ここにUDF自体の基本的な構造があります。

[Guid("3B81B6B7-3AF9-454F-AADF-FAF06E5A98F2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface IFunctions 
{ 
    int MYINT(); 
} 

[Guid("F58C591D-A22F-49AD-BC21-A086097DC26B")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
public class Functions : IFunctions 
{ 
    public int MYINT() 
    { 
     return 42; 
    } 
} 
2

あなたが本当にやりたいことは、その後VSTOは現在、良い解決策ではありません使用して.NETのUDF、または組み合わせた.NETアプリケーション・レベルのコマンドおよびUDFアドイン書くことである場合:私はどちらかAddin Express(使用することをお勧めします
を費用)またはExcel DNA(無料)です。
これらの両方を使用すると、.NET XLL UDFアドインとオートメーションUDFアドインの両方を作成できます(XLL UDFアドインは、パフォーマンス上のメリットは大幅に向上しますが、Excelオブジェクトモデルへのアクセスはわずかに制限されます)。

関連する問題