C#Excel VBA使模块名称不依赖于语言
excelFile.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
Office英文版中的代码将创build一个名为“Module1”的模块。 但是,如果办公语言不同,“Module1”将以另一种语言。 我需要知道如何在我的代码中调用这个模块。
var standardModule = excelFile.VBProject.VBComponents.Item("ThisWorkbook");
同样的问题在这里英文版的Office“ThisWorkbook”退出,但在另一种语言中,它将被称为不同的。
有可能使这种代码语言独立?
第一个很容易 – VBComponents.Add
返回一个VBComponent
。 你可以检查.Name
属性:
var module = excelFile.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule); Debug.WriteLine(module.Name);
第二个是有点棘手。 您需要循环遍历所有的VBComponents,并testingWorkbook对象唯一的两件事情。 它的vbext_ct_Document
集合中将有一个vbext_ct_Document
和134个属性,默认情况下:
VBComponent thisWorkbook; foreach (var module in excelFile.VBProject.VBComponents) { var test = module as VBComponent; if (test.Type == vbext_ComponentType.vbext_ct_Document && test.Properties.Count == 134) { thisWorkbook = test; Debug.WriteLine(thisWorkbook.Name); break; } }
编辑: Linq解决scheme看起来像这样,但它可能是你可以离开这种方式悬挂互操作引用。 如果你想尝试它,它不会受到伤害 – 但如果Excel没有正常closures,它将成为我看的第一个地方:
var thisWorkbook = (excelFile.VBProject.VBComponents).Cast<VBComponent>() .First(x => x.Type == vbext_ComponentType.vbext_ct_Document && x.Properties.Count == 134);
EDIT2:正如@ Mat'sMug在评论中指出的那样,属性数量是特定于版本的 – 上面的值可能特定于Excel 2013.对于新的工作簿,ThisWorkbook模块将是具有最高属性计数的模块。 这应该适用于任何版本:
VBComponent thisWorkbook = null; foreach (var component in excelFile.VBProject.VBComponents.Cast<VBComponent>()) { if (thisWorkbook == null || component.Properties.Count > thisWorkbook.Properties.Count) { thisWorkbook = component; } } Debug.WriteLine(thisWorkbook.Name);
LINQ:
var thisWorkbook = excelFile.VBProject.VBComponents.Cast<VBComponent>() .Aggregate((p, x) => (p.Properties.Count > x.Properties.Count ? p : x));
excelFile.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
VBComponents.Add
是一个函数 ,返回刚刚添加的对象 – 但是你丢弃了这个引用。
所有你需要做的就是坚持那个参考:
var component = excelFile.VBProject.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
然后你可以随意重命名(尽pipe在父项目中必须是唯一的):
component.Name = "RenameMe";
…或者,如果你只需要知道它的名字,那么你就可以阅读:
Debug.WriteLine(component.Name);
由于您只是在代码中添加了该模块,因此它应该位于最后一个索引位置,因此应该可以通过执行以下操作来访问:
VBComponent ModuleIJustAdded = excelFile.VBProject.VBComponents.Item(excelFile.VBProject.VBComponents.Count - 1);
既然你不确定这个模块的名字,我build议你试着去玩索引。