ここから本文です

エクセルについて教えて下さい。

mki********さん

2019/6/2206:26:28

エクセルについて教えて下さい。

vlookupなどの関数を何万行と使ったり、数種類の関数を使ったファイルは実行速度が遅くなりますよね。
VBA マクロ 、でも行数が大量だと遅くなりますよね。
VBAでワークシート関数を使う
worksheetfunction
などのコードでは速さはどうなりますか?

大量のデータをシート1からシート2に項目キーを検索してコピーする方法では何が処理スピードが速く、軽いでしょうか?

閲覧数:
44
回答数:
3

違反報告

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

kik********さん

2019/6/2210:35:46

> VBA マクロ 、でも行数が大量だと遅くなりますよね。
> VBAでワークシート関数を使う
> worksheetfunction
> などのコードでは速さはどうなりますか?

何を使ったら速くなる・・・ではなく、
最終形に向けて、処理をどう構成していくと速くなる??・・・がメインかと


例えば以下

マクロのスピードアップについて質問です。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q122091710...

速くしたいので、配列を使ってみたい・・・・
配列を使わずに、処理を見直したことで解決



> 大量のデータをシート1からシート2に項目キーを検索してコピーする方法では何が処理スピードが速く、軽いでしょうか?

これは、質問者さんが質問された以下からきてますか?

VBA初心者です。教えてください。 添付ファイル
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q142088843...


これ用に処理を記述してみたのが以下

worksheetfunction は使ってません

※ 大量なデータ同士で、ある/ない する時、Dictionary は便利です
データが少量でも問題は無く、Dictionary 記述に慣れる・・・
慣れておけば、普通に記述しても速いものは出来上がっているかと・・・


標準モジュールに記述して、Samp1 を実行してみます
処理対象は、
Sheet1 の表は、A5 ~ 出来上がっている
Sheet2 の表も、A5 ~ 出来上がっている
Sheet2 に書き出す列位置は、ウィンドウ枠が設定されている様にも見えるので、
商品部担当 を探して見つかったら、そこから3列書き出す

どうなりますか


Option Explicit

Public Sub Samp1()
   Dim dic As Object
   Dim vA As Variant, vB As Variant, vR As Variant
   Dim i As Long, j As Long, k As Long, n As Long

   Set dic = CreateObject("Scripting.Dictionary")

   With Worksheets("Sheet1").Range("A5").CurrentRegion
      vA = .Columns("A").Value
      vB = .Columns("C:E").Value
      n = UBound(vB, 2)
   End With
   For i = UBound(vA) To 2 Step -1
      If (vA(i, 1) <> "") Then dic(vA(i, 1)) = i
   Next

   With Worksheets("Sheet2").Range("A5").CurrentRegion
      vR = .Columns("A").Value
      ReDim Preserve vR(1 To UBound(vR), 1 To n)
      For j = 1 To n
         vR(1, j) = vB(1, j)
      Next
      For k = 2 To UBound(vR)
         i = dic(vR(k, 1))
         If (i = 0) Then
            vR(k, 1) = ""
         Else
            For j = 1 To n
               vR(k, j) = vB(i, j)
            Next
         End If
      Next
      For j = 2 To .Columns.Count
         If (.Cells(1, j).Value = vR(1, 1)) Then
            .Columns(j).Resize(, n).Value = vR
            Exit For
         End If
      Next
   End With

   Set dic = Nothing
End Sub

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

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

hot********さん

2019/6/2208:14:14

WorksheetFunctionはVBAでシート関数を使うためのもので、処理速度は変わりません。

大量データの場合の高速化には、一般的にはセルの値を配列に取り込んだり、検索にDictionaryオブジェクトを使ったりと言う方法が考えられます。

tok********さん

2019/6/2207:35:32

worksheetfunctionは計算結果を返すので、1回1回の計算速度はワークシート関数と同じでしょうが、計算するのは1回だけです。ただワークシート関数の方も、計算するのが1回だけならば計算後は値にしておいた方がいいですね。
データが蓄積され、都度変化を見たいケースならばともかく、先月のデータから分析とかなら、ファイルを開く、編集する、ファイルを閉じる度に無駄な再計算がかかるのはもったいないです。

検索で一番早いのはmatchですね。findは遅いですが、「下から検索」出来るのは強みです。

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

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

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

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

閉じる

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

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

閉じる