c语⾔如何调⽤vba程序,演练:在Visualc#项⽬中调⽤VBA中的
代码
演练:在 Visual c # 项⽬中调⽤ VBA 中的代码
02/02/2017
本⽂内容
此演练演⽰如何从⼯作簿的 Visual Basic for Applications (VBA) 代码调⽤ Microsoft Office Excel ⽂档级⾃定义项中的⽅法。 该过程包括三个基本步骤:向 Sheet1 主机项类添加⽅法、向⼯作簿中的 VBA 代码公开⽅法,然后从⼯作簿的 VBA 代码中调⽤该⽅法。
**** 适⽤于:-本主题中的信息适⽤于 Excel 和 Word 的⽂档级别项⽬。 有关详细信息,请参阅 按 Office 应⽤程序和项⽬类型提供的功能。
虽然本演练具体使⽤的是 Excel,但其中所阐释的概念同样适⽤于 Word 的⽂档级项⽬。
本演练演⽰以下任务:
创建包含 VBA 代码的⼯作簿。
使⽤ Excel 中的“信任中⼼”信任⼯作薄的位置。
向 Sheet1 主机项类添加⽅法。
visual basic pdf提取 Sheet1 主机项类的接⼝。
向 VBA 代码公开⽅法。
从 VBA 代码中调⽤⽅法。
备注
以下说明中的某些 Visual Studio ⽤户界⾯元素在计算机上出现的名称或位置可能会不同。 这些元素取决于你所使⽤的 Visual Studio 版本和你所使⽤的设置。 有关详细信息,请参阅个性化设置 Visual Studio IDE。
先决条件
您需要满⾜以下条件才能完成本演练:
Visual Studio 的⼀个版本,其中包含 Microsoft Office 开发⼈员⼯具。 有关详细信息,请参阅 配置计算机以开发 Office 解决⽅案。
Microsoft Excel
创建包含 VBA 代码的⼯作簿
第⼀步是创建⼀个启⽤宏的⼯作簿,该⼯作簿包含简单的 VBA 宏。 ⼯作簿必须已经包含 VBA 代码,然后你才能向 VBA 公开⾃定义项中的代码。 否则,Visual Studio 将⽆法修改 VBA 项⽬以允许 VBA 代码调⼊⾃定义项程序集。
如果已经拥有包含要使⽤的 VBA 代码的⼯作薄,则可以跳过此步骤。
创建包含 VBA 代码的⼯作薄
启动 Excel。
将活动⽂档另存为名为 WorkbookWithVBA 的 Excel Macro-Enabled ⼯作簿 (* xlsm) 。 将其保存在⼀个⽅便的位置,例如桌⾯。
在功能区上,单击 “开发⼈员” 选项卡。
备注
如果看不到 “开发⼈员” 选项卡,则必须⾸先显⽰它。 有关详细信息,请参阅 如何:在功能区上显⽰ "开发⼈员" 选项卡。
在 “代码” 组中,单击 “Visual Basic”。
将打开 Visual Basic 编辑器。
在 “项⽬” 窗⼝中,双击 “ThisWorkbook”。
将打开 ThisWorkbook 对象的代码⽂件。
将下⾯的 VBA 代码添加到代码⽂件。 此代码定义⼀个不执⾏任何操作的简单函数。 此函数的唯⼀⽤途是确保 VBA 项⽬存在于⼯作簿中。这是本演练中的后续步骤所必需的。
Sub EmptySub()
End Sub
保存⽂档并退出 Excel。
创建项⽬
现在,你可以创建⼀个 Excel ⽂档级项⽬,这个项⽬使⽤先前创建的启⽤宏的⼯作簿。
创建新项⽬的步骤
启动 Visual Studio。
在 “⽂件” 菜单上,指向 “新建” ,然后单击 “项⽬” 。
在模板窗格中,展开 “Visual C#”,然后展开 “Office/SharePoint”。
选择“Office 外接程序” 节点。
在项⽬模板列表中,选择 “Excel 2010 ⼯作簿” 或 “Excel 2013 ⼯作簿” 项⽬。
在“名称” 框中,键⼊ CallingCodeFromVBA。
单击 “确定” 。
将打开“Visual Studio Tools for Office 项⽬向导” 。
选择 “复制现有⽂档”,然后在 “现有⽂档的完整路径” 框中,指定先前创建的 WorkbookWithVBA ⼯作薄的位置。 如果正在使⽤⾃⼰的启⽤宏的⼯作簿,则改为指定此⼯作簿的位置。
单击“完成”。
Visual Studio 在设计器中打开 WorkbookWithVBA ⼯作簿,并将 CallingCodeFromVBA 项⽬添加到 解决⽅案资源管理器。
信任⼯作簿的位置
必须先信任要运⾏的⼯作簿中的 VBA,然后才可向⼯作簿中的 VBA 代码公开解决⽅案中的代码。 有多种⽅法可实现此⽬的。 在本演练中,将通过在 Excel 的 “信任中⼼” 信任⼯作薄的位置来完成此任务。
信任⼯作薄的位置
启动 Excel。
单击 “⽂件” 选项卡。
单击 “Excel 选项” 按钮。
在类别窗格中,单击 “信任中⼼”。
在细节窗格中,单击 “信任中⼼设置”。
在类别窗格中,单击 “受信任位置”。
在细节窗格中,单击 “添加新位置”。
在“Microsoft Office 受信任位置” 对话框中,浏览到包含 CallingCodeFromVBA 项⽬的⽂件夹。
选择 “同时信任此位置的⼦⽂件夹”。
在 “Microsoft Office 受信任位置” 对话框中,单击 “确定”。
在 “信任中⼼” 对话框中,单击 “确定”。
在 “Excel 选项” 对话框中,单击 “确定”。
退出 Excel。
向 Sheet1 类添加⽅法
既然已设置 VBA 项⽬,请向可以从 VBA 代码中调⽤的 Sheet1 主机项类添加⼀个公共⽅法。
向 Sheet1 类添加⽅法
在 “解决⽅案资源管理器” 中,右键单击 “Sheet1.cs”,然后单击 “查看代码”。
Sheet1.cs ⽂件将在代码编辑器中打开。
将以下代码添加到 Sheet1 类。 CreateVstoNamedRange ⽅法在指定的范围创建⼀个新的 NamedRange 对象。 此⽅法还会为Selected 的 NamedRange事件创建⼀个事件处理程序。 在本演练中,稍后将从⽂档的 VBA 代码中调⽤ CreateVstoNamedRange ⽅法。
private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
public void CreateVstoNamedRange(Excel.Range range, string name)
{
if (!this.Controls.Contains(name))
{
namedRange1 = this.Controls.AddNamedRange(range, name);
namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
namedRange1_Selected);
}
else
{
MessageBox.Show("A named range with this specific name " +
"already exists on the worksheet.");
}
}
private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
{
MessageBox.Show("This named range was created by Visual Studio " +
"Tools for Office.");
}
将以下⽅法添加到 Sheet1 类。 此⽅法将替代 GetAutomationObject ⽅法,以返回 Sheet1 类的当前实例。
protected override object GetAutomationObject()
return this;
}
在 Sheet1 类声明的第⼀⾏前⾯应⽤下列特性。 这些特性使类对于 COM 可见,但不⽣成类接⼝。
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(
System.Runtime.InteropServices.ClassInterfaceType.None)]
提取 Sheet1 类的接⼝
必须先创建⼀个定义 CreateVstoNamedRange ⽅法的公共接⼝,并向 COM 公开此接⼝,然后才可向 VBA 代码公开此⽅法。
提取 Sheet1 类的接⼝
在 Sheet1.cs 代码⽂件中,单击 Sheet1 类中的任意位置。
在 “重构” 菜单中,单击 “提取接⼝”。
在 “提取接⼝” 对话框中,在 “选择构成接⼝的公共成员” 框中,单击 CreateVstoNamedRange ⽅法项。
单击 “确定” 。
Visual Studio 会⽣成名为 ISheet1的新接⼝,并修改 Sheet1 的定义,以便实现 ISheet1 接⼝。 Visual Studio 还将在代码编辑器中打开 ISheet1 ⽂件。
在 ISheet1.cs ⽂件中,将 ISheet1 接⼝声明替换为以下代码。 此代码使 ISheet1 接⼝成为公共接⼝,并且应⽤ ComVisibleAttribute 特性使该接⼝对于 COM 可见。
[System.Runtime.InteropServices.ComVisible(true)]
public interface ISheet1
{
void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
}
⽣成项⽬。
向 VBA 代码公开⽅法
若要向⼯作簿中的 VBA 代码公开 CreateVstoNamedRange ⽅法,请将 主机项的 “ReferenceAssemblyFromVbaProject” Sheet1属性设置为 “True”。
向 VBA 代码公开⽅法
在 解决⽅案资源管理器 中,双击 Sheet1.cs。
WorkbookWithVBA ⽂件将在设计器中打开,并且 Sheet1 可见。
在 “属性” 窗⼝中,选择 “ReferenceAssemblyFromVbaProject” 属性,并将值更改为 “True”。
在显⽰的消息中单击 “确定” 。
⽣成项⽬。
从 VBA 代码调⽤⽅法
现在可以从⼯作簿的 VBA 代码中调⽤ CreateVstoNamedRange ⽅法。
在本演练中,将在调试项⽬时向⼯作薄中添加 VBA 代码。 在下次⽣成项⽬时,添加到此⽂档中的 VBA 代码将被覆盖,因为 Visual Studio 会将⽣成输出⽂件夹中的⽂档替换为主项⽬⽂件夹中⽂档的副本。 如果想要保存 VBA 代码,可以将其复制到项⽬⽂件夹中的⽂档。 有关详细信息,请参阅 合并 VBA 和⽂档级⾃定义项。
从 VBA 代码调⽤⽅法
按 F5 运⾏项⽬。
在 “开发⼈员” 选项卡上的 “代码” 组中,单击 “Visual Basic”。
将打开 Visual Basic 编辑器。
在 “插⼊” 菜单上,单击 “模块”。
向新模块添加以下代码。
此代码调⽤⾃定义项程序集中的 CreateTable ⽅法。 宏通过使⽤全局 GetManagedClass ⽅法来访问你向 VBA 代码公开的 Sheet1 主机项类,从⽽访问此⽅法。 GetManagedClass ⽅法是你之前在本演练中设置 “ReferenceAssemblyFromVbaProject” 属性时⾃动⽣成的。
Sub CallVSTOMethod()
Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
Set VSTOSheet1 = GetManagedClass(Sheet1)
Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
End Sub
按 F5 。
在打开的⼯作簿中,单击 “Sheet1” 上的单元格 “A1”。 验证是否显⽰消息框。
退出 Excel ⽽不保存更改。
后续步骤
在以下主题中,你可以了解有关从 VBA 调⽤ Office 解决⽅案中的代码的详细信息:
从 VBA 调⽤ Visual Basic ⾃定义项的主机项中的代码。 此过程不同于 Visual C# 过程。 有关详细信息,请参阅 演练:在 Visual Basic 项⽬中调⽤ VBA 中的代码。
从 VBA 调⽤ VSTO 外接程序中的代码。 有关详细信息,请参阅 演练:从 VBA 调⽤ VSTO 外接程序中的代码。
请参阅