【发布时间】:2018-06-10 01:36:15
【问题描述】:
这是一个小众问题,所以我会尽我所能定义一切。我正在使用 Excel 2007。
我们公司使用 excel 来制作我们的表格。我们有许多使用这些表格的工人。出于安全原因,我们不希望我们的电子表格包含宏,但我们仍然需要使用 VBA 对普通工作簿中的数据执行大量操作。因此,我们所有的宏都定义在每个员工的 PERSONAL.xlsb 文件中,并且可以在我们的正常工作簿上调用。由于我们在此工作簿上运行了许多不同的宏,因此使用快捷方式调用它们非常方便。快捷方式在 excel 中定义,如下所示:
PERSONAL.xlsb 文件很特殊,因为每当您打开任何 Excel 文件时,Excel 都会自动将其作为隐藏的后台工作簿打开。这很棒,因为它使您可以在当前工作簿上调用 PERSONAL.xlsb 中的用户定义的宏,而无需启用当前工作簿的宏。
.xlsb 是二进制扩展名,并使用一些专有的 Microsoft 压缩算法。问题是编写宏和 VBA 代码是通过 Excel 中捆绑的 VBA IDE 完成的。这意味着您编写的代码不是以纯文本形式存储的,而 excel 充当中间人,将您的 VBA 代码读/写到 .xlsb 文件中的二进制 blob。
由于我们使用(并计划添加)许多宏,在我选择的编辑器中将它们编码为纯文件并使用 git 来跟踪更改将非常有利。理想情况下,我想要一个包含一堆不同.vba 文件的开发文件夹,以在逻辑上分隔每个宏。然后我想要一个纯文本配置文件,该文件定义每个.vba 代码模块的可选快捷键。
然后,当我对更改感到满意时,我想运行一个程序,该程序使用Microsoft Excel Interop 将这一切编译成一个漂亮的 PERSONAL.xlsb 文件,该文件可以轻松保持最新状态并发送给其他员工。我几乎已经实现了所有这些,但我不知道如何将快捷键分配给代码模块。
这是我将 VBA 文件编译为 .xlsb 文件的示例代码:
using Microsoft.Office.Interop.Excel;
using Microsoft.Vbe.Interop;
using System;
using System.IO;
namespace BinaryCompile
{
class Program
{
private static string path = @"C:\Users\Path\To\Source";
static void Main(string[] args)
{
var excel = new Microsoft.Office.Interop.Excel.Application();
//Console.WriteLine(path);
var workbook = excel.Workbooks.Add();
var project = workbook.VBProject;
include_files(get_vba_files(), ref project);
excel.MacroOptions();
workbook.SaveAs(path + "/PERSONAL.xlsb", XlFileFormat.xlExcel12);
workbook.Close();
Console.Read();
excel.Quit();
}
static string[] get_vba_files()
{
return Directory.GetFiles(path, "*.vba");
}
static void include_files(string[] vba_files, ref VBProject project)
{
foreach (string source in vba_files)
{
var module = project.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
module.CodeModule.AddFromFile(source);
module.Name = Path.GetFileNameWithoutExtension(source);
}
}
}
}
我找不到任何有关如何为这些以编程方式生成的模块分配快捷键的文档。
【问题讨论】:
标签: c# excel vba excel-interop