|
はじめまして。一子と申します。
下記のような現象の原因が特定できず
今回、こちらに投稿させていただきました。
よろしくお願いします。
まったく同じ処理を、下記AとBの方法で実行した場合、
A:Excelファイルを開いてからすぐに実行したとき
B:任意のセルをダブルクリックしてから実行したとき
Bの方が処理速度が速くなるという現象が発生しています。
どうも、下記のような、セルの一文字ずつの書式を
判定する処理が入っているために
.Characters(i, 1).Font.Underline
AとBで処理速度が変わってしまうということまでは分かったのですが、
これ以上の原因を特定することができません。
できれば、Aの場合でも、Bと同程度の速度で処理をさせたいため、
Bが速くなる(またはAが速くなる)原因と対処方法を
お教えいただけるとありがたいです。
【環境】
XP、Excel 2000
【再現方法】
(1)1シートだけのExcelファイルを新規で作成します。
(2)シートのA1〜A5のセル一つずつに200文字程度の
任意の文字列を入力します。
(3)同シート内にボタンを配置し、このボタンの
クリック時イベントに下記の処理を記載します。
※実際の処理から現象の再現に必要な部分だけ抽出しています。
-----------------------------------------------------
Private Sub CommandButton1_Click()
Dim startTime As Date
Dim endTime As Date
Dim i As Long
Dim max_i As Long
Dim startNum As Long
Dim endNum As Long
Dim targetCells As Range
Dim rngTarget As Range
Dim charUnderLine As Variant
'処理の開始時間の取得
startTime = Now()
'シートの設定
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets(1)
'開始行番号の指定
startNum = 1
'終了行番号の指定
endNum = 5
'対象セル群の指定
Set targetCells = sh.Range(sh.Cells(startNum, 1), sh.Cells(endNum, 1))
For Each rngTarget In targetCells
'セル内の文字数の取得
max_i = Len(rngTarget)
'一文字ずつ処理を行う
For i = 1 To max_i
'※この処理が処理速度に影響を与えているらしい
charUnderLine = rngTarget.Characters(i, 1).Font.Underline
'ステータスバーに処理行数と文字数を表示
Application.StatusBar = rngTarget.Row & "/" & endNum & " 行目の " _
& i & "/" & max_i & "文字目を処理中です"
Next i
Next
'ステータスバーの表示を初期化する
Application.StatusBar = False
'処理終了時間の取得
endTime = Now()
MsgBox ("処理終了!" & vbCrLf _
& "処理にかかった時間:" & Format(endTime - startTime, "nn分ss秒"))
End Sub
-----------------------------------------------------
(4)作成したExcelファイルを保存し、一旦閉じます。
他に開いているExcelファイルがあれば、それらも全て閉じます。
(Excelのウィンドウも閉じてください)
(5)作成したExcelファイルを開き、ボタンをクリックします。
私の環境では、処理が終了するまでに平均1分かかりました。
(6)次は、シートの任意のセルをダブルクリックして入力状態にします。
特に何も入力せずセルの入力状態を解除します。
この後にボタンをクリックします。
(5)のときより処理速度が速くなっているかと思います。
私の環境では、処理が終了するまでに平均12秒かかりました。
以上、何卒よろしくお願いします。
|
|