FC2ブログ

Excelじゆうちょう

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

記事更新カレンダー

10 « 2018-11 « 12
- - - - 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 -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

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

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

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

RSSってなんぞ?

広告は消せないらしい

FC2Ad

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

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

        2009-11-24       速度比較、ColorIndexとColor

セルを塗りつぶす方法にはColorIndexプロパティColorプロパティがありました。
前者の特徴としては、56色しか扱えないものの、塗りつぶしなしをサポートしている。
後者の特徴としては、Excel2007ではRGBフルカラーを扱えるものの、塗りつぶしなしをサポートしていない。

likePでは、前者のみで描画処理を実装しています。
今後のバージョンアップに際して、塗りつぶしなしは外せませんので、引き続きColorIndexプロパティを使用しようと思います。
Colorプロパティを併用すればもっと柔軟な描画が実現できますが、処理速度の懸念からここは見送ろうと思います。
しかし、その前に1点確かめておかなければならないことがあります。
それは、どちらの処理が早いかということです。
もし、Colorプロパティの方が圧倒的に早ければ、併用の道を検討しなければなりません。
もし、さほど変わらなければ、より単純な処理を選択します。

そのために、以下のマクロで検証します。


'【コードウインドウ】
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub testColorIndex()
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000
    Cells(1).Interior.ColorIndex = 3
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub

Private Sub testColor()
Dim For0 As Long, For1, Tck0 As Long, Tck1 As Long
For For0 = 1 To 4
  Tck0 = GetTickCount
  For For1 = 1 To 100000
    Cells(1).Interior.Color = 255
  Next For1
  Tck1 = GetTickCount
  Debug.Print For0 & "回目 " & Tck1 - Tck0 & " ミリ秒"
Next For0
End Sub


特に、Excel2003とExcel2007ではColorIndexプロパティとColorプロパティの立場が逆転していますので、その違いも比較しました。


【イミディエイトウインドウ】
Excel2003にてColorIndexプロパティ
1回目 16396 ミリ秒
2回目 16348 ミリ秒
3回目 16349 ミリ秒
4回目 16333 ミリ秒

Excel2003にてColorプロパティ
1回目 16552 ミリ秒
2回目 16551 ミリ秒
3回目 16536 ミリ秒
4回目 16536 ミリ秒

Excel2007にてColorIndexプロパティ
1回目 18049 ミリ秒
2回目 18065 ミリ秒
3回目 18049 ミリ秒
4回目 18049 ミリ秒

Excel2007にてColorプロパティ
1回目 18050 ミリ秒
2回目 18033 ミリ秒
3回目 18034 ミリ秒
4回目 18034 ミリ秒


結果、コードの違いでの速度に大差はありませんでした。
それ以上に、Excel2007がExcel2003より10%以上遅くなっていることが目につきます。
あと、上の差ほどではありませんが、Excel2007になってColorIndexプロパティとColorプロパティの速度差が小さくなっています。
Colorプロパティが早くなったのか、はたまたColorIndexプロパティが遅くなったのか…?
スポンサーサイト

        2009-11-17       ColorIndexとColorの使い分け

Excel2007のセルに塗りつぶしなしをする時、ColorIndexプロパティが56色しか扱えないのに対し、ColorプロパティはRGBフルカラー(256^3=16777216色)を扱うことができました。
こうしてみると、カラーパレットの色すべてをカバーしているColorプロパティは万能のようにも思えます。
しかし、ひとつだけサポートできていない色があるのです。

塗りつぶしなしです。

Colorプロパティを塗りつぶしなしのセルに適応すると、背景色の値が返ってきます。
背景色はウインドウの色に依存します。
特に設定を変更していなければ、白の16777215(R:255、G:255、B:255)となるはずです。
私は白の塗りつぶしと比較できるように、ウインドウの色をほぼ白16119285(R:245、G:245、B:245)に変更しています。

↓こんなだと、255↓
ウインドウ赤色

【注意!】
上記はExcel2003での結果です。
Excel2007での塗りつぶしなしのColor値は、一律16777215になるようです。

これは一大事です。
Colorプロパティだけでは、本当の意味ですべての色を表現できないのです。
塗りつぶしなしと背景色が一見同じ色に見えたとしても、塗りつぶされたセルの場合、周囲の枠線が表示されなくなります。(罫線は別)
何より、背景にセットした画像が見えなくなってしまいます。
likePに限れば、大量のセルを塗りつぶすことが多くなりますので、ファイルサイズがかさばってしまいます。

そこで、ColorIndexの出番です。
Cells(1, 1).Interior.ColorIndex = xlNoneもしくは、Cells(1, 1).Interior.ColorIndex = -4142で、塗りつぶしなしにできます。
xlNoneは定数と呼ばれるもので、実際の値-4142を英字に置き換えているだけです。
何だかよくわからない-4142という値より、xlNoneの方が「None」とついているだけに、何かしらがないという値を意味するんだなと感じますよね。

この他にも、Cells(1, 1).Interior.Pattern = xlNoneもしくは、Cells(1, 1).Interior.Pattern = -4142でも、同じ結果が得られます。
このPatternプロパティは、塗りつぶしのセルの上に網掛けや斜線などの模様を付けるためのものです。
Patternプロパティは塗りつぶしのあるセルにだけ適用されますので、「Patternプロパティが設定されていない=塗りつぶしなし」と判断されるのです。

実は、マクロの自動記録で塗りつぶしの操作をすると、Excel2003以前ではColorIndexプロパティが、Excel2007ではPatternプロパティが記録されます。
これまでさんざんお世話になってきたカラーパレットが、いよいよ窓際へ追いやられてしまったようです。

それにしても、Patternプロパティを使っていないにも関わらず、本家Colorプロパティを押しのけて自動記録されるなんて腑に落ちないのは私だけでしょうか。
便利な機能ならいいんですけどね、Patternプロパティの網掛けって拡大や縮小しても目の粗さは変わらないし微妙なんですよね。
Excel2003以前なら、限りあるカラーパレットにバリエーションを加えることもできましたが、フルカラーがあるならなおさら…ですよね?

        2009-11-15       ColorIndexとColorとColors

突然ですが、マクロでセルの塗りつぶしをする時、どのようにしていますか。

おそらく、ColorIndexプロパティを使うことが多いと思います。
【例】Cells(1, 1).Interior.ColorIndex = 3 'デフォルトカラーパレットで、赤

これは、Colorプロパティを使っても実行可能です。
Colorプロパティでは、色のRGB値で直接色を指定して塗りつぶします。
【例】Cells(1, 1).Interior.Color = 255 '赤のRGB値

Excel2003までは、ColorIndexプロパティだけで事足りていました。
というのも、カラーパレットにない色(ColorIndexの1~56以外)での塗りつぶしはできなかったからです。
もし、カラーパレットにない色で塗りつぶそうとしたら、カラーパレットにある近い色に変換されてしまいます。
ゆえに、ExcelVBAの入門書ではCelorプロパティを取り上げていないものが大半です。

もし、カラーパレットにない色で塗りつぶしたい場合は、Colorsプロパティでカラーパレットを変更しなければなりません。
【例】ActiveWorkbook.Colors(1) = 255 'ColorIndex = 1の色を赤に設定

しかし、Excel2007ではこの塗りつぶしという機能が改善され、RGBフルカラーで塗りつぶすことが可能になりました
近い色に変換されることがなくなり、Colorプロパティの利便性が一気に増したわけです。

さて、前置きはここまで、ここから考察です。
Excel2003以前では、セルの塗りつぶしの色情報をColorIndexプロパティの値で管理している
Excel2007では、セルの塗りつぶしの色情報をColorプロパティの値で管理している

カラーパレットを変更すれば、
・Excel2003以前では、Colorsプロパティに紐づいているため、そのセルの色も連動して変わる
・Excel2007では、Colorsプロパティに紐づいていないため、そのセルの色は変わらない
という仮説が成立します。

以下で検証しました。


'【コードウインドウ】
Private Sub testColor()
Cells(1, 1).Interior.ColorIndex = 3
  '1行目でColorIndexプロパティを使って赤に塗りつぶし
Cells(2, 1).Interior.Color = 255
  '2行目でColorプロパティを使って赤に塗りつぶし
ActiveWorkbook.Colors(3) = RGB(0, 0, 255)
  'ここで、カラーパレットの赤を青に変更
Cells(3, 1).Interior.ColorIndex = 3
  '3行目でColorIndexプロパティを使って変更した青に塗りつぶし
End Sub


↓左がExcel2003、右がExcel2007↓
Color、ColorIndex

仮説は半分正解、半分間違いでした。
・Excel2003以前では、仮説通りセルの塗りつぶしの色はColorIndexプロパティの値で管理している
・Excel2007では、ColorIndexプロパティで塗りつぶした色はColorIndexの値で管理され、
 Colorプロパティで塗りつぶした色はColorの値で管理されている

なんと、Excel2007でもColorIndexプロパティは現役でした。
まあ、以前との互換性を考えると妥当でしたね。
Excel2007でカラーパレットを操作する人は、塗りつぶしの方法にご注意ください。(likePがどんぴしゃり)



おまけ、上の検証の後でもう一度testColorを実行してみました。

↓Excel2007では再現できません↓
Color、2回目

Cells(2, 1).Interior.Color = 255の部分で、カラーパレットにRGB値が255のColorIndexの値がないため、近い色のColorIndex = 46(オレンジ)で塗りつぶされました。

 | HOME | 

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