ここから本文です

excelのvbaでVlookupをしたいのですが、データの数が多すぎて時間がかかります。配...

yos********さん

2011/1/123:10:25

excelのvbaでVlookupをしたいのですが、データの数が多すぎて時間がかかります。配列で処理をしたいのですが方法がわかりません。教えていただけないでしょうか。
下記のプログラムを配列に変更したいのです。

Sub Sample()
Dim i As Long
Dim StartTime, StopTime As Variant
StartTime = Time
Application.ScreenUpdating = False
With Sheets("uhwaB05")
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
.Cells(i, 29) = Application.VLookup(Cells(i, 8) & Cells(i, 10), Sheets("TP").Columns("A:D"), 2, False)
.Cells(i, 30) = Application.VLookup(Cells(i, 8) & Cells(i, 10), Sheets("TP").Columns("A:D"), 3, False)
.Cells(i, 31) = Application.VLookup(Cells(i, 8) & Cells(i, 10), Sheets("TP").Columns("A:D"), 4, False)
Next
End With
Application.ScreenUpdating = True
StopTime = Time
StopTime = StopTime - StartTime
MsgBox "処理時間=" & Minute(StopTime) & "分" & Second(StopTime) & "秒"
End Sub

よろしくお願いします。

閲覧数:
2,315
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

han********さん

編集あり2011/1/212:32:50

こんな感じでいかがでしょう。

Sub Sample()
Dim StartTime As Date, ProcessTime As Date
Dim LastRow As Long
Dim aData() As String, bData() As Variant, cData() As Variant, dData() As Variant
Dim rNum1 As Long, rNum2 As Long
Dim SearchStr As String

StartTime = Now
Application.ScreenUpdating = False
Worksheets("TP").Activate
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
ReDim aData(1 To LastRow)
ReDim bData(1 To LastRow)
ReDim cData(1 To LastRow)
ReDim dData(1 To LastRow)
For rNum1 = 1 To LastRow
aData(rNum1) = Cells(rNum1, 1).Value
bData(rNum1) = Cells(rNum1, 2).Value
cData(rNum1) = Cells(rNum1, 3).Value
dData(rNum1) = Cells(rNum1, 4).Value
Next rNum1
Worksheets("uhwaB05").Activate
For rNum2 = 2 To Cells(Rows.Count, 1).End(xlUp).Row
SearchStr = Cells(rNum2, 8).Value & Cells(rNum2, 10).Value
For rNum1 = 1 To LastRow
If aData(rNum1) = SearchStr Then
Cells(rNum2, 29).Value = bData(rNum1)
Cells(rNum2, 30).Value = cData(rNum1)
Cells(rNum2, 31).Value = dData(rNum1)
Exit For
End If
Next rNum1
Next rNum2
Application.ScreenUpdating = True
ProcessTime = Now - StartTime
MsgBox "処理時間=" & Minute(ProcessTime) & "分" & Second(ProcessTime) & "秒"
End Sub

※ 一部修正しました。

質問した人からのコメント

2011/1/3 09:52:15

hana_noppoさん,hige_082さん
ありがとうございます。
大変助かりました。結構沢山のデータを扱うことがあるので
是非、この方法を覚えたいと思います。
今まで5分前後掛っていたのが40秒程度になりました。

ベストアンサー以外の回答

1〜1件/1件中

hig********さん

2011/1/202:36:14

おはようございます yoshio_kaneda2002さん

vlookup3回よりは早いと思うけど・・・試してません
Sub Sample()
Dim i As Long
Dim StartTime, StopTime As Variant
Dim j, a, b
StartTime = Time
Application.ScreenUpdating = False
a = Sheets("TP").UsedRange
With Sheets("uhwaB05")
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
b = Cells(i, 8) & Cells(i, 10)
For j = 1 To UBound(a)
If b = a(j, 1) Then
.Cells(i, 29) = a(j, 2)
.Cells(i, 30) = a(j, 3)
.Cells(i, 31) = a(j, 4)
exit for
End If
Next
Next
End With
Application.ScreenUpdating = True
StopTime = Time
StopTime = StopTime - StartTime
MsgBox "処理時間=" & Minute(StopTime) & "分" & Second(StopTime) & "秒"
End Sub

参考まで

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる