基于excel中的工作表加载对象

时间:2013-12-13 01:18:04

标签: excel vba

我有一个工作簿,其中一个或多个工作表代表customer。我还构建了一个customer类,以及一个将适用的工作表数据加载到每个客户对象中的方法。该方法就像这样工作

LoadCustomers()
  For each worksheet in the workbook
    If the worksheet contains a named range, "CustomerKey"
      Create a new customer object
      Set its key equal to the value in the range "CustomerKey"
      Load data from the worksheet into the object
    End If
  Loop
End

这一切都很有效......直到某人决定在同一工作簿中制作客户工作表的副本。然后,下次打开工作簿并运行LoadCustomers()方法时,它会找到重复的客户密钥,然后崩溃并烧毁。

在不阻止人们在工作簿中复制工作表的情况下,有什么好的解决方法?复杂性越低越好。

1 个答案:

答案 0 :(得分:1)

除了客户对象之外,还要以{Customer}为密钥,在Dictionary中保留对所有客户对象的引用。当您创建新的客户对象时,首先测试字典中是否已存在新的CustomerKey - 在这种情况下,跳过创建新对象,而是向用户显示消息。

使用词典,您需要添加对MS Scripting Runtime的引用。那么你的伪代码就是这样的:

Global gDicCustomers as Dictionary

LoadCustomers()
  Set gDicCustomers = New Dictionary
  For each worksheet in the workbook
    If the worksheet contains a named range, "CustomerKey"
      If gDicCustomers.Exists(CustomerKey) Then
        MsgBox "Dont screw with the customer worksheets - or at least be so decent to change the customer key, too!"
      Else
         Create a new customer object
         Set its key equal to the value in the range "CustomerKey"
         Load data from the worksheet into the object
         gDicCustomers.Add CustomerKey, CustomerObject
       End If
    End If
  Loop
End

此方法的另一个优点是您始终可以使用gDicCustomers(CustomerKey) ...

引用任何客户对象