0

次の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 行を特定の形式で出力するだけです。

  • 箇条書きリスト
  • インデント
  • とタブストップ

代替テキスト
(ソース: lans-msp.de )

コードは任意の行数に対して完全に機能しますが、ある時点で Word は TabStops の適用を停止します。

10 行ごとにフォーマットをリセットしなければ、コードは永遠に機能するように見えることはわかっています (本当に?!?)。ただし、10 ラインごとのブレーキは必須です。

すべてが壊れる正確な行番号は、RAM の量に依存します。1GBの私の仕事用コンピューターでは、800行目までしか機能しません(ご覧のとおり)。自宅の 4GB のコンピューターでは、この動作は見られませんでした。しかし、私の製品コード (もう少し複雑です) では、自宅のコンピューターでも問題が発生するため、十分な時間実行させていれば、同様に表示されたと確信しています。

これはある種のメモリリークか何かですか?私は何を間違えましたか?おそらく、VBA 自体がここで犯人なのでしょうか?

4

2 に答える 2

3

定義されたスタイルを使用してフォーマットを適用してみてください。それが違いを生むかどうかを確認してください。

于 2009-07-22T09:06:05.617 に答える
0

行を追加するときに自動ページ付けをオフにしてみて、それが役立つかどうかを確認してください。

Application.Options.Pagination = False
于 2009-07-22T09:03:16.013 に答える