C# 使用Excel Interop手动编译PERSONAL.xlsb时,是否为VBA宏指定快捷键?
这是一个利基问题,所以我会尽我所能去定义一切。我正在使用Excel2007 我们公司使用excel制作表格。我们有许多工人使用这些表格。出于安全原因,我们不希望电子表格包含宏,但我们仍然需要使用VBA对普通工作簿中的数据执行大规模操作。因此,我们所有的宏都是在每个员工的PERSONAL.xlsb文件中定义的,并且可以在普通工作簿中调用。因为我们在这个工作簿上运行了许多不同的宏,所以使用快捷方式调用它们非常方便。快捷方式在excel中定义,如下所示: PERSONAL.xlsb文件非常特殊,因为每当您打开任何Excel文件时,Excel都会自动将其作为隐藏的后台工作簿打开。这非常好,因为它使您能够在当前工作簿上调用PERSONAL.xlsb中的用户定义宏,而无需启用当前工作簿中的宏 xlsb是一个二进制扩展,使用一些专有的Microsoft压缩算法。问题在于,编写宏和VBA代码是通过Excel中捆绑的VBA IDE完成的。这意味着您编写的代码不是以明文形式存储的,excel充当中间人,将VBA代码读/写到.xlsb文件中的二进制blob中 由于我们使用(并计划添加)许多宏,因此在我选择的编辑器中将它们编码为普通文件并使用git跟踪更改将非常有利。理想情况下,我想要一个包含大量不同C# 使用Excel Interop手动编译PERSONAL.xlsb时,是否为VBA宏指定快捷键?,c#,excel,vba,excel-interop,C#,Excel,Vba,Excel Interop,这是一个利基问题,所以我会尽我所能去定义一切。我正在使用Excel2007 我们公司使用excel制作表格。我们有许多工人使用这些表格。出于安全原因,我们不希望电子表格包含宏,但我们仍然需要使用VBA对普通工作簿中的数据执行大规模操作。因此,我们所有的宏都是在每个员工的PERSONAL.xlsb文件中定义的,并且可以在普通工作簿中调用。因为我们在这个工作簿上运行了许多不同的宏,所以使用快捷方式调用它们非常方便。快捷方式在excel中定义,如下所示: PERSONAL.xlsb文件非常特殊,因为
.vba
文件的开发文件夹,以便在逻辑上分隔每个宏。然后,我需要一个纯文本配置文件,该文件定义了每个.vba
代码模块的可选快捷键
然后,当我对更改感到满意时,我想运行一个程序,使用将这些内容编译成一个很好的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);
}
}
}
}
我找不到任何关于如何为这些程序生成的模块分配快捷键的文档。如果您可以自由修改vba文件,这是一个选项。如果在Excel中创建宏,指定快捷方式,然后导出模块,您将看到该文件具有以下结构:
属性VB\u Name=“MyModule”
子函数()
属性MyFunction.VB\u ProcData.VB\u Invoke\u Func=“y\n14”
“做你的事
端接头
次级职能2()
属性MyFunction2.VB\u ProcData.VB\u Invoke\u Func=“q\n14”
“多做点事
端接头
“y\n14”
和“q\n14”
中的第一个字符将是快捷键,可与Ctrl
键一起使用,在这种情况下,可以使用Ctrl+y和Ctrl+q
旁注:我尝试了你的代码,我只能通过删除excel.MacroOptions()使它工作代码>行