2009-07-22 2 views
0

У меня есть следующий код VBAСлово VBA Tabstop неправильное поведение

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 

В основном этот код просто печатает п число строк с конкретным форматом.

  • Маркированный список
  • отступом
  • и табуляции

alt text http://files.lans-msp.de/vbscript_tabstops.png

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

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

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

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

ответ

3

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

+0

Мне также интересно, почему на земле кто-то хотел бы форматировать * каждую строку * напрямую, когда их формат вообще не отличается. – Tomalak

+0

Это не каждая строка. Я просто повторно применяю формат каждого блока из 10 строк. В реальном сценарии все больше вещей происходит между блоками. – eric

+0

Это решило проблему для меня. Я вижу, что это более чистый способ, так что здорово. Но я все еще думаю, что у Слова есть какая-то утечка памяти. Возможно, это «исправление» просто немного подтолкнуло границы ... Большое спасибо, в любом случае, моя проблема ушла, и это самое главное! – eric

0

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

Application.Options.Pagination = False 
+0

Нет, к сожалению, это не сработает, но я получаю еще один правильно отформатированный блок. После этого все еще ломается – eric

Смежные вопросы