Funktionskrav:

Ändra indexmarkeringar på formen: { XE “EN 789”} till: { XE “EN 789;0789”}

Dvs lägga till ett sorteringsvärde för varje indexmarkering och padda ut det till fyra siffror.

Dagens ickeoptade funktion:

Sub EnhanceIndexEntries()
  Dim doc As Document
  Dim fld As Field
  Dim temp As String
  Dim temp2 As String
  Dim omsg As String
  Dim matches
  Dim re2, re3 As RegExp
  Set re2 = New RegExp
  Set re3 = New RegExp
  re2.Global = False
  re3.Global = False
  re2.Pattern = "\s([0-9]{2})\W"
  re3.Pattern = "\s([0-9]{3})\W"
 
  Dim cnt As Integer
  cnt = 0
 
  Set doc = ActiveDocument
  For Each fld In doc.Fields
    fld.Select
    If fld.Type = wdFieldIndexEntry Then
        cnt = cnt + 1
        temp = fld.Code
        temp2 = re2.Replace(temp, " $1;00$1" & Chr$(34))
        temp3 = re3.Replace(temp2, " $1;0$1" & Chr$(34))
        With Selection.Find
            .Text = temp
            .Replacement.Text = temp3
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
            .Execute Replace:=wdReplaceAll
        End With
    End If
  Next
  Set fld = Nothing
  Set doc = Nothing
  omsg = "Justering av indexeringsinformation klar."
  MsgBox (omgs & cnt)
End Sub

Exempel på paddingfunktion, skrivet i det närliggande språket JScript. Nej, det är inte riktigt javascript.

function padNumber(number,size){
	number = new Number(number);
	size = parseInt(size);
	if(isNaN(size) || isNaN(number)) return number+"";
	if(number < Math.pow(10,size)){
		number+=Math.pow(10,size);
		return (number+"").substring(1);
	}else{
		return number+"";
	}
}

Halvoptad kod, går ~dubbelt så snabbt som den ooptade:

Sub NewEnhanceIndexEntries()
  Dim doc As Document
  Dim fld As Field
  Dim temp As String
  Dim temp2 As String
  Dim omsg As String
  Dim matches As MatchCollection
  Dim re3 As RegExp
  Set re3 = New RegExp
  re3.Global = False
  re3.Pattern = "\s([0-9]{1,3})\W"
  Dim match As match
  Dim mval As String
 
  Dim cnt As Integer
  cnt = 0
 
  Set doc = ActiveDocument
  For Each fld In doc.Fields
    fld.Select
    If fld.Type = wdFieldIndexEntry Then
        cnt = cnt + 1
        temp = fld.Code
        If (re3.Test(temp) = True) Then
            Set matches = re3.Execute(temp)
            For Each match In matches
                mval = match.Value
            Next
 
            Dim size As Integer
            mval = Mid(mval, 2)
            mval = Left(mval, Len(mval) - 1)
            size = 4
            If (Len(mval) < (size + 1)) Then
                Do While (Len(mval) < size)
                    mval = "0" & mval
                Loop
            End If
 
            temp2 = Left(temp, Len(temp) - 1)
            temp2 = temp2 & ";" & mval & Chr$(34)
            With Selection.Find
                .Text = temp
                .Replacement.Text = temp2
                .Forward = True
                .Wrap = wdFindStop
                .Format = False
                .Execute Replace:=wdReplaceAll
            End With
        Else
            ' NOOP
        End If
    End If
  Next
  Set fld = Nothing
  Set doc = Nothing
  omsg = "Justering av indexeringsinformation klar. Indexmarkeringar totalt: "
  MsgBox (omsg & cnt)
End Sub