Lo he preguntado en otro lugar, pero nunca he encontrado que alguien sepa cómo crear un complemento para VBA IDE utilizando VB.NET. ¿Es posible? ¿Podría alguien señalarme un ejemplo?Complemento de compilación para VBA IDE utilizando VB.NET
Respuesta
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:
- Crear una nueva biblioteca de clases proyecto
- 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)
- Agregar referencias a "Microsoft.Vbe.Interop" de nuevo debe estar con los PIA.
- Marque la casilla "Registrarse para Com Interop" en la pestaña de propiedades.
- 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.
- 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"
- OPCIONAL también establecer la ruta de inicio en el directorio de la hoja de cálculo por ejemplo, "C: \"
- implementar la interfaz "IDTExtensibility2" que se encuentra en el montaje "extensibilidad".
- llamada esta clase "Conectar" (esto es sólo una preferencia)
- 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)
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.
Creo que está buscando un complemento para el entorno de desarrollo en sí –
También encontré esta referencia para ser útil en la fabricación de una DLL de VBA de C# o VB.NET:
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; } } }
Configure las propiedades del proyecto para que sea COM visible.
- Regístrese para COM Interop.
- Compile el proyecto.
- Copie el archivo de biblioteca de tipos en la carpeta del sistema de Windows.
- Consulte la biblioteca de tipos desde el editor de Access VBA.
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
Desafortunadamente pasos de almog.ori no funcionó para mí. Aquí está mi versión para ayudar a la gente en el futuro:
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".
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.
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)
Microsoft.Vbe.Interop (C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Herramientas de Visual Studio para Office \ PIA \ Office14 \ Microsoft.Vbe.Interop.dll)
(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:
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".
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.
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.
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"
- Cree el complemento VBE en Visual Studio y abra Excel.
- Abra su editor de VBA (Alt + F11).
- Vaya al menú "Complementos", "Administrador de complementos ..." para verificar que el complemento esté registrado correctamente.
- Cargar el complemento. Debería ver el cuadro de mensaje "VBEAddIn.Connect cargado en el editor de VBA"
Si obtiene este error:
'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):
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
+1 por ser increíble –
- 1. IDE recomendado para VBA
- 2. IDE alternativo para VB6 y VBA
- 3. Programación multiprocesador IDE o complemento
- 4. Crear un complemento para Outlook utilizando JavaScript
- 5. Creación de complemento para Excel utilizando C#
- 6. GhostText utilizando VB.Net
- 7. Es Excel VBA el mismo que VB.NET
- 8. compilación de línea de comandos utilizando cl.exe?
- 9. ¿Hay un complemento de "quién rompió la compilación" para Jenkins?
- 10. IDE para MSIL
- 11. Filtrar tabla dinámica de Excel utilizando VBA
- 12. ¿Cómo instalar un complemento de Vimball (con extensión .vba)?
- 13. ¿Cómo instalar manualmente el software/complemento en Eclipse IDE?
- 14. obtener IPv4 local del ordenador utilizando VB.net
- 15. Complemento de TypeScript para Sublime
- 16. Complemento TFS para "Qt Creator"
- 17. Cómo instalar el complemento Drools en Eclipse Indigo IDE
- 18. ¿Tiene un IDE específico del idioma ventajas con respecto a un complemento para un IDE en varios idiomas?
- 19. Errores de compilación utilizando bfd.h en Linux
- 20. Crear nuevo * paquete * en un complemento de compilación de Scala
- 21. VBA Excel: Error de compilación: ¿se requiere un objeto?
- 22. Complemento de código de sistema de compilación externo Xcode 4
- 23. Creación de gráfico de pivote utilizando Access 2007 VBA
- 24. Recuento de registros en la tabla de acceso utilizando VBA
- 25. Acceder a tipos de complemento de aplicación VSTO de VBA (Excel)
- 26. Complemento de Zend Framework para Eclipse PDT
- 27. Complemento Eclipse ADT: sin objetivo de compilación disponible
- 28. Método de extensión VB.NET en la vista utilizando ASP.NET MVC
- 29. ¿Hay alguna forma de capturar HotKeys/Shortcuts en Excel VSTO utilizando solo C# y sin VBA?
- 30. IDE para desarrollo incrustado
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
Guau, eso es mucho. +1 por esfuerzo. Necesito tiempo para probarlo, si funciona, lo aceptaré :) Gracias :) – Oorang
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