这是一个利基问题,所以我会尝试尽我所能来定义一切。我正在使用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);
}
}
}
}
我找不到任何关于如何为这些以编程方式生成的模块分配快捷键的文档。
答案 0 :(得分:1)
如果您可以自由修改vba文件,这是一个选项。如果在Excel中创建宏,指定快捷方式,然后导出模块,您将看到该文件具有以下结构:
Attribute VB_Name = "MyModule"
Sub MyFunction()
Attribute MyFunction.VB_ProcData.VB_Invoke_Func = "y\n14"
'Do Your stuff
End Sub
Sub MyFunction2()
Attribute MyFunction2.VB_ProcData.VB_Invoke_Func = "q\n14"
'Do more stuff
End Sub
"y\n14"
和"q\n14"
中的第一个字符将成为与Ctrl
键一起使用的快捷键,在这些情况下, Ctrl + y 和< EM> CTRL + q
附注:我尝试了您的代码,我只能删除excel.MacroOptions();
行才能使其生效。