如何(或有可能)通过VSTO从添加到Excel的功能区中调用VBA(子或函数)

问题描述 投票:0回答:1

我正在一个有Visual Studio C#Excel加载项项目(VSTO)的项目中工作。从VSTO代码中,我将带有按钮的功能区添加到Excel(Office.IRibbonExtensibility)。从Excel中添加的按钮中,我可以对C#代码(在VSTO加载项中)的方法进行回调调用。我正在寻找(但没有找到)从该按钮调用Excel文件中的VBA代码的VBA(功能子)的方法。换句话说,从描述的按钮中,我知道如何调用C#中的代码,但不知道如何调用Excel文件本身中的VBA代码。我花了很多时间搜索信息并测试了一些盲目的想法,但是从测试中发现任何东西或获得一些好的结果都没有成功。我希望朝正确的方向开球。

c# excel vba vsto
1个回答
0
投票

这是可能的。您必须注意,尽管工作簿处于活动状态,但VSTO加载项在应用程序中加载时,VBA代码存储在特定的工作簿中。除非开发人员知道,否则彼此都不了解。为了实现这种交互,您必须了解以下内容:1.宏保存工作簿的名称;2.宏名称。

知道这一点,您将可以应用3d注释中发布的解决方案。下面是一个例子。先决条件:1.我已经准备了启用宏的工作簿“ VBA.xlsm”;2.此工作簿的常规模块中有一个名为“ Foo”的宏。

实施:1.创建新的VSTO加载项;2.添加名为“ Ribbon1”的功能区(可视设计器),并将其设置为具有“自定义” ControlIdType(作为单独的选项卡,称为“测试”);3.在该功能区上添加一个名为“ callVBA”的按钮,该按钮将检查工作簿的名称并尝试运行工作簿的宏。

我没有向ThisAddIn.cs类添加任何代码。我使用的唯一代码-在Ribbon类的按钮click事件中:

public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void callVBA_Click(object sender, RibbonControlEventArgs e)
        {
            if (Globals.ThisAddIn.Application.ActiveWorkbook.Name == "VBA.xlsm")
            {
                Globals.ThisAddIn.Application.Workbooks["VBA.xlsm"].Application.Run("Foo");
            }
        }
    }

这很容易,但是要求您已经准备了先决条件。怎么运行的:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.