Mana from Japan, I hope you see this question as it is related to a thread that you participated in last week.
http://www.vbaexpress.com/forum/show...e-for-red-text
While I dabble in VBA with Word mostly and occasionally in Excel an Outlook, I do not consider myself a programmer. Far from it. In fact, normal programming languages such as C+, Java, VB, .Net is to me for the most part a riddle wrapped in a mystery inside a enigma.
I had tinkered with the problem for a few minutes in the morning before headed out to school and thought that I would try to solve it using a scripting dictionary. The code below shows how I would have done that. However, when I saw your use of the .NET ArrayList, I became intrigued and thought I would see where I could take it and started researching it a bit.
I thought that if it worked ArrayList worked so well in a VBA then perhaps a .NET DictionaryBase might work as well. No luck. For whatever reason, CreateObject("System.Collections.DictionaryBase") errors and while CreateObject("System.Collections.HashTable") doesn't error, the methods don't seem to work.
Do you (or anyone) know if the .NET DictionaryBase or HashTable can work in VBA?
Thanks.
Sub ScrathcMacro() 'A basic Word macro code by Greg Maxey. Dim oRng As Range, oRgSegment As Range Dim oDictionary As Object Dim lngIndex As Long Dim strText As String If Not Len(ActiveDocument.Range.Paragraphs.Last.Range) = 1 Then ActiveDocument.Range.Paragraphs.Last.Range.InsertAfter vbCr End If Set oRng = ActiveDocument.Range oRng.Collapse wdCollapseStart Set oDictionary = CreateObject("Scripting.Dictionary") Application.ScreenUpdating = False Do lngIndex = 0 Do oRng.MoveEnd wdParagraph Loop Until Len(oRng.Paragraphs.Last.Range) = 1 Set oRgSegment = oRng.Duplicate With oRgSegment.Find .Font.Color = wdColorRed Do While .Execute If Not oRgSegment.InRange(oRng) Then Exit Do oDictionary.Add fcnIntergerToLetter(lngIndex), oRgSegment.Text With oRgSegment .Text = ".........." .Font.Color = wdColorAutomatic .Collapse wdCollapseEnd End With lngIndex = lngIndex + 1 Loop End With strText = vbNullString For lngIndex = 0 To oDictionary.Count - 1 strText = strText & "%" & oDictionary.Keys()(lngIndex) & ". " & oDictionary.Item(oDictionary.Keys()(lngIndex)) Next With oRng .Paragraphs.Last.Range.Text = vbCr & strText & vbCr + vbCr .Collapse wdCollapseEnd .Move wdParagraph, 3 End With oDictionary.RemoveAll Loop Until oRng.Paragraphs.Last.Range.End = ActiveDocument.Range.End Application.ScreenUpdating = True lbl_Exit: Exit Sub End Sub Function fcnIntergerToLetter(lngCount As Long) If lngCount = 0 Then fcnIntergerToLetter = "a" Else If lngCount < 26 Then fcnIntergerToLetter = LCase(Chr(lngCount + 1 + 64)) Else fcnIntergerToLetter = "Error" End If End If End Function