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议你试着去玩索引。