2009-07-22 7 views
0

私は、次のVBAコードWordの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個の番号を印刷しています。

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

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

コード行の任意の数のために完璧に動作しますが、その後、いくつかの点で言葉だけでタブストップをかけ停止します。

私は10行ごとにフォーマットをリセットしないと、コードは一見永遠に(実際には!?)動作することがわかっています。しかし、すべての10ラインブレーキは必須です。

すべてが破壊される正確な行番号は、RAMの量によって異なります。 1GBの私の仕事のコンピュータでは、それはあなたが見ることができるように約800行までしか動作しません。 4GBの家庭の私のコンピュータはこの動作を示さなかった。しかし、私の生産コード(もう少し複雑です)では私の家庭用コンピュータも問題を示しているので、私はそれが十分長く実行されるならば、それを表示したと確信しています。

メモリリークなどありますか?私は何を間違えたのですか?多分、神は禁じられています、VBA自体はここでの犯人ですか?

答えて

3

定義済みのスタイルを使用してフォーマットを適用してください。違いがあるかどうかを確認してください。

+0

私は、なぜ地球上の誰もが、そのフォーマットが全く違っていないときには、すべての単一のラインを直接フォーマットしたいと思っているのだろうかと思っています。 – Tomalak

+0

すべての行ではありません。私はちょうど10行のブロックごとにフォーマットを再適用します。実際のスクリプトのやり方では、ブロック間でより多くのことが起こっています。 – eric

+0

これは私の問題を解決しました。私はこれがよりクリーンな方法であることがわかります。しかし、私はまだWordがある種のメモリリークを持っていると思います。たぶん、この「修正」はちょっと境界を押してしまったかもしれません... どうもありがとうございました。私の問題はなくなりました。 – eric

0

行を追加しているときにページ区切りをオフにして、それが役立つかどうかを確認してください。

Application.Options.Pagination = False 
+0

残念ながら、これはうまくいきませんが、正しくフォーマットされたブロックが1つ余分にあります。それ以降もまだ壊れています – eric

関連する問題