FC2ブログ

Excelじゆうちょう

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

記事更新カレンダー

04 « 2019-05 « 06
- - - 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-12-07       セルの塗りつぶし、色数を数える

ここ最近、新Excelのセルにどれだけ塗りつぶしができるかということを考えてきました。

今回は、その逆でどれくらい塗りつぶしをしているかを考えてみましょう。
それはどういうことかというと、セルの塗りつぶしをしている色の種類を数えます。
複数のセルに同じ色が塗りつぶしされていても、1色と数えます。
そうですね、現在選択しているセル範囲の中での色数を数えるようにしてみましょう。


'【コードウインドウ】
Private Sub getColorCount() '色の種類を数える
Dim Clc_Obj As Collection 'コレクションオブジェクト(連想配列)
Dim Rng_Obj As Range
If TypeName(Selection) = "Range" Then 'セルを選択していれば(オートシェイプ等でない)
  Set Clc_Obj = New Collection 'オブジェクト生成
  On Error Resume Next 'エラー無視、ここから
  For Each Rng_Obj In Selection '選択範囲をFORループ
    'セルのRGB値をコレクションに追加、すでに追加されていればエラー
    Clc_Obj.Add Rng_Obj.Interior.Color, CStr(Rng_Obj.Interior.Color)
  Next Rng_Obj
  On Error GoTo 0 'エラー無視、ここまで
  MsgBox Clc_Obj.Count '追加したRGB値の個数を取得
  Set Clc_Obj = Nothing 'オブジェクト解放
End If
End Sub


コードは以上です、例えばこんなふうになります。

↓色を数えるセル範囲↓
色数を数える

↓色を数えた結果↓
色数を数えた

イラストは愛すべきレッサーパンダです、似てないとかは言わないで!
え、このイラストはなんだって?

ここをクリック(画像が大きいためリンクにしています)

りっぷ2(りっぷつぅ)よりlikePよりもっと前に作ってみたお絵描きツールです。
今では、あまりにしょっぱい出来のためお蔵入りになってます。
ユーザーフォームすら使ったことがなかった頃でして、右下にパレットがあります。

おっと閑話休題、この選択範囲には23の色が使われてます。

このコードの解説は…申し訳ないです。
詳しく説明しだすとちょっと長くなってしまいますので、割愛させてください。
ここで使ってるのはコレクションオブジェクトというもので、ほとんど実用性のない機能です。
本気でコレクションを扱いたいなら、CreateObject("Scripting.Dictionary")のコードでDictionaryオブジェクトを使用しなければなりません。
とまあ、そんな感じで使い勝手のよくないコレクションオブジェクトですので、あえて覚える必要もないだろうということで逃げておきます。
VBAエディタでヘルプ引けますからね、よければ見てください。
スポンサーサイト

        2010-12-04       15ビットと18ビットの色の精度

11/29(火)の記事 で、15ビットカラーの一覧をご紹介しました。
また、色のすべてを使用しないことを前提とするなら、18ビットカラーでもサポートできる可能性があると仮説を立てました。

18ビットカラーは15ビットカラーに比べ、8倍の色を表現できます。
数字で8倍といわれても、実際に目で見てどれくらい違いがあるのでしょうか?
今回は、その違いを確認してみました。

といっても、表現できる色をすべて並べるわけにはいきません。
この前は15ビットカラーだったからよかったものの、18ビットカラーともなると色数が多すぎて画像が大きくなりすぎてしまいます。
よって、一部分だけサンプルとして比べてみましょう。
RGB値の色成分のうち、B(青)だけを128(16進数で80)に固定し、R(赤)とG(緑)をグラデーションさせた一覧を表示させて比較します。
コードと結果は以下の通りです。


'【コードウインドウ】
Private Sub test15BitColorRG() 'RGB15ビットカラー(B=128固定)の色一覧
Dim For_r As Long, For_g As Long
Application.ScreenUpdating = False '画面更新オフ
For For_r = 0 To 31 '行
  For For_g = 0 To 31 '行
    Cells(For_r + 1, For_g + 1).Interior.Color = RGB(For_r * 8, For_g * 8, 128)
  Next For_g
Next For_r
Application.ScreenUpdating = True '画面更新オン
End Sub

Private Sub test18BitColorRG() 'RGB18ビットカラー(B=128固定)の色一覧
Dim For_r As Long, For_g As Long
Application.ScreenUpdating = False '画面更新オフ
For For_r = 0 To 63 '行
  For For_g = 0 To 63 '行
    Cells(For_r + 1, For_g + 1).Interior.Color = RGB(For_r * 4, For_g * 4, 128)
  Next For_g
Next For_r
Application.ScreenUpdating = True '画面更新オン
End Sub


↓15ビットカラーの場合(9ピクセル幅)↓
15ビットカラー(B128固定)

↓18ビットカラーの場合(9ピクセル幅)↓
18ビットカラー(B128固定)

JPG画像で劣化した分は目をつぶるとしても、こうやって並べると、15ビットカラーは結構グラデーションが粗いことがわかります。
やっぱり、エラー発生覚悟で18ビットカラーを採用した方がいいでしょうかね。
でも、セルの書式は塗りつぶしだけではありませんし、それを考慮すると15ビットカラーでもエラーとなる可能性はあります。
やっぱり、無難に15ビットカラーで妥協した方がいいでしょうかね。

うーん、難しいです。

        2010-11-29       16ビットの壁は超えられるか?

新Excelの書式の種類は64000まで。
セルの塗りつぶしだけなら65428まで(65429の時点でエラー)、16ビットの35536にはわずかに届きません。

それでは、15ビットで表現できる色はどれほどのものなのでしょうか?

やってみました。
なるべくまんべんなく色を配置するようにコーディングしてみました。


'【コードウインドウ】
Private Sub test15BitColorMax() 'RGB15ビットカラーの色一覧を調べる
Dim For_r As Long, For_g As Long, For_b As Long
Application.ScreenUpdating = False '画面更新オフ
For For_r = 0 To 31 '行、列
  For For_g = 0 To 31 '行
    For For_b = 0 To 31 '列
      Cells((For_r Mod 8) * 32 + For_g + 1, For_b + 1 + 32 * (For_r \ 8)).Interior.Color _
        = RGB(For_r * 8, For_g * 8, For_b * 8) '
    Next For_b
  Next For_g
Next For_r
Application.ScreenUpdating = True '画面更新オン
MsgBox For_r * For_g * For_b & " 色が15ビットカラーの最大数"
End Sub


↓15ビットカラー一覧(JPG画像につき、色劣化はご愛嬌)↓
15ビットカラーパレット

↓使用した色数↓
15ビットカラーの最大数

やっぱり、旧Excelの56色と違って結構細かい色表現ができています。
しかしながら、65428のうち32768色しか使用してませんから、なんだか少しもったいない気がします。
ですが、16ビットをまるまる使用するとエラーになってしまいます。

ちょっと待ってください、イラストを描く時に色数をすべて使うなんてことがあるでしょうか?
ないとはいえませんが、そんなことはまれだと思います。
うまく制御すれば、疑似的に16ビット以上の色数を使用できるかもしれません。

15ビットカラーはR(赤)とG(緑)とB(青)がそれぞれ5ビットずつですから、それぞれ6ビットずつの18ビットカラーももしかすると可能かもしれません。
18ビットカラーの色数は262144、そのうち65428までなら使用可能という寸法です。
これは、パレット全体のおよそ25%にあたります。
それくらいならもしかすると…少しいける気がしてきました。

とはいえ、私の知るところではExcelの書式の数を調べる方法はありませんので、まだまだ研究していかなければなりません。

        2010-11-25       16ビットの壁

2007以降の新Excelでは、セルの塗りつぶしがRGB24ビットフルカラーに対応しました。
それを利用して、Excelのお絵描きツールもフルカラーに対応させたいと考えていました。
しかし、ここへきて壁に直面してしまいました。

ひとつのブックで表現できる書式の種類は64000まで。

「種類」ですから、10個のセルに同じ色を塗りつぶしても、1種類の色として扱われます。
ですが、「書式」ですから、同じ色でも一方のフォントが太字ならそれは別の書式として扱われてしまいます。
つまり、セルの塗りつぶしだけでも64000色まで。
文字の色や斜体等、その他の書式によってはそれ以下の色数でもエラーとなってしまう可能性があるのです。

これをビットに換算してみると、15ビットが32768、16ビットが65536なので、新Excelでは実質15ビットカラーまでしか表現できない計算になってしまいます。
フルカラー対応のお絵描きツールの夢が、音を立てて崩れてしまいました。

でもちょっと待って、本当にそうなの?
実は、もっといっぱい塗りつぶしできるんじゃないの?

一応確かめておきましょう。
RGB値の0から順番に1ずつ増やしながら、1セルずつ塗りつぶしていきます。
それを延々と続けていってエラーが発生したところが上限ですので、それまでのカウントをメッセージボックスで表示させます。


'【コードウインドウ】
Private Sub testInteriorColorMax() '書式の中で塗りつぶしの上限を調べる
Dim For_r As Long, For_c As Long
Application.ScreenUpdating = False '画面更新オフ
On Error GoTo line 'エラーが発生したら、lineへジャンプ
For For_r = 0 To 255 '行
  For For_c = 0 To 255 '列
    Cells(For_r + 1, For_c + 1).Interior.Color = For_r * 256 + For_c
  Next For_c
Next For_r
Application.ScreenUpdating = True '画面更新オン
Exit Sub

line: 'エラーが発生したら、ここからを実行
MsgBox For_r * 256 + For_c & " 色が塗りつぶしの最大数"
On Error GoTo 0 'lineへジャンプを解除
Application.ScreenUpdating = True '画面更新オン
End Sub


セルの幅は、書式(Interiorプロパティ)ではありませんので、事前に縦横2ピクセルに変更しています。
塗りつぶしの色が見やすいように、256列目で改行するようにマクロを組んでいます。

↓塗りつぶした結果↓
塗りつぶしの最大

おお…美しいグラデーションです。
いくら再現率を高めても、JPGファイルに圧縮していると細部が劣化してしまうのが残念です。
違いましたね、色の最大数を確認するんでした。

↓エラー時のメッセージボックス↓
塗りつぶしの最大数

なんと、64000を超えてるじゃありませんか!
どうやら、Microsoftは爪を隠していたようです。

でも、ほんのちょっとだけ。

16ビットの35536にはわずかに届きません。
やっぱり、新Excelは16ビットの壁を越えられないみたいです。

 | HOME | 

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