1

問題: Excelvba スクリプトを使用して、書式設定されたテキストを Excel から Word にコピーしたいと考えています。スクリプトは情報を忠実にコピーしますが、遅すぎます。

高速化のヒントを教えてください。

これまでの私のアプローチは、このダミードキュメントに記載されています。このスクリプトは、セル C1:C100 に書式設定されたテキストが含まれていることを前提としています。

一般情報。 書式設定されたテキスト ブロックを Word 文書にコピーする Excelvba マクロを作成しています。テキストブロックごとに 2 つのバージョンがあります。マクロは単語スタイルの変更を追跡し (削除: テキストの色の赤と取り消し線など)、結果を 3 番目の列にコピーします。この部分は魅力のように機能します。次に、3 番目の列が Word 文書にコピーされます。この部分は私のマシン (i7-3770、ssd、8 Gb RAM) では動作しますが、スクリプトを操作しなければならない貧しい魂のマシン (amd Athlon 220) では動作しません。生産サイズは 700 ~ 1000 テキストブロックで、100 ~ 1000 文字です。各。

option explicit
Sub start()
Dim wapp As Word.Application
Dim wdoc As Word.Document
Set wapp = CreateObject("word.application")

wapp.Visible = False
Application.ScreenUpdating = False

Set wdoc = wapp.Documents.Add
'Call copyFormattedCellsToWord(wdoc)
'Call copyFormattedCellsToWordForEach(wdoc)
'Call copyWholeRange(wdoc)
Call concatenateEverythingInAStringAndCopy(wdoc)
wapp.Visible = True
End Sub

'desired output-result (every cell in a new line and formatting preserved) meets the specs, but to slow

Sub copyFormattedCellsToWord(wdoc As Word.Document)

Dim counter As Long

Worksheets(1).Select
For counter = 1 To 100
        Worksheets(1).Range("C" & counter).Copy
        wdoc.Range(wdoc.Range.End - 1, wdoc.Range.End).PasteSpecial Placement:=wdInLine, DataType:=wdPasteHTML
Next counter

End Sub

'desired output-result, a tiny bit faster (might be only superstition), but still not fast enough

Sub copyFormattedCellsToWordForEach(wdoc As Word.Document)

Dim cell As Range

Worksheets(1).Select
For Each cell In Worksheets(1).Range("C1:C100")
        cell.Copy
        wdoc.Range(wdoc.Range.End - 1, wdoc.Range.End).PasteSpecial Placement:=wdInLine, DataType:=wdPasteHTML
Next cell

End Sub

'fast enough, but introduces a table in the word document and therefore
'doesn't meet the specs

Sub copyWholeRange(wdoc As Word.Document)

Worksheets(1).Range("C1:C100").Copy
wdoc.Range(wdoc.Range.End - 1, wdoc.Range.End).PasteSpecial Placement:=wdInLine, DataType:=wdPasteHTML

End Sub

'fast enought, looses the formatting


Sub concatenateEverythingInAStringAndCopy(wdoc As Word.Document)

Dim wastebin As String
Dim cell As Range

wastebin = ""
Worksheets(1).Select
For Each cell In Worksheets(1).Range("C1:C100")
        wastebin = wastebin & cell.Value
Next cell
Range("D1") = wastebin
Range("D1").Copy
wdoc.Range(wdoc.Range.End - 1, wdoc.Range.End).PasteSpecial Placement:=wdInLine, DataType:=wdPasteHTML

End Sub
4

1 に答える 1

1

copyWholeRangeこの方法でメソッドを変更します。

Sub copyWholeRange(wdoc As Word.Document)

    Worksheets(1).Range("C1:C10").Copy
    wdoc.Range(wdoc.Range.End - 1, wdoc.Range.End).PasteSpecial Placement:=wdInLine, DataType:=wdPasteHTML

    wdoc.Tables(1).ConvertToText Separator:=wdSeparateByParagraphs
End Sub
于 2015-10-20T06:26:14.913 に答える