処理速度


べジー田  2005-03-14 20:46:00  No: 88834

VB6.0
EXCEL2000
WINDOWS2000
で次の一行がやたらと遅いのですが、

Worksheets(1).Range("B13:M18").Copy _
Destination:=Worksheets(ObjSheet.Sheets.Count).Rang("B13:M18")

コピーに関して処理速度を速くするにはどうしたらいいですか?


ぬるぽ  2005-03-14 21:30:43  No: 88835

説明が抽象的すぎやしないでしょうか?
Excelの画面を表示しているとか、していないとか。
他の環境では試したらどうなのか、とか。

掲示板で質問する前にやるべきことやってないんじゃ、お話になりませんよね。


べジー田  2005-03-14 22:42:49  No: 88836

ぬるぽさん、すいませんでした。掲示板の書き込みはじめてでして、、、
Excelの画面は表示してませんし、もちろん画面の更新もありません。
他の環境ではWindowsXPで試しても同様の結果でした。
それ以外のことはメモリの問題かとも思いシャットダウンしてみたりしたのですが
解決できませんでした。


魔界の仮面弁士  2005-03-14 23:25:39  No: 88837

これって、ワークシート数が1個しかない場合に、
自分を自分にコピーすることになってしまいませんか?

> Worksheets(1).Range("B13:M18").Copy

まず、この部分がNG。Worksheets(1) ではなく、
objBook.Worksheets(1) のような構文を使いましょう。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200403/04030102.txt

たとえば、このようなイメージで。

Dim oApp As Excel.Application
Dim oBook As Excel.Workbook
Dim oSheets As Excel.Sheets

Set oApp = New Excel.Application
oApp.Visible = True
Set oBook = oApp.Workbooks.Add(〜)  'または、oApp.Workbooks.Open(〜)
Set oSheets = oBook.Sheets   '一度変数に受ける。

oSheets(1).Range("B13:M18").Copy Destination:=oSheets(oSheets.Count).Range("B13:M18")


べジー田  2005-03-14 23:37:59  No: 88838

魔界の仮面弁士さんごめんなさい、記述ミスです。
例えばこんなんで、
ObjSheet.Sheets(1).Range("B7:Y12").Copy _
Destination:=ObjSheet.Sheets(2).Range("B7:Y12")
モデルシートからコピーして新しいシートに貼り付けたいだけなんですが、この1ステップに1秒くらいかかるんです。これって普通ですか?


魔界の仮面弁士  2005-03-15 04:22:11  No: 88839

えぇと。
ObjSheetという変数の中身は、(Worksheetではなく)Workbookオブジェクトですか?

> この1ステップに1秒くらいかかるんです。
シートに、いろいろな書式設定や式があれば、もっと時間がかかる場合も
ありますし、逆に情報が単純なら、一瞬で完了する場合もあります。
アンチウィルス系のソフトが、実行速度の障害となるケースもありますね。

> これって普通ですか?
と言われても、べジー田さんがお使いのExcelシートの内容や
環境構成などを一切知りませんので、何とも答えようがありません。

とりあえず、
・新規ブックでも遅いのか(空のSheet1から空のSheet2へのコピー)
・他のPCで実行した時も遅いのか
・実行速度に影響を与えるようなソフトが入っていないか
・手動でコピーを行った時にも遅いのか
などを調べてみましょう。

ちなみに下記のコードを試してみたところ、
当方の環境では平均 0.57813秒で実行されました。

Private Sub Main()
    Dim T1 As Single, T2 As Single
    T1 = Timer

    Dim O As Object
    Dim B As Object
    Set O = CreateObject("Excel.Application")
    O.Visible = True
    O.SheetsInNewWorkbook = 3
    Set B = O.Workbooks.Add()

    B.Worksheets(1).Range("B7:Y12").Copy B.Worksheets(2).Range("B7:Y12")

    B.Saved = True
    B.Close
    Set B = Nothing
    O.Quit
    Set O = Nothing

    T2 = Timer
    Debug.Print FormatNumber(T2 - T1, 5)
End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加