[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザー定義型関数の速度を上げる方法について』(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.