[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザー定義型関数の速度を上げる方法について』(BB)
Windows Vista、Excel2003です。
エクセル上のセルの色にて数量を数える関数を作っているのですが、
データの更新にすごく時間がかかります。
関数自体は、100行の200列ぐらいに使用しております。
速度を上げる方法は、ないでしょうか?
下記が現状の関数です。
よろしくお願いします。
Function koutei(a, b As Range) As Integer
Dim HitData As String Dim c As Range HitData = a
hit = 0 For Each c In b If Len(c.Text) = 0 Then If c.Interior.ColorIndex = 36 Then For i = -1 To -1000 Step -1 If Len(c.Offset(0, i)) > 0 Then Exit For End If Next If HitData = c.Offset(0, i).Text Then If c.Row > 37 And c.Row < 106 Then hit = hit + 2 Else hit = hit + 1 End If End If End If Else If HitData = c.Text Then If c.Row > 37 And c.Row < 106 Then hit = hit + 2 Else hit = hit + 1 End If End If End If Next koutei = hit
End Function
よくわかってないけど・・・ どういう時にどうやって使うの?
一応セルへのアクセス回数を減らすため、変数に入れる案 Function koutei(a, b As Range) As Integer
Dim HitData As String Dim c As Range Dim rw As Long '行 Dim t As String '文字 Dim d As Variant 'よくわからないけど、文字調べてるやつを配列に Dim ci As Long 'カラーインデックス Dim x As String '文字調べてるやつ
HitData = a
hit = 0 For Each c In b t = c.Text ci = c.Interior.ColorIndex rw = c.Row cl = c.Column
If Len(t) = 0 Then If ci = 36 Then d = c.Resize(, c.Column - 1).Text For i = 1 To cl Step 1 x = d(1, cl - i) If Len(x) > 0 Then If HitData = x Then If rw > 37 And rw < 106 Then hit = hit + 2 Else hit = hit + 1 End If Exit For End If End If Next i End If Else If HitData = t Then If rw > 37 And rw < 106 Then hit = hit + 2 Else hit = hit + 1 End If End If End If Next c koutei = hit End Function
(稲葉)
ありがとうございます。
さっそく試してみます。
(BB)
間違えてた! -方向のOFFSET後にリサイズ 配列をtextじゃなくてvalue あと処理まとめた
Function koutei(a, b As Range) As Integer
Dim HitData As String Dim c As Range Dim rw As Long '行 Dim t As String '文字 Dim d As Variant 'よくわからないけど、文字調べてるやつを配列に Dim ci As Long 'カラーインデックス Dim x As String '文字調べてるやつ Dim flg As Boolean 'hit加算処理をまとめるため
HitData = a
hit = 0 For Each c In b t = c.Text rw = c.Row cl = c.Column d = c.Offset(, -cl + 1).Resize(, cl).Value ci = c.Interior.ColorIndex flg = False
If Len(t) = 0 Then If ci = 36 Then For i = 1 To cl - 1 Step 1 x = d(1, cl - i) If Len(x) > 0 Then If HitData = x Then flg = True Exit For End If End If Next i End If Else If HitData = t Then flg = True End If End If
If flg Then If rw > 37 And rw < 106 Then hit = hit + 2 Else hit = hit + 1 End If End If Next c
koutei = hit End Function
(稲葉)
>関数自体は、100行の200列ぐらいに使用しております。 20000箇所でこの関数を実行すると、遅いでしょうね。特に引数 b で指定される範囲が 広い場合は一回の関数呼び出しで多量のセルアクセスが発生するので、現行の構成だと どうしても時間がかかると思います。
一番時間のかかる要因はセルの色に依存して処理しているからですが、これを別列のセルに ステータスとセットで数値管理するようにできないでしょうか。
あるいは計算範囲がシンプルなのであれば、ユーザ定義関数ではなくマクロの一括処理で 行えば早くなると思います。
今回の関数は少量のセルでの使用でしたら問題ないかもしれませんが、広範囲で使用する 用途には適さないように思います。 (Mook)
ありがとうございました。
二層構造にして、値のみで管理してみます。
(BB)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.