【问题标题】:In VSTO Addin for Excel how to handle a button click event from active worksheet?在 Excel 的 VSTO 插件中,如何处理来自活动工作表的按钮单击事件?
【发布时间】:2016-01-21 02:27:56
【问题描述】:

目前我正在使用带有 VSTO 的 VB.NET 2010 开发 Excel 2010 插件。

活动工作表有一个按钮,其点击事件将由其自己的 VBA 代码处理。

现在我想在 Addin 中处理相同的按钮单击事件,而不影响其原始 VBA 功能。可能吗?我怎样才能做到这一点?

此任务的先决条件是不允许对 Excel 模板(包括其 VBA 代码)进行任何更改。这就是我尝试通过 VB.NET 处理事件的原因。

触发点是Excel模板中的按钮被点击,那么它肯定会引发某些事件,而这种事件肯定会被VBA宏处理,但我想在VB中添加另一个监听器(事件处理程序) .Net 到同一个事件,所以我可以做一些额外的任务。

有谁知道如何添加这样的事件处理程序?

谢谢。

【问题讨论】:

  • 不确定我是否明白这一点,但你会在插件中创建一个公司可见类来说 application.run(macro name,args) 然后调用 addin.com class.function 来运行.net 中的宏还是您的意思是将函数迁移到 .net 或处理插件中的点击不像 VBA 中的 _click() ???
  • 没有迁移的意图,只是想使用那个特定的按钮点击事件来触发插件做一些额外的任务。现有的 excel 模板是经过批准的表格(带有宏),我不允许更改任何内容。
  • 刚刚注意到自动更正更改使 com 可见以使公司。我的 VB.NET 的 Application.Run(x,y,z) 解决方案应该可以做到。在过去,我在非公开类中创建了函数,然后创建了一个公开的包装器来调用这些函数,因此非公开的函数将是 clsFunctions.fnCLICK_BUTTON,而公开的函数将是 clsVBAFunctions.fnCallVBAButton click,将从 VBA 调用
  • 感谢 Nathan,但此任务的先决条件是不能对 Excel 模板(包括其 vba 代码)进行任何更改。这就是我尝试通过 VB.NET 处理事件的原因。
  • 我迷路了 :) 如果你不告诉它,你就不能让 AddIn 调用现有的函数?

标签: vb.net excel vba vsto excel-addins


【解决方案1】:

Here 是一个类似的问题。

var cmdButton = (Excel.Shape)xlWorkSheet.Shapes.AddOLEObject("Forms.CommandButton.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 60, 60, 60, 60);

cmdButton.Name = "btnClick";

//var cmdBtn = (Microsoft.Vbe.Interop.Forms.CommandButton)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet((Excel.Worksheet)xlApp.ActiveSheet, null, "btnClick", new object[0], null, null, null);

var cmdBtn = (Microsoft.Vbe.Interop.Forms.CommandButton)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet((Excel.Worksheet)xlApp.ActiveSheet, null, "btnClick", new object[0], null, null, null);
//
//some button formatting codes
//
cmdBtn.Click +=cmdBtn_Click;


void cmdBtn_Click()// Command button click event handler
{
  MessageBox.Show("Test");
}

在你的情况下它更容易,你不需要创建一个按钮,你可以使用它的名字。

【讨论】:

  • 谢谢 Alex,我会在 VB.NET 中尝试您的方法,只是有一个问题,Addin 中的事件处理程序会覆盖其原始 VBA 模块中的事件处理程序吗?我需要两个处理程序。
  • 我认为它保留了原始事件处理程序,但即使我错了 - 您可以从 vb.net 事件处理程序调用此宏
  • Alex,很抱歉没有尽快回复你,我已经在VB.NET中测试过该方法,卡在“cmdBtn.Click +=cmdBtn_Click;”不知道如何将此行转换为 VB.NET。然后我在 C# 中创建了一个新的 Addin 项目,您的代码完美运行。点击事件由两个处理程序处理。
  • 我也想让这个很棒的方法在 VB.NET 中工作。你能给一些关于“cmdBtn.Click +=cmdBtn_Click;”的建议吗?如何将其转换为 VB.NET。谢谢。
  • 现在事件处理顺序如下: (1) VBA handler (2) C#.NET handler。是否可以让 C#.NET 处理程序先运行?
猜你喜欢
  • 2011-03-20
  • 2016-05-12
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多