Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

441
Vistas
El botón OLEObject de Excel pierde el evento de clic después de hacer clic varias veces

Estaba tratando de crear un botón de Excel en una hoja a partir de un código de C# , utilizando un controlador de eventos de C# para el botón, por lo que no tengo que involucrar VBA ni secuencias de comandos de texto; y encontré esta gran solución de @Dummy yoyo que funciona pero "solo por un tiempo".

La solución es simple: agregue una forma, consígala como un objeto ole, obtenga el ole como un botón y agregue un evento de clic:

 int i = 1; private void CreateButton() { Microsoft.Office.Interop.Excel.Worksheet sheet = #get a sheet from Excel sheet.Shapes.AddOLEObject("Forms.CommandButton.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 10, 10, 100, 30); Microsoft.Office.Interop.Excel.OLEObject oleShape = sheet.OLEObjects(1); Microsoft.Vbe.Interop.Forms.CommandButton button = oleShape.Object; button.Caption = "Custom Buttom" + i; button.Click += Button_Click; i++; //for future use, see below } private void Button_Click() { MessageBox.Show("It works!"); }

El problema:

Ahora, la primera vez que hago clic en el botón de la hoja, ¡funciona! La segunda vez "podría" funcionar. Cuantos más clics, menos posibilidades de que funcione. Inevitablemente, el botón "pierde" el evento de clic y simplemente no hace nada . No puedo entender por qué, qué puede estar causando esto.

Incluso traté de recrear el botón cada clic con:

 private void Button_Click() { MessageBox.Show("It Works!"); sheet.Shapes.Item(1).Delete(); CreateButton(); }

Puedo ver que el botón se está recreando debido al i++ que se muestra en el título del botón. Aunque, algunos clics más tarde, incluso el botón recién creado simplemente no hace nada cuando se hace clic.

¿Qué puede estar pasando? ¿Como puedo resolver esto?

Editar:

Se encontró una solución parcial, como sugirió @Hans Passant : si mantengo la forma, el objeto ole y el botón como miembros estáticos fuera del método, el recolector de basura no los elimina. Sin embargo, me gustaría guardar, cerrar y volver a abrir la hoja y seguir obteniendo los eventos.

Grandes soluciones podrían ser:

  • Identificar por qué sucede y solucionarlo
  • Sugiriendo otra forma de crear el botón usando un controlador de clic c#
  • Haciendo posible guardar esta hoja, cerrarla y volverla a abrir con los eventos aún adjuntos.

Algunos detalles más:

  • Estoy creando una nueva aplicación de Excel a partir del código C# y tomando la primera hoja del primer libro de trabajo.
  • Este no es un complemento de VSTO, no tengo acceso a Globals.Factory , aunque me encantaría poder obtener una instancia de esta fábrica y probar los métodos de Microsoft.Office.Tools.Worksheet para agregar controles.
    • Mi proyecto es inevitablemente una biblioteca de clases consumida por otro software no relacionado
  • La hoja se debe guardar y volver a abrir más tarde independientemente del proyecto de origen.
  • La hoja se completa antes de agregar el botón, también a través del código C#.
  • El depurador de Visual Studio puede ingresar al controlador de eventos del botón sin ninguna acción especial
over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda