- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个小众问题,所以我会尽力定义所有内容。我正在使用 Excel 2007。
我们公司使用 excel 来制作表格。我们有许多 worker 使用这些表格。出于安全原因,我们不希望我们的电子表格包含宏,但我们仍然需要使用 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);
}
}
}
}
我找不到任何关于如何为这些以编程方式生成的模块分配快捷键的文档。
最佳答案
这是一个选项,如果您可以随意修改 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 和 Ctrl+q。
旁注:我试过你的代码,我只能通过删除 excel.MacroOptions();
行来让它工作。
关于c# - 使用 Excel Interop 手动编译 PERSONAL.xlsb 时,将快捷键分配给 VBA 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48025523/
Person 是一个以 Parent 作为其子类的类。 考虑以下 2 个陈述: Person person = new Parent(); 父parent=(父)人; 第二个语句将 person 对象
像这样,我有一个对象: { 'person': { 'like': { 'color': 'red', 'food': 'rice' }, 'nam
对于下面的代码,我想知道为什么 Object.getPrototypeOf(person) 可以工作,但 person.getPrototypeOf(person) 不起作用?我认为规则是:如果对象没
我有 3 个 java 源文件。 Person.java FriendsList.java MyFriends.java FriendsList包含 Person 类型对象的数组列表以及将新 frie
我想我理解错误消息的意思,我有一个人,并试图将它转换为 HashMap,但这不是代码所说的?我不明白我做错了什么。当我阅读代码时,我没有发现任何问题..我已经坚持了一段时间了。如果我错过了一些基本的东
我知道以前在类似情况下曾有人问过这个问题,但是我是 C++ 的新手,无法弄清楚需要做什么或为什么必须这样做。基本上,我使用的是我创建的具有变量名称、年龄、高度和体重的 Person 对象。我需要对我创
我正在尝试编写从文件读取并添加到二叉树的程序,但是当我尝试编译时出现错误: "Error 1 'treePersons::display' : cannot convert parameter 1 f
我明白了 error: could not convert 'p1' from 'Person (*)()' to 'Person' 每当我使用默认构造函数时(当我创建 Person p1 时),我知
假设我有一个非常简单的类 Person,其中包含姓名和地址: public class Person { String name; String address; public
所以我刚开始学习 Crystal,因为我喜欢 Ruby 和 C,但我还不能掌握语法。我想我已经很接近了,但我被这个错误困住了。 没有重载匹配 Person 类型的 'Array(Person)#+'
我理解前两个陈述。但是,对于第三种说法,我想不通人是什么类型的人? IEnumerable(person) 还是 List(person)?我假设幕后有转换。有人可以解释一下语句 3 中使用了哪些技术
我有两个外部电话 这给出了 Future[Seq[People]] 它接受 person_id 并返回 person_status 作为 Future[String] 我需要使用第一个调用中可用序列中
在 HP Probook 4540S 笔记本(Win 7Prof 64 位)上安装 Delphi XE3 后,我在编译时遇到问题,该项目是一个空的 VCL 项目,表单上没有任何组件。起初,我收到“无效
我有类人: class Person{ private String name; public Person(String name) { this.name = na
我在尝试实现我的程序时遇到链接器错误 undefined reference to Person::Person。三个部分如下。我一直在努力修复它几个小时。我知道这可能很简单,只是我没有看到。但是我在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
In function 'int main()': 41 14 [Error] no match for 'operator=' (operand types are 'Person' a
有没有XXXUtils我在哪里可以做 String s = XXXUtils.join(aList, "name", ","); 哪里"name"是 aList 中对象的 JavaBeans 属性.
我不知道以前有没有人问过这个问题,因为英语不是我的母语,我也不知道要搜索的关键字。 所以基本上我有以下输入元素, 我想将名称分成 3 个部分,例如 ["person", "0", "email"]。
我正在比较本地计算机中的证书,MMC.exe 允许我查看“当前用户”和“计算机”的证书。 我不明白为什么会有两个“个人”商店。有人可以解释为什么有两个,以及它们如何相互作用吗? 很高兴知道为什么其他文
我是一名优秀的程序员,十分优秀!