К сожалению шаги almog.ori у меня не сработали. Вот моя версия, чтобы помочь людям в будущем:
Создание проекта библиотеки классов C # или VB.NET с именем "VBEAddIn"
Добавьте следующие сборки Interop в качестве ссылок на проект, используя меню «Проект», «Добавить ссылку ...», вкладку «Обзор».
Расширяемость (C: \ Program Files \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Common \ Extensibility.dll) - если ее там нет, попробуйте C: \ Program Files (x86) ) \ если вы используете компьютер x64.
Microsoft.Office.Interop.Excel (C: \ Program Files \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll)
Microsoft.Vbe.Interop (C: \ Program Files \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.dll)
(необязательно) Microsoft.Vbe.Interop.Forms (C: \ Program Files \ Microsoft Visual Studio 10.0 \ Инструменты Visual Studio для Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.Forms.dll)
Добавьте класс в ваш проект со следующим кодом:
VB.Net:
Imports Microsoft.Office.Interop
Imports Extensibility
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Imports Microsoft.Vbe.Interop
<ComVisible(True), Guid("3599862B-FF92-42DF-BB55-DBD37CC13565"), ProgId("VBEAddInVB.Net.Connect")> _
Public Class Connect
Implements Extensibility.IDTExtensibility2
Private _VBE As VBE
Private _AddIn As AddIn
Private Sub OnConnection(Application As Object, ConnectMode As Extensibility.ext_ConnectMode, _
AddInInst As Object, ByRef custom As System.Array) Implements IDTExtensibility2.OnConnection
Try
_VBE = DirectCast(Application, VBE)
_AddIn = DirectCast(AddInInst, AddIn)
Select Case ConnectMode
Case Extensibility.ext_ConnectMode.ext_cm_Startup
Case Extensibility.ext_ConnectMode.ext_cm_AfterStartup
InitializeAddIn()
End Select
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
Private Sub OnDisconnection(RemoveMode As Extensibility.ext_DisconnectMode, _
ByRef custom As System.Array) Implements IDTExtensibility2.OnDisconnection
End Sub
Private Sub OnStartupComplete(ByRef custom As System.Array) _
Implements IDTExtensibility2.OnStartupComplete
InitializeAddIn()
End Sub
Private Sub OnAddInsUpdate(ByRef custom As System.Array) Implements IDTExtensibility2.OnAddInsUpdate
End Sub
Private Sub OnBeginShutdown(ByRef custom As System.Array) Implements IDTExtensibility2.OnBeginShutdown
End Sub
Private Sub InitializeAddIn()
MessageBox.Show(_AddIn.ProgId & " loaded in VBA editor version " & _VBE.Version)
End Sub
End Class
C #:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using Extensibility;
using Microsoft.Vbe.Interop;
using System.Windows.Forms;
namespace VBEAddin
{
[ComVisible(true), Guid("3599862B-FF92-42DF-BB55-DBD37CC13565"), ProgId("VBEAddIn.Connect")]
public class Connect : IDTExtensibility2
{
private VBE _VBE;
private AddIn _AddIn;
#region "IDTExtensibility2 Members"
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
try
{
_VBE = (VBE)application;
_AddIn = (AddIn)addInInst;
switch (connectMode)
{
case Extensibility.ext_ConnectMode.ext_cm_Startup:
break;
case Extensibility.ext_ConnectMode.ext_cm_AfterStartup:
InitializeAddIn();
break;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void onReferenceItemAdded(Reference reference)
{
//TODO: Map types found in assembly using reference.
}
private void onReferenceItemRemoved(Reference reference)
{
//TODO: Remove types found in assembly using reference.
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
{
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
InitializeAddIn();
}
private void InitializeAddIn()
{
MessageBox.Show(_AddIn.ProgId + " loaded in VBA editor version " + _VBE.Version);
}
public void OnBeginShutdown(ref Array custom)
{
}
#endregion
}
}
В окне свойств проекта проекта:
На вкладке «Приложение» убедитесь, что для имени сборки и корневого пространства имен установлено значение «VBEAddIn».
На вкладке «Компиляция» убедитесь, что установлен флажок «Зарегистрироваться для взаимодействия COM». Мы не будем вручную регистрировать сборку для COM Interop с помощью соответствующего инструмента regasm.exe. Однако обратите внимание, что флажок «Register for COM interop» регистрирует только dll надстройки как 32-битную библиотеку COM, а не как 64-битную библиотеку COM.
На вкладке «Компиляция» кнопкой «Дополнительные параметры компиляции» убедитесь, что в поле со списком «Target CPU» установлено значение «AnyCPU», что означает, что сборка может выполняться как 64-разрядная или 32-разрядная. бит, в зависимости от исполняющей .NET Framework, которая его загружает.
На вкладке «Подписывание» убедитесь, что флажок «Подписать сборку» снят.
Затем добавьте ключи реестра, сохраните приведенный ниже фрагмент в виде ASCI-файла с расширением reg и дважды щелкните его, чтобы добавить значения в реестр.
Важное примечание: Перед запуском reg-файла измените путь: "CodeBase" = "file: /// C: \ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug \ VBEAddIn.dll"
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\VBEAddIn.Connect]
"CommandLineSafe"=dword:00000000
"Description"="Description for your new addin"
"LoadBehavior"=dword:00000000
"FriendlyName"="VBEAddIn"
[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}]
@="VBEAddIn.Connect"
[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\Implemented Categories]
[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="VBEAddIn.Connect"
"Assembly"="VBEAddIn"
"RuntimeVersion"="v2.0.50727"
"CodeBase"="file:///C:\Dev\VBEAddIn\VBEAddIn\bin\Debug\VBEAddIn.dll"
[HKEY_CLASSES_ROOT\CLSID\{3599862B-FF92-42DF-BB55-DBD37CC13565}\ProgId]
@="VBEAddIn.Connect"
- Создайте надстройку VBE в Visual Studio и откройте Excel.
- Откройте редактор VBA (Alt + F11).
- Перейдите в меню «Надстройки», «Менеджер надстроек ...», чтобы проверить правильность регистрации надстройки.
- Загрузить надстройку. Вы должны увидеть окно сообщения «VBEAddIn.Connect загружен в VBA-редактор»
Если вы получите эту ошибку:
'VBEAddIn' не может быть загружен.
Удалить его из списка доступных надстроек?
Вероятно, вы не изменили путь "CodeBase" = "file: /// C: \ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug \ VBEAddIn.dll"
И убедитесь, что ключ CodeBase находится в реестре (добавьте строку regkey с CodeBase, если он не существует):
Затем закройте приложение Office, снова создайте VBE AddIn из Visual Studio, Open Office (Excel, Outlook, Word и т. Д.) И Alt + F11, меню AddIns> AddIn Manager и выберите AddIn и отметьте Loaded / UnLoaded.
Последний трюк для преодоления этой проблемы:
Если это не помогло, закройте приложение Office, перейдите в Visual Studio, Свойства проекта> Вкладка «Сборка»> «Регистрация тиков» для COM-взаимодействия> Построение решения и откройте «Надстройка Office»> «Alt + F11»> «Меню надстроек»> «Менеджер надстроек» и нажмите «Загруженные». /Unloaded.
В этом ответе используется некоторая информация из Кинтеро Карло (MZTools), которую я изменил, ссылка: http://www.mztools.com/articles/2012/MZ2012013.aspx