VBScriptの実行速度

解決


しゅう  2007-12-04 07:04:04  No: 138275

[環境]
Windows 2000
Excel 2000
VBScript

[testin.csv]に下記の様に4種類の文字列が入っています。
そのファイルを入力として[testin.xls]の様に
文字列が最初に出てきた行にその数量を出力する
[Excel Macro]と[VBScript]を作成しました。
[Excel Macro]の実行時間は1秒以内です。
それに対して[VBScript]の実行時間は10秒程度です。
VBScriptを初めて使用するために分からないのですが、
VBScriptはこれ程時間のかかるものなのでしょうか?
それとも記述に間違いがあるのでしょうか?

[Excel Macro]
Sub Macro1()
    Workbooks.Open Filename:="C:\temp\testin.csv"
    Set StartRange = Range("A1")
    Set EndRange = Range("A65536").End(xlUp)
    For Each SeachWord In Range(StartRange, EndRange)
        If (WorksheetFunction.CountIf(Range(StartRange, SeachWord), SeachWord)) = 1 Then
            SeachWord.Offset(, 1).Value = (WorksheetFunction.CountIf(Range(SeachWord, EndRange), SeachWord))
        End If
    Next
End Sub

[VBScript]
' CSVファイルをExcelファイルに変換して保存する

Const xlToRight = -4161
Const xlUp = -4162

' 引数より対象ファイル名を取得する
FileName = WScript.Arguments(0)

Set ExcelApp = CreateObject("Excel.Application")

With ExcelApp
    .Workbooks.Open FileName
    Set StartRange = .Range("A1")
    Set EndRange = .Range("A65536").End(xlUp)
    For Each SeachWord In .Range(StartRange, EndRange)
        If (.WorksheetFunction.CountIf(.Range(StartRange, SeachWord), SeachWord)) = 1 Then
            SeachWord.Offset(, 1).Value = (.WorksheetFunction.CountIf(.Range(SeachWord, EndRange), SeachWord))
        End If
    Next
    .ActiveWorkbook.SaveAs fileName & ".xls", -4143
    .Quit()
End With

[testin.csv](入力/1024行まで繰り返し)
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
CCCC
DDDD

[testin.xls](出力/1024行まで繰り返し)
AAAA 256
BBBB 256
CCCC 256
DDDD 256
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
CCCC
DDDD
AAAA
BBBB
CCCC
DDDD


魔界の仮面弁士  2007-12-04 07:27:58  No: 138276

> 1秒以内です。
> 10秒程度です。
当方だと、0.3秒 / 5.5秒といったところでした。

> VBScriptはこれ程時間のかかるものなのでしょうか?
Excel にとってみれば、「自分自身」の内部での対話ですが、
VBScript にとっては、「外部コンポーネントとの通信」が発生するためです。

> それとも記述に間違いがあるのでしょうか?
言語的な時間差を比較するのであれば、Excel 側も
  Set ExcelApp = CreateObject("Excel.Application")
から初めて、「自分自身とは別の」Excel を操作しないと不公平かと…。(^^;


しゅう  2007-12-04 07:44:53  No: 138277

魔界の仮面弁士様

早速のお返事ありがとうございます。

> 言語的な時間差を比較するのであれば、Excel 側も
>   Set ExcelApp = CreateObject("Excel.Application")
> から初めて、「自分自身とは別の」Excel を操作しないと不公平かと…。(^^;

比較する前提が間違っているという事を教えて頂きありがとうございます。
マクロを立ち上げるのを無駄に感じてVBScriptを作成してはみたものの
速度が遅くてどうやったら速くなるのかという事ばかり考えて
無駄な時間を過ごしていました。

今後は納得してVBScriptを使用する事ができます。
本当にありがとうございました。


しゅう  2007-12-04 08:43:56  No: 138278

解決チェック忘れました。


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




  


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