2009-12-21 6 views

Respuesta

16

Es posible que necesite escribir un complemento de com utilizando la interfaz IDTExtensibility2, seleccione la plantilla de proyecto de complemento compartido del proyecto nuevo.

EDITAR

lo contrario para crear este complemento desde cero tendrá que hacer lo siguiente:

  1. Crear una nueva biblioteca de clases proyecto
  2. agregar referencias a "extensibilidad", lo que debería estar en la lista. Es posible que deba descargar los PIA para su versión de la oficina. (y quizás VSTO, pero no estoy seguro de este punto)
  3. Agregar referencias a "Microsoft.Vbe.Interop" de nuevo debe estar con los PIA.
  4. Marque la casilla "Registrarse para Com Interop" en la pestaña de propiedades.
  5. OPCIONAL En la pestaña de configuración de depuración cambie el inicio al programa externo e ingrese la ruta al exe excel en la carpeta de archivos de programa (si esto es para excel) esto permite que el proyecto sea depurable.
  6. OPCIONAL En las opciones del comando, agregue una entrada a una hoja de cálculo o Word Doc que mostrará el diálogo de agregar usando una macro al inicio, para el desarrollo esto tiene sentido para optimizar la experiencia de depuración. por ejemplo, "C: \ vbe.xlsm"
  7. OPCIONAL también establecer la ruta de inicio en el directorio de la hoja de cálculo por ejemplo, "C: \"
  8. implementar la interfaz "IDTExtensibility2" que se encuentra en el montaje "extensibilidad".
  9. llamada esta clase "Conectar" (esto es sólo una preferencia)
  10. atribuyen la clase con la siguiente

[ComVisible(true), Guid("YourGeneratedGuid"), ProgId("YourAddinName.Connect")]

aquí una aplicación para empezar, en primer lugar sustituir el "YourAddinName" con su AppName y Crear una guía para "YourGeneratedGuid". Deberá registrar el Complemento en la ubicación correcta del Registro, ver las claves de registro que siguen para hacerse una idea, también reemplazar algunas variables en las claves de registro.

Imports System 
Imports System.Drawing 
Imports System.Linq 
Imports System.Runtime.InteropServices 
Imports Extensibility 
Imports Microsoft.Vbe.Interop 

Namespace VBEAddin 


''' <summary> 
''' The object for implementing an Add-in. 
''' </summary> 
''' <seealso class='IDTExtensibility2' /> 
<Guid("YourGeneratedGuid"), ProgId("YourAddinName.Connect")> _ 
Public Class Connect 
    Implements IDTExtensibility2 
    Private _application As VBE 'Interop VBE application object 


    #Region "IDTExtensibility2 Members" 

    ''' <summary> 
    ''' Implements the OnConnection method of the IDTExtensibility2 interface. 
    ''' Receives notification that the Add-in is being loaded. 
    ''' </summary> 
    ''' <param term='application'> 
    ''' Root object of the host application. 
    ''' </param> 
    ''' <param term='connectMode'> 
    ''' Describes how the Add-in is being loaded. 
    ''' </param> 
    ''' <param term='addInInst'> 
    ''' Object representing this Add-in. 
    ''' </param> 
    ''' <seealso class='IDTExtensibility2' /> 
    Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef [custom] As Array) 
    _application = CType(Application,VBE) 
    End Sub 

    Private Sub onReferenceItemAdded(ByVal reference As Reference) 
     'TODO: Map types found in assembly using reference. 
    End Sub 

    Private Sub onReferenceItemRemoved(ByVal reference As Reference) 
     'TODO: Remove types found in assembly using reference. 
    End Sub 


    Private Sub BootAddin() 
     'Detect change in active window. 
    End Sub 

    ''' <summary> 
    ''' Implements the OnDisconnection method of the IDTExtensibility2 interface. 
    ''' Receives notification that the Add-in is being unloaded. 
    ''' </summary> 
    ''' <param term='disconnectMode'> 
    ''' Describes how the Add-in is being unloaded. 
    ''' </param> 
    ''' <param term='custom'> 
    ''' Array of parameters that are host application specific. 
    ''' </param> 
    ''' <seealso class='IDTExtensibility2' /> 
    Public Sub OnDisconnection(ByVal disconnectMode As ext_DisconnectMode, ByRef [custom] As Array) 
    End Sub 

    ''' <summary> 
    ''' Implements the OnAddInsUpdate method of the IDTExtensibility2 interface. 
    ''' Receives notification that the collection of Add-ins has changed. 
    ''' </summary> 
    ''' <param term='custom'> 
    ''' Array of parameters that are host application specific. 
    ''' </param> 
    ''' <seealso class='IDTExtensibility2' /> 
    Public Sub OnAddInsUpdate(ByRef [custom] As Array) 
    End Sub 

    ''' <summary> 
    ''' Implements the OnStartupComplete method of the IDTExtensibility2 interface. 
    ''' Receives notification that the host application has completed loading. 
    ''' </summary> 
    ''' <param term='custom'> 
    ''' Array of parameters that are host application specific. 
    ''' </param> 
    ''' <seealso class='IDTExtensibility2' /> 
    Public Sub OnStartupComplete(ByRef [custom] As Array) 
     'Boot dispatcher 

    End Sub 


    ''' <summary> 
    ''' Implements the OnBeginShutdown method of the IDTExtensibility2 interface. 
    ''' Receives notification that the host application is being unloaded. 
    ''' </summary> 
    ''' <param term='custom'> 
    ''' Array of parameters that are host application specific. 
    ''' </param> 
    ''' <seealso class='IDTExtensibility2' /> 
    Public Sub OnBeginShutdown(ByRef [custom] As Array) 
    End Sub 

    #End Region 
End Class 
End Namespace 

Aquí es el guión .key registro para registrar el complemento, tenga en cuenta que tendrá que cambiar algunos de los ajustes con el fin de registrar correctamente.

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Microsoft\VBA\VBE\6.0\Addins\YourAddinName.Connect] 
"CommandLineSafe"=dword:00000000 
"Description"="Description for your new addin" 
"LoadBehavior"=dword:00000000 
"FriendlyName"="YourAddinName" 


[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}] 
@="YourAddinName.Connect" 

[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\Implemented Categories] 

[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\InprocServer32] 
@="mscoree.dll" 
"ThreadingModel"="Both" 
"Class"="YourAddinName.Connect" 
"Assembly"="YourAssemblyNameFullTypeName" 
"RuntimeVersion"="v2.0.50727" 
"CodeBase"="file:///PathToAssembly" 

[HKEY_CLASSES_ROOT\CLSID\{YourGeneratedGuid}\ProgId] 
@="YourAddinName.Connect" 

NOTA las fichas "YourGeneratedGuid" debe tener las llaves {} incluido y ser el mismo que el GUID en el attrib anteriormente, el token "YourAssemblyNameFullTypeName" debe ser el nombre completo de la Asamblea, el token " YourAddinName.Connect "debe ser el mismo ProgId establecido en attrib arriba.

Nota al margen

También encontraron útil esta información, podría ahorrar un par de horas buscando en Google.

'HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common 
'FontFace=Courier New (STRING - Default if missing) 
'FontHeight=10 (DWORD - Default if missing)     
+0

Hola Ori, el problema que estoy confrontando es que estoy usando la versión expreso de VB.Net . Una de las limitaciones de la versión Express es un conjunto reducido de plantillas. Me imagino que todavía puedes hacerlo, solo necesitas crear uno desde cero. ¿Alguna idea de dónde comenzar con eso? Revisé los recursos de MZ-Tools pero su información no se aplica al IDE de VBA desde .Net. Cuál es el problema que sigo golpeando en todas partes. Toda la información que puedo encontrar es re: VB6. – Oorang

+1

Guau, eso es mucho. +1 por esfuerzo. Necesito tiempo para probarlo, si funciona, lo aceptaré :) Gracias :) – Oorang

+0

Hola ORI, perdón por el retraso. Soy dolorosamente nuevo en esto, así que por favor tengan paciencia conmigo. Inicié un intento para implementar estas instrucciones y el primer obstáculo que acerté fue que (utilizando la versión expresa de 2010 de VB) no hay una "plantilla de proyecto de complemento compartido" disponible (ni en la colección en línea). Sé que está en la versión completa de VS, así que supongo que falta en la adición de Express. ¿Conoces alguna solución a este problema? Perdón por complicar las cosas. – Oorang

0

Me imagino que podría llamar a .NET DLL desde su código VBA (nunca lo he hecho yo). Simplemente cree un proyecto de VB Class Library y cree una DLL para usar en su VBA.

Después de un google rápido, parece que tendría que configurar "Register for Com Interop" = True en Project Properties-> Build, pero como he dicho, en realidad nunca lo he intentado antes.

+1

Creo que está buscando un complemento para el entorno de desarrollo en sí –

2

También encontré esta referencia para ser útil en la fabricación de una DLL de VBA de C# o VB.NET:

  1. Crear un nuevo C# (o VB.Net) del proyecto y seleccione Biblioteca de clases como el tipo de plantilla .

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    
    namespace SimpleCalc 
    { 
        public class Calc 
        { 
         private int numberOne = 0; 
         private int numberTwo = 0; 
    
         public void SetNumberOne(int number) 
         { 
          numberOne = number; 
         } 
    
         public void SetNumberTwo(int number) 
         { 
          numberTwo = number; 
         } 
    
         // Add two integers 
         public int Add() 
         { 
          return numberOne + numberTwo; 
         } 
        } 
    } 
    
  2. Configure las propiedades del proyecto para que sea COM visible.

  3. Regístrese para COM Interop.
  4. Compile el proyecto.
  5. Copie el archivo de biblioteca de tipos en la carpeta del sistema de Windows.
  6. Consulte la biblioteca de tipos desde el editor de Access VBA.
  7. Use la DLL en su código VBA.

    Public Function test() 
        Dim lngResult As Long 
    
        Dim objCalc As SimpleCalc.Calc 
        Set objCalc = New SimpleCalc.Calc 
    
        objCalc.SetNumberOne (3) 
        objCalc.SetNumberTwo (6) 
    
        lngResult = objCalc.Add() 
    
    End Function 
    

puestos a disposición por GeeksEngine.com

11

Desafortunadamente pasos de almog.ori no funcionó para mí. Aquí está mi versión para ayudar a la gente en el futuro:

  1. Cree un C# o VB.NET proyecto de biblioteca de clases llamado "VBEAddIn"

    Añadir los siguientes ensamblados de interoperabilidad como referencias al proyecto, utilizando el "Proyecto", "Agregar referencia ..." menú, pestaña "Buscar".

  2. Extensibilidad (C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Herramientas de Visual Studio para Office \ PIA \ Common \ Extensibility.dll) - si no está allí, pruebe C: \ Archivos de programa (x86) \ usando una PC x64.

  3. Microsoft.Office.Interop.Excel (C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Visual Studio Tools para Office \ PIA \ Office14 \ Microsoft.Office.Interop.Excel.dll)

  4. Microsoft.Vbe.Interop (C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Herramientas de Visual Studio para Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.dll)

  5. (opcionalmente) Microsoft.Vbe.Interop.Forms (C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Herramientas de Visual Studio para Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.Forms.dll)

agregar una clase a su proyecto con el siguiente código:

VB.Neto:

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 
    } 
} 

En la ventana Propiedades del proyecto del proyecto:

  1. En la pestaña "Aplicación", asegúrese de que tanto el nombre de Asamblea y el espacio de nombres de raíz están configurados en "VBEAddIn".

  2. En la pestaña "Compilar", asegúrese de que la casilla de verificación "Registrar para interoperabilidad COM" esté marcada. No nos molestaremos en registrar el ensamblaje para COM Interop manualmente con la herramienta regasm.exe adecuada. Sin embargo, tenga en cuenta que la casilla de verificación "Registrar para interoperabilidad COM" solo registraría el dll de complemento como una biblioteca COM de 32 bits, no como una biblioteca COM de 64 bits.

  3. En la pestaña "Compilar", botón "Opciones de compilación avanzadas", asegúrese de que el combobox "Target CPU" está configurado en "AnyCPU", lo que significa que el ensamblaje se puede ejecutar como 64 bits o 32 bits , dependiendo de la ejecución de .NET Framework que lo carga.

  4. En la pestaña "Firma", asegúrese de que "Firmar el conjunto" no esté marcado.

A continuación añadir las claves de registro, guardar el siguiente fragmento de código como un archivo ASCI con una extensión reg y haga doble clic en él para sumar los valores en el registro.

Nota Importante: antes de ejecutar el archivo del registro, cambie la ruta: "file: /// C: \ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug \ VBEAddIn.dll" "CodeBase" =

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" 
  1. Cree el complemento VBE en Visual Studio y abra Excel.
  2. Abra su editor de VBA (Alt + F11).
  3. Vaya al menú "Complementos", "Administrador de complementos ..." para verificar que el complemento esté registrado correctamente.
  4. Cargar el complemento. Debería ver el cuadro de mensaje "VBEAddIn.Connect cargado en el editor de VBA"

Si obtiene este error:

enter image description here

'VBEAddIn' could not be loaded.

Remove it from the list of available Add-Ins?

Su probable es que no ha cambiado el ruta "CodeBase" = "archivo: /// C: \ Dev \ VBEAddIn \ VBEAddIn \ bin \ Debug \ VBEAddIn.dll"

Y compruebe que la clave CodeBase está en la regi stry (añadir un regkey cadena con el código base si no existe):

enter image description here

A continuación, cerrar la aplicación de Office, construir el VBE de complemento de nuevo desde Visual Studio, Open Office (Excel, Outlook, Word , etc.) y Alt + F11, menú Complementos> Administrador de complementos y seleccione Complemento y Marcar cargados/Sin carga.

truco final para superar este problema:

Si éste tampoco funciona, cierre la aplicación de oficina, ir a Visual Studio, Propiedades del proyecto> Construir Tab> Tick Registrar para interoperabilidad COM> Generar solución y abrir la oficina Agregar En> Alt + F11> Menú Complementos> Administrador de complementos y haga clic en Cargar/Descargar.


esta pregunta utiliza algo de información de Carlo de Quintero (MZTools) que he modificado, Ref: http://www.mztools.com/articles/2012/MZ2012013.aspx

+2

+1 por ser increíble –

Cuestiones relacionadas