Word VBA Tabstop неправильное поведение

У меня есть следующий код 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

alt text
(источник: lans-msp .de)

Код отлично работает для произвольного количества строк, но затем в какой-то момент Word просто перестает применять TabStops.

Я знаю, что если бы я не сбрасывал формат каждые 10 строк, код работал бы, казалось бы, вечно (правда?!?). Но тормоз каждые 10 строк обязателен.

Точный номер строки, где все ломается, зависит от объема оперативной памяти. На моем рабочем компьютере с 1 ГБ он работает только до строки 800 (как вы можете видеть). Мой домашний компьютер с 4 ГБ не показывал такого поведения. Но я уверен, что это также показало бы это, если бы я позволил ему работать достаточно долго, потому что в моем производственном коде (который немного сложнее) мой домашний компьютер также показывает проблему.

Это какая-то утечка памяти или что-то в этом роде? Что я сделал не так? Может быть, не дай бог, виноват сам VBA?


person eric    schedule 22.07.2009    source источник


Ответы (2)


Попробуйте применить форматирование, используя определенный стиль. Посмотрите, есть ли разница.

person codeape    schedule 22.07.2009
comment
Мне также интересно, с какой стати кто-то захочет форматировать каждую строку напрямую, если их формат вообще не отличается. - person Tomalak; 22.07.2009
comment
Это не каждая строчка. Я просто повторно применяю формат каждый блок из 10 строк. В реальном сценарии между блоками происходит больше всего. - person eric; 22.07.2009
comment
Это решило проблему для меня. Я вижу, что это более чистый способ, так что это здорово. Но я все еще думаю, что в Word есть какая-то утечка памяти. Может быть, это «исправление» просто немного раздвинуло границы... В любом случае, большое спасибо, моя проблема исчезла, и это самое главное! - person eric; 28.07.2009

Вы можете попробовать отключить автоматическое разбиение на страницы при добавлении строк, чтобы посмотреть, поможет ли это.

Application.Options.Pagination = False
person Gary McGill    schedule 22.07.2009
comment
Нет, к сожалению, это не работает, но я получаю один дополнительный правильно отформатированный блок. После этого все равно ломается - person eric; 22.07.2009