Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


25899 / 76732 ←次へ | 前へ→

【56170】Re:Index と Join の使い方
発言  kanabun  - 08/6/6(金) 22:59 -

引用なし
パスワード
   ▼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回使ったほうがはるかに速いことが分かりました。

0 hits

【56162】Index と Join の使い方 Abebobo 08/6/6(金) 17:07 質問
【56164】Re:Index と Join の使い方 kanabun 08/6/6(金) 17:57 発言
【56165】Re:Index と Join の使い方 kanabun 08/6/6(金) 18:05 発言
【56168】Re:Index と Join の使い方 Abebobo 08/6/6(金) 18:42 お礼
【56169】Re:Index と Join の使い方 n 08/6/6(金) 19:11 発言
【56170】Re:Index と Join の使い方 kanabun 08/6/6(金) 22:59 発言
【56177】Re:Index と Join の使い方 Abebobo 08/6/7(土) 13:09 お礼
【56219】Re:Index と Join の使い方 Abebobo 08/6/9(月) 10:16 お礼
【56220】Re:Index と Join の使い方 kanabun 08/6/9(月) 11:06 発言
【56222】Re:Index と Join の使い方 Abebobo 08/6/9(月) 11:58 お礼
【56227】Re:Index と Join の使い方 kanabun 08/6/9(月) 16:23 発言
【56228】Re:Index と Join の使い方 Abebobo 08/6/9(月) 17:08 お礼

25899 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free