У меня есть следующий код VBA
Private Sub CreateQuery_Click()
Dim doc As Document
Dim i As Integer
Set doc = ActiveDocument
i = doc.Paragraphs.Count
doc.Paragraphs(i).Range.InsertParagraphAfter
i = i + 1
For j = 0 To 1000
doc.Paragraphs(i).Range.InsertParagraphAfter
i = i + 1
doc.Paragraphs(i).Range.InsertParagraphAfter
i = i + 1
With doc.Paragraphs(i)
.Range.Font.Italic = True
.Range.ListFormat.ApplyBulletDefault
.Indent
.Indent
.TabStops.Add Position:=CentimetersToPoints(3.14)
.TabStops.Add Position:=CentimetersToPoints(10)
.TabStops.Add Position:=CentimetersToPoints(11)
End With
For k = 0 To 10
With doc.Paragraphs(i)
.Range.InsertAfter "testState" & vbTab & CStr(doc.Paragraphs(i).Range.ListFormat.CountNumberedItems) & vbTab & CStr(doc.Paragraphs.Count)
.Range.InsertParagraphAfter
End With
i = i + 1
Next
i = doc.Paragraphs.Count
With doc.Paragraphs(i)
.Range.ListFormat.ApplyBulletDefault
.TabStops.ClearAll
.Outdent
.Outdent
End With
Next
i = doc.Paragraphs.Count
doc.Paragraphs(i).Range.InsertParagraphAfter
i = i + 1
End Sub
По сути, этот код просто печатает n строк в определенном формате.
- Маркированный список
- С отступом
- и TabStops
(источник: lans-msp .de)
Код отлично работает для произвольного количества строк, но затем в какой-то момент Word просто перестает применять TabStops.
Я знаю, что если бы я не сбрасывал формат каждые 10 строк, код работал бы, казалось бы, вечно (правда?!?). Но тормоз каждые 10 строк обязателен.
Точный номер строки, где все ломается, зависит от объема оперативной памяти. На моем рабочем компьютере с 1 ГБ он работает только до строки 800 (как вы можете видеть). Мой домашний компьютер с 4 ГБ не показывал такого поведения. Но я уверен, что это также показало бы это, если бы я позволил ему работать достаточно долго, потому что в моем производственном коде (который немного сложнее) мой домашний компьютер также показывает проблему.
Это какая-то утечка памяти или что-то в этом роде? Что я сделал не так? Может быть, не дай бог, виноват сам VBA?