FC2ブログ

Excelじゆうちょう

Excelのお絵描きツール『りっぷ2(りっぷつぅ)』のサポートページ、まずは「はじめに」をご覧ください。 [NewEntry] [Admin]

記事更新カレンダー

11 « 2018-12 « 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

拍手コメント一覧(拍手はしない)

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

pxivもやってます
リンクの一番上からのぞきに来てください
※閲覧にはユーザー登録が必要です

RSSってなんぞ?

広告は消せないらしい

FC2Ad

        --------       スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

        2010-10-02       画面更新でも高速処理

感動した!

ExcelVBAパフォーマンスレポート 』にいたく感動しました。
そんなわけで、読んでいて気になったことを私なりにレポートしてみることにしました。

よかったら皆さんも1冊、第2弾出るように祈りながら。



ScreenUpdatingプロパティをFalseにすることで、処理は高速になります。
基本中の基本ですね、この本でもちゃんと紹介されてます。
画面更新しなくていいんですから当然の結果です。

では、こんな場合はどうなりますでしょうか?
操作するセルがもともと画面の外にある場合。
これだと画面を更新する必要はありませんので、早くなるのではないでしょうか。

それを確かめるため、画面上に表示されているセル(1,1)と表示されていないセル(1,100)とで比較します。
※実験で使用したブックは、一切スクロールせず、塗りつぶし以外の操作はしていません。


'【コードウインドウ】
Private Declare Function GetTickCount Lib "kernel32" () As Long '時間計測用API

Private Sub testWindowIn() '画面内を操作
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Debug.Print "↓画面内を操作↓"
For For0 = 1 To 4
Tck0 = GetTickCount
For For1 = 1 To 100000
Cells(1).Interior.ColorIndex = 1
Next For1
Tck1 = GetTickCount
Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testWindowOut() '画面外を操作
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Debug.Print "↓画面外を操作↓"
For For0 = 1 To 4
Tck0 = GetTickCount
For For1 = 1 To 100000
Cells(100).Interior.ColorIndex = 1
Next For1
Tck1 = GetTickCount
Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

【イミディエイトウインドウ】
↓画面内を操作↓
1回目 11825 ミリ秒
2回目 11731 ミリ秒
3回目 11747 ミリ秒
4回目 11747 ミリ秒
↓画面外を操作↓
1回目 3978 ミリ秒
2回目 3869 ミリ秒
3回目 3869 ミリ秒
4回目 3884 ミリ秒


まさかこんなにきれいは結果が得られるとは!
操作対象のセルが画面上にあるかどうかは、処理速度に大きく影響するみたいです。

ついでに、ScreenUpdatingプロパティをFalseにして画面更新をオフにした場合と、Excelを最小化した状態でセル(1,1)を操作した場合とを比較します。


'【コードウインドウ】
Private Sub testUpdatingFalse() '画面更新オフ
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Application.ScreenUpdating = False
Debug.Print "↓画面更新オフ↓"
For For0 = 1 To 4
Tck0 = GetTickCount
For For1 = 1 To 100000
Cells(1).Interior.ColorIndex = 1
Next For1
Tck1 = GetTickCount
Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
Application.ScreenUpdating = True
End Sub

Private Sub testWindowMini() '画面を最小化
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Application.WindowState = xlMinimized '画面を最小化
Debug.Print "↓画面を最小化↓"
For For0 = 1 To 4
Tck0 = GetTickCount
For For1 = 1 To 100000
Cells(1).Interior.ColorIndex = 1
Next For1
Tck1 = GetTickCount
Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

【イミディエイトウインドウ】
↓画面更新オフ↓
1回目 3603 ミリ秒
2回目 3510 ミリ秒
3回目 3510 ミリ秒
4回目 3510 ミリ秒
↓画面を最小化↓
1回目 11357 ミリ秒
2回目 11247 ミリ秒
3回目 11248 ミリ秒
4回目 11247 ミリ秒


画面更新オフは、納得の速度です。
画面を最小化は、ぜんぜん速くありません。
スクロールしないと表示されないセルと、最小化して見えなくなっているセルとでは扱いが違うのかもしれません。

どうあれ、画面更新しないのが一番速いのは確かです。
素直にScreenUpdatingプロパティをFalseにしておきましょう。
スポンサーサイト

        2010-09-21       ¥演算子で使うデータ型は?

感動した!

ExcelVBAパフォーマンスレポート 』にいたく感動しました。
そんなわけで、読んでいて気になったことを私なりにレポートしてみることにしました。

よかったら皆さんも1冊、第2弾出るように祈りながら。



この本の中で、/演算子の計算に整数を使用した場合と実数を使用した場合の処理速度の比較がありました。
これ以上はネタバレになってしまいますので、続きは本を買って読んでください。

本の中では/演算子を使う際のデータ型によってあんな結果になっちゃったので、\演算子ではどうなのかなという疑問を持ちました。
ちなみに、\演算子とは除算の商を得る演算子です。
りっぷ2(りっぷつぅ)ではとってもお世話になってますからね、確かめておかないといけません。

コードは以下の通りです。


'【コードウインドウ】
Private Declare Function GetTickCount Lib "kernel32" () As Long '時間計測用API

Private Sub testQuotientLong() 'Long型で\演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Lng_sol As Long, Lng_div1 As Long, Lng_div2 As Long
Lng_sol = 0
Lng_div1 = 1
Lng_div2 = 2
Debug.Print "↓Long \ Long↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    Lng_sol = Lng_div1 \ Lng_div2
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testQuotientSingle() 'Single型で\演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Lng_sol As Long, Lng_div1 As Single, Lng_div2 As Single
Lng_sol = 0
Lng_div1 = 1#
Lng_div2 = 2#
Debug.Print "↓Single \ Single↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    Lng_sol = Lng_div1 \ Lng_div2
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testQuotientDouble() 'Double型で\演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Lng_sol As Long, Lng_div1 As Double, Lng_div2 As Double
Lng_sol = 0
Lng_div1 = 1#
Lng_div2 = 2#
Debug.Print "↓Double \ Double↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    Lng_sol = Lng_div1 \ Lng_div2
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

【イミディエイトウインドウ】
↓Long \ Long↓
1回目 7332 ミリ秒
2回目 7238 ミリ秒
3回目 7239 ミリ秒
4回目 7238 ミリ秒

↓Single \ Single↓
1回目 20140 ミリ秒
2回目 20030 ミリ秒
3回目 20031 ミリ秒
4回目 20030 ミリ秒

↓Double \ Double↓
1回目 20140 ミリ秒
2回目 20046 ミリ秒
3回目 20046 ミリ秒
4回目 20031 ミリ秒



ダントツでLong型が高速でした。
Single型とDouble型は似たり寄ったり、処理で求める実数の精度によって使い分けるのがよさそうです。

        2010-09-18       文字列を連結する&、+

感動した!

ExcelVBAパフォーマンスレポート 』にいたく感動しました。
そんなわけで、読んでいて気になったことを私なりにレポートしてみることにしました。

よかったら皆さんも1冊、第2弾出るように祈りながら。



なんだって、+演算子でも文字列連結ができると!
し、知らなかった…ExcelVBAでは&演算子しか使えないと思い込んでました。
ちょっと試してみるだけで確認できるのに、先入観って怖いですね。

それでは、&演算子と+演算子の速度比較をしておきましょうかね。
この本では取り上げられていませんでしたから。
+演算子は四則演算でも使いますので、区別をするために文字列連結には&演算子が推奨されているそうですが、もし大きく処理速度に影響するなら…
まあ、やってみましょう。


'【コードウインドウ】
Private Declare Function GetTickCount Lib "kernel32" () As Long '時間計測用API

Private Sub testStringJoin0() '&演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Str_join As String
Debug.Print "↓&演算子↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 10000000
    Str_join = "E" & "x" & "c" & "e" & "l" & "V" & "B" & "A" '&で連結するだけ
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testStringJoin1() '+演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Str_join As String
Debug.Print "↓+演算子↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 10000000
    Str_join = "E" + "x" + "c" + "e" + "l" + "V" + "B" + "A" '+で連結するだけ
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

【イミディエイトウインドウ】
↓& 演算子↓
1回目 11435 ミリ秒
2回目 11419 ミリ秒
3回目 11373 ミリ秒
4回目 11435 ミリ秒
↓ 演算子↓
1回目 11451 ミリ秒
2回目 11279 ミリ秒
3回目 11278 ミリ秒
4回目 11326 ミリ秒


どちらもほぼ同じ結果になりました。
これまで通り、&演算子を使うようにします。

ちなみに、&演算子と+演算子の動作はちょっと違います。
こんな感じです。


'【コードウインドウ】
Private Sub StringJoin()
MsgBox "1" & 1 '"11"と表示
MsgBox 1 & "1" '"11"と表示
MsgBox "A" & 1 '"1A"と表示
MsgBox 1 & "A" '"A1"と表示
MsgBox "1" + 1 '"2"と表示
MsgBox 1 + "1" '"2"と表示
'MsgBox "A" + 1 '実行時エラー(データ型不一致)
'MsgBox 1 + "A" '実行時エラー(データ型不一致)
End Sub


↓左から順番に表示されます↓
文字列連結

&演算子は、データ型が数値であっても文字列に変換されてしまいます。
+演算子は、データ型が文字列であっても片方が数値と評価できる場合は変換されます。
ただし、両方が文字列型の場合はそのまま文字列として連結されます。("1" + "1"だと"11")

        2010-09-14       パフォーマンスレポート、再現実験

感動した!

ExcelVBAパフォーマンスレポート 』にいたく感動しました。
そんなわけで、読んでいて気になったことを私なりにレポートしてみることにしました。

よかったら皆さんも1冊、第2弾出るように祈りながら。



とはいえ、今回は再現実験です。
本に書いてあるのと同じテストをして、結果を確認します。
ぶっちゃけネタバレですが、このテストは本のサンプルとして公開されてますので大丈夫でしょう。
実験のコードも、私が以前から使用しているものを応用して使いますしね。

ある文字列が空文字("")であるかどうかを、3通りの方法で調べます。
1、=演算子(String = "")
2、Like演算子(String Like "")
3、Len関数(Len(String) = 0)

結果を先に言ってしまうと、Len関数がもっとも早く処理できます。
(理由は、本を買うかサンプルを見てくださいね)

さてさて、それでは私もやってみましょう。


'【コードウインドウ】
Private Declare Function GetTickCount Lib "kernel32" () As Long '時間計測用API

Private Sub testEqual() '=演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Str_ As String
Str_ = ""
Debug.Print "↓=演算子↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    If Str_ = "" Then
    End If
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testLike() 'Like演算子
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Str_ As String
Str_ = ""
Debug.Print "↓Like演算子↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    If Str_ Like "" Then
    End If
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testLen() 'Len関数
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
Dim Str_ As String
Str_ = ""
Debug.Print "↓Len関数↓"
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 500000000
    If Len(Str_) = 0 Then
    End If
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

【イミディエイトウインドウ】
↓=演算子↓
1回目 14633 ミリ秒
2回目 14555 ミリ秒
3回目 14555 ミリ秒
4回目 14555 ミリ秒

↓Like演算子↓
1回目 15398 ミリ秒
2回目 15303 ミリ秒
3回目 15304 ミリ秒
4回目 15304 ミリ秒

↓Len関数↓
1回目 8018 ミリ秒
2回目 7941 ミリ秒
3回目 7941 ミリ秒
4回目 7940 ミリ秒



本当だ、この本は正しかった。
Excelってすごいなあ。

        2010-08-27       ExcelVBAパフォーマンスレポート

↓Amazonリンク、本のご紹介↓
Excel VBA パフォーマンスレポートExcel VBA パフォーマンスレポート
(2010/01/26)
坪崎 誠司

商品詳細を見る

この本欲しい、すっごく欲しい!

ブログの広告で偶然見つけました。
今までブログの広告なんて邪魔なものばかりと思ってたんですが、こんなのもあるんですね。
加えて、この広告がこの Excelじゆうちょう のものだったという皮肉さ。
とにかく、公開されてる目次とサンプルを見るだけでテンションが振り切れてしまいました。

買います、きっと買います!

ただ、ちょっとお高いんです…
A5版、284ページ、2,520円(税込)

国語の教科書くらいの大きさかな、中は見てないけどたぶんモノクロベースだと思います。
それだけ充実した内容なんでしょう。
近所の本屋さんにはまず置いてませんから、今度大型書店で吟味がてら立ち読みでも。
手に取ったが最後、確実に欲しくなってしまうでしょうけど。

 | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。