|
▼Abebobo さん:
こんばんは。
>>Transpose
>使ったことなかったです。実は、『こいつ存在する意味有るのか?』とまで思っていて調べてもいませんでした。 調べてみます。
>
セルの行データを Joinして文字列を作り出すために Application.Index、
また セルの列データを Application.Transpose を使いますが、
Indexと Transpose でどのくらいスピードがちがうのか、ためしに実験して
みました。
'ワークシートの 250*250 の範囲に 数値データを作成します
Sub 準備()
Dim v(1 To 250, 1 To 250)
Dim i&, j&
For i = 1 To 250
For j = 1 To 250
v(i, j) = Int(250 * Rnd + 1)
Next
Next
Worksheets("Sheet3").Range("A1").Resize(250, 250).Value = v
End Sub
'これを Index関数で行単位で Joinして時間を計ってみました。
Sub Test1()
Dim ss$
Dim i&
Dim r As Range
Dim t!
t = Timer
Set r = Worksheets("Sheet3").Range("A1").Resize(250, 250)
For i = 1 To 250
'ss = Join(Application.Index(r, i))
ss = Join(Application.Index(r.Value, i))
Next
Debug.Print "'Range Index "; Timer - t; """"
Beep
End Sub
'結果
'Range Index 9.640625 "
'Range Index 9.585938 "
'Range Index 9.585938 " ------------ とても時間がかかっています
遅いのは、Index は配列として処理しないといけないことも要因のようです。
Rangeに対してIndexがかけれない。
つぎに、列単位で Transposeして join してみました。
Sub Test2()
Dim ss$
Dim i&
Dim r As Range
Dim t!
t = Timer
Set r = Worksheets("Sheet3").Range("A1").Resize(250, 250)
For i = 1 To 250
ss = Join(Application.Transpose(r.Columns(i)))
Next
Debug.Print "'Range Transpose "; Timer - t; """"
Beep
End Sub
'結果
'Range Transpose 0.078125 "
'Range Transpose 0.15625 "
'Range Transpose 0.09375 " '---- Transpose はIndexと比べるとかなり高速
そこで、行単位のデータをTransposeを2回使うことで1次元配列にして、
Joinしてみました。
Sub Test22()
Dim ss$
Dim i&
Dim r As Range
Dim t!
t = Timer
Set r = Worksheets("Sheet3").Range("A1").Resize(250, 250)
With Application
For i = 1 To 250
ss = Join(.Transpose(.Transpose(r.Rows(i))))
Next
End With
Debug.Print "'Range Transpose^2 "; Timer - t; """"
Beep
End Sub
'結果
'Range Transpose^2 0.1796875 "
'Range Transpose^2 0.1640625 "
'Range Transpose^2 0.1484375 "
見られるように、行単位のデータをJoinするにも Index関数よりも、
Transposeを2回使ったほうがはるかに速いことが分かりました。
|
|