界面设计错误
恕我直言,这看起来像是一个界面设计错误。设计人员应该做的也是导出一个GroupItemsCount 方法,客户端代码可以在尝试调用GroupItems 之前对其进行检查。
隐藏错误
我也不喜欢使用On Error Resume Next(以下简称 OERN),并且每个开发团队都试图说服同事发布一个用 .NET(C# 或 VB.NET)编写的DLL,它会掩盖这些方法引发的所有这些错误.
Excel 缺少 Worksheet Exists 方法
所以在 Excel 中,我们为每个工作簿都有一个 Worksheets 集合,但设计人员忘记导出 Exists 方法。必须调用[Worksheets]Item,但如果工作表不存在,则 Item 会引发错误。在 .NET DLL 中编写自己的 [Worksheet]Exists 方法意味着可以隐藏错误并避免 VBA OERN。
SupportsGroupItems
在您的情况下,我建议您创建自己的 SupportsGroupItems 函数,该函数本身具有错误处理程序,但它会从 VBA 视图中隐藏(因此错误会被隐藏)。它将位于 .NET DLL 中。
管理
我意识到许多经理更喜欢纯 VBA 解决方案,并且管理层可能会害怕 DLL 地狱,但如果您认为这是一次性的,他们应该可以说服。只需几行代码。
部署
DLL 解决方案的下一个问题是部署,并非所有部署都在一次完整的部署中完成,因此如果已安装,您需要编写代码以利用 DLL,如果未安装则回退到 VBA。您可以在注册表中查找代码以检测 DLL 的安装。
COM 互操作代码
如果您已阅读本文并确信您希望自己的 dll 隐藏任何错误,那么您需要一些示例代码。这个blog post 有一些示例代码。使 .NET DLL 可从 VBA 调用的关键是在 Assembly.cs 中标记 ComVisible(true) 并在项目属性的构建选项卡中确保选中以下复选框“注册 COM 互操作”。
然后确保接口和类的分离。你知道吗?让我在这里写代码。因此,这是使用 dynamic 关键字避免 Word 主互操作程序集的示例 C#。
using System;
using System.Runtime.InteropServices; // No Word PIA required
namespace SupportsGroupItemsByDynamicLib
{
public interface ISupportsGroupItemsByDynamic
{
bool SupportsGroupItemsByDynamic(object shp);
}
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ISupportsGroupItemsByDynamic))]
public class CSupportsGroupItemsByDynamic : ISupportsGroupItemsByDynamic
{
bool ISupportsGroupItemsByDynamic.SupportsGroupItemsByDynamic(object shp)
{
bool bSupportsGroupItems = false;
try
{
dynamic dynaShape = shp;
dynamic grpShps = dynaShape.GroupItems;
bSupportsGroupItems = true; // it worked
}
catch (Exception)
{
// bury the error
}
return bSupportsGroupItems;
}
}
}
这里是一些调用 .NET Dll 的示例 VBA 代码
Sub TestByDynamic()
Dim oGroupItemsByDynamic As SupportsGroupItemsByDynamic.CSupportsGroupItemsByDynamic
Set oGroupItemsByDynamic = New SupportsGroupItemsByDynamic.CSupportsGroupItemsByDynamic
Dim shp As Shape
For Each shp In ActiveDocument.Shapes
If oGroupItemsByDynamic.SupportsGroupItemsByDynamic(shp) Then
Debug.Print shp.Name + " is a group! and has " & shp.GroupItems.Count & " items"
Else
Debug.Print shp.Name + " is not a group!"
End If
Next
End Sub
以上所有使 VBA 中的 OERN 看起来很可口。