比较Microsoft Word宏

时间:2018-03-18 21:48:29

标签: vba ms-word

在Microsoft Word宏中,我尝试创建一个有序列表,其中包含一些附加到每个人的数据(例如年龄)。

我创建了一个名为CPersonName的类模块,如下所示:

Option Explicit
Public LastName As String
Public FirstName As String

Sub(宏)中,我有以下代码:

Dim PersonA As CPersonNamne, PersonB As CPersonNamne, PersonsWithData As Object
Set PersonA = New CPersonNamne
Set PersonB = New CPersonNamne
Set PersonsWithData = CreateObject("System.Collections.SortedList")
PersonA.LastName = "Smith"
PersonA.FirstName = "Sven"
PersonB.LastName = "Miller"
PersonB.FirstName = "Tom"
PersonsWithData.Add PersonA, 77
PersonsWithData.Add PersonB, 18

但宏在最后一行失败(当试图将第二个人插入到排序列表中时)。 Microsoft Word抱怨无法比较2个元素。当然,程序必须将PersonA与PersonB进行比较,以了解哪一个应该在列表中的第一位。显而易见的方法是按元素比较它们。 (这意味着它应该比较姓氏,并且,如果姓氏相等,则比较拳头名。)但是如果Microsoft Word没有隐含地这样做,我将不得不定义运算符"<"对于CPersonName。怎么做的?

我有两个丑陋的选择:

  1. 使用例如200个字符的字符串,其中前100个字符 字符是姓氏(右边用空格填充)和最后一个 100个字符是名字(右边用空格填充)和 然后在排序列表中使用这些字符串作为键。
  2. 将人员插入数组,实现插入排序。
  3. 这是可以做到的最好的     Microsoft Word?

1 个答案:

答案 0 :(得分:1)

我过去了:

  1. Age添加为您班级的成员
  2. 使用LastNameFirstName的组合作为key
  3. 如下

    • 班级代码

      Public LastName As String
      Public FirstName As String
      Public Age As Long
      
    • 您的子代码

      Option Explicit
      
      Sub main()
      
          Dim PersonA As CPersonName, PersonB As CPersonName
      
          Set PersonA = New CPersonName
          Set PersonB = New CPersonName
      
          Dim PersonsWithData As Object
          Set PersonsWithData = CreateObject("System.Collections.SortedList")
      
          With PersonA
              .LastName = "Smith"
              .FirstName = "Sven"
              .Age = 77
          End With
      
          With PersonB
              .LastName = "Miller"
              .FirstName = "Tom"
              .Age = 18
          End With
      
          PersonsWithData.Add PersonA.LastName & PersonA.FirstName, PersonA
          PersonsWithData.Add PersonB.LastName & PersonB.FirstName, PersonB
      
      
          Dim i As Long
          With PersonsWithData
              For i = 0 To .Count - 1
                  Debug.Print .getkey(i), .GetByIndex(i).Age
              Next
          End With
      End Sub
      

      输出:

      MillerTom      18 
      SmithSven      77