Excel (VBA) |
![]() ![]() |
(指定なし : 指定なし)
「色をCONSTで宣言する方法」についての関連議論
投稿日時: 23/06/01 09:12:45
投稿者: simple
|
---|---|
関連スレッド:
VBA-stepup さんの引用:との提案がありました。 私も、そこに何らか工夫の余地があるように思いました。 途中で打ち切られましたが、もう少し続けてみたらどうかと思い、 別のスレッドを建ててみました。 ご意見のあるかたは、続けてどうぞ書き込み下さい。 ■ (ご参考)前回の議論についての私の印象 gombohoriさんの提案に対して RED = 255 + 256! * 0 + 65536! * 0 GREEN = 0 + 256! * 255 + 65536! * 0となることから、 > すげーって思ったのですが、インデントがずれると微妙に読みづらいと感じてしまいました。 とのことで却下。 そうであれば、hatenaさんの RED = 255 * R + 0 * G + 0 * B GREEN = 0 * R + 255 * G + 0 * Bも揃ってないので却下なんですか? 私は良い落としどころかと思いましたが。 桁が揃っていることにそれほどこだわるのであれば、 RED = &HFF& 'RGB(255, 0, 0) GREEN = &HFF00& 'RGB( 0,255, 0)などとするしかないのでは? それか、それほど上司または顧客の意見で変更するのであれば、定数じゃないんだから、 変数として宣言すれば、いくらでもRGB関数が使えます。(でも桁はきちんと揃わない気がしますね) コメントを付ける案はご遠慮下さいということでしたが、 あなたの要望を満たすにはそれしかないように思います。 正直言って、質問者さんの美意識はちょっと理解しかねました。 |
![]() |
投稿日時: 23/06/01 17:15:30
投稿者: VBA-stepup
|
---|---|
引用: スレッド立てていただいてありがとうございます。 上記にあるように、ユーザーによる変更依頼があるならばConstで宣言してもコードの変更があるので 変数で定義した方がコードの変更なくユーザーに変更してもらえばいいかなと思い。提案させていただきました。私がよく使う方法として、別シートにカラーパレットをセルに設定して置き好きなように色を変更してもらうやり方です。(何でもかんでも変更できる仕様にはしません。) 色のほかに、他ファイルPathとか保存先Pathとかを設定シートとして作成しコードの変更を極力しないですむようにしています。色変更はこのようにしています。 Option Explicit Public ws As Worksheet Public ユーザー1 As Long Public ユーザー2 As Long Public ユーザー3 As Long Sub test() Set ws = ThisWorkbook.Sheets("mycolor") ユーザー1 = ws.Range("A1").Interior.Color ユーザー2 = ws.Range("C1").Interior.Color ユーザー3 = ws.Range("E1").Interior.Color Selection.Cells.Interior.Color = colorSet(ユーザー2) End Sub Function colorSet(ByVal MyColor As Long) Dim R As Long Dim G As Long Dim B As Long R = MyColor Mod 256 G = Int(MyColor / 256) Mod 256 B = Int(MyColor / 256 / 256) ' Selection.Cells.Value = "RGB(" & R & ", " & G & ", " & B & ")" ' MsgBox "RGB(" & R & ", " & G & ", " & B & ")" colorSet = RGB(R, G, B) End Function |
![]() |
投稿日時: 23/06/01 22:42:32
投稿者: MMYS
|
---|---|
simpleさん、スレ立てられたので、コメント致します。
わっしょい さんの引用: 下記のように記述すれば目的は達成できると思いますが。 Public Const エラー時の背景色1 As Long = XlRgbColor.rgbRed Public Const エラー時の前景色1 As Long = XlRgbColor.rgbBlue 組み込み定数でオートコンプリート働くし、エラーチェックも働く。必要な色は大抵、用意されているので、自前で色定義する必要性が理解できないのですが。打ち合わせ中に色変更あっても、大抵は用意されている色で間に合うと思います。 わっしょい さんの引用: ご指摘のように、色を薄くしたいなら、色は24bit整数で並び順が「青」「緑」「赤」の順なので(各8ビット)下記のように16進で指定しましょう。 Public Const エラー時の背景色1 As Long = &hFF '赤 Public Const エラー時の前景色1 As Long = &HFF0000 '青 16進を2桁ずつ下位から読めば下位ビットか「赤」、真ん中は「青」、上位ビットが「青」ですから、各色の色成分はコードから分かります。 |
![]() |
投稿日時: 23/06/02 06:31:41
投稿者: simple
|
---|---|
重複部分がありますが、書いて置いたメモを載せます。
|
![]() |
投稿日時: 23/06/02 06:43:19
投稿者: simple
|
---|---|
(つづき)
|
![]() |
投稿日時: 23/06/02 06:46:49
投稿者: simple
|
---|---|
ちなみに、
&H00FF00& 'RGB( 0,255, 0)といった文字列をユーザー定義関数で取り出すには、こんな感じでしょうか。 Function getColorInfo(rng As Range) As String Dim col& Dim s$ Dim r&, g&, b& Dim rS$, gS$, bS$ col = rng.Interior.Color '16進数 s = Application.Dec2Hex(col) s = Right("000000" & s, 6) s = "&H" & s & "&" 'RGB表現 r = col Mod 256 g = Int(col / 256) Mod 256 b = Int(col / 256 / 256) rS = Right(" " & CStr(r), 3) gS = Right(" " & CStr(g), 3) bS = Right(" " & CStr(b), 3) getColorInfo = s & " " & "'RGB(" & rS & "," & gS & "," & bS & ")" End Function |
![]() |
投稿日時: 23/06/02 07:15:28
投稿者: VBA-stepup
|
---|---|
MMYSさん、simpleさん有難うございます。
|
![]() |
投稿日時: 23/06/02 14:08:38
投稿者: たらのり
|
---|---|
こんにちは
' BB GG RR ww Const RED As Long = "&h" & "00" & "00" & "FF" Const GREEN As Long = "&h" & "00" & "FF" & "00" Const BLUE As Long = "&h" & "FF" & "00" & "00" Const YELLOW As Long = "&h" & "00" & "FF" & "FF" Sub Numclenicer() With Sheet1 .Cells(1, 1).Interior.Color = RED .Cells(2, 1).Interior.Color = GREEN .Cells(3, 1).Interior.Color = BLUE .Cells(4, 1).Interior.Color = YELLOW End With End Sub |
![]() |
投稿日時: 23/06/02 22:15:33
投稿者: たらのり
|
---|---|
こんばんは
RED = 255 + 256! * 0 + 65536! * 0 GREEN = 0 + 256! * 255 + 65536! * 0 ↓ RED = (255) + (256! * 0) + (65536! * 0) GREEN = (0) + (256! * 255) + (65536! * 0) ここでも気になったのは,色の要素の値なのか,桁の重みの 値なのかが識別しにくいことで(とくに 255 と 256), hatena さんのアイデアのように,桁の重みに名前をつけて しまえばよいと思いました: RED = 255 * R + 0 * G + 0 * B GREEN = 0 * R + 255 * G + 0 * B ちなみに僕の方法は,最後に長整数を表す "&" を付加すると NGとなってしまう,たいへんお粗末な方法でした: ○ Const RED As Long = "&h" & "00" & "00" & "FF" × Const RED As Long = "&h" & "00" & "00" & "FF" & "&" たしか「型が一致しない」のようなエラーでした。 あと,Enum では使えない曲芸ですね(桁位置が揃いません)。 |
![]() |
投稿日時: 23/06/02 22:42:52
投稿者: simple
|
---|---|
# 雨のなかでしたが、久しぶりに旧交を叙しておりました。遅くなりました。
|
![]() |
投稿日時: 23/06/03 00:25:04
投稿者: たらのり
|
---|---|
# 酒気帯びですが
' BBGGRR Const RED As Long = "&h0000FF" Const GREEN As Long = "&h00FF00" Const BLUE As Long = "&hFF0000" Const YELLOW As Long = "&h00FFFF" スレ汚し,失礼いたしました m(_ _)m |
![]() |
投稿日時: 23/06/03 12:48:24
投稿者: VBA-stepup
|
---|---|
こだわってみました。
Public Const RED As String = "RGB(255, 0, 0)" Public Const GREEN As String = "RGB( 0,255, 0)" Public Const BLUE As String = "RGB( 0, 0,255)" Public Const YELLOW As String = "RGB(255,255, 0)" '変更の時に使用 Sub RGB値から色設定() Dim myRGB As String Dim R As Long Dim G As Long Dim B As Long myRGB = YELLOW R = Mid(myRGB, 5, 3) G = Mid(myRGB, 9, 3) B = Mid(myRGB, 13, 3) Selection.Cells.Value = "RGB(" & R & ", " & G & ", " & B & ")" Selection.Cells.Interior.Color = colorSet(R, G, B) End Sub Sub セルの色からRGB値() Dim myColor As Long Dim R As Long Dim G As Long Dim B As Long myColor = Selection.Cells.Interior.Color R = myColor Mod 256 G = Int(myColor / 256) Mod 256 B = Int(myColor / 256 / 256) Selection.Cells.Value = "RGB(" & R & ", " & G & ", " & B & ")" Selection.Cells.Offset(0, 1).Value = "#" & Right(0 & Hex(R), 2) & _ Right(0 & Hex(G), 2) & _ Right(0 & Hex(B), 2) End Sub Function colorSet(ByVal R As Long, ByVal G As Long, ByVal B As Long) colorSet = RGB(R, G, B) End Function とりあえず動いたのでアップしてみました・・・・・ これでインデントとRGBに関して了解してもらえるのかな? |
![]() |
投稿日時: 23/06/03 20:18:11
投稿者: VBA-stepup
|
---|---|
一部修正
Option Explicit Public Const RED As String = "RGB(255, 0, 0)" Public Const GREEN As String = "RGB( 0,255, 0)" Public Const BLUE As String = "RGB( 0, 0,255)" Public Const YELLOW As String = "RGB(255,255, 15)" Sub test() ' 判定式 Call ColorSet(Selection.Cells, GREEN) End Sub Sub ColorSet(ByVal myRng As Range, ByVal myRGB As String) Dim R As Long Dim G As Long Dim B As Long R = Mid(myRGB, 5, 3) G = Mid(myRGB, 9, 3) B = Mid(myRGB, 13, 3) ' myRng.Value = "RGB(" & R & ", " & G & ", " & B & ")" myRng.Interior.Color = RGB(R, G, B) End Sub '変更の時に使用 Sub セルの色からRGB値() Dim myColor As Long Dim R As Long Dim G As Long Dim B As Long myColor = Selection.Cells.Interior.Color R = myColor Mod 256 G = Int(myColor / 256) Mod 256 B = Int(myColor / 256 / 256) Selection.Cells.Value = "RGB(" & R & ", " & G & ", " & B & ")" Selection.Cells.Offset(0, 1).Value = "&h" & Right(0 & Hex(R), 2) & _ Right(0 & Hex(G), 2) & _ Right(0 & Hex(B), 2) End Sub |
![]() |
投稿日時: 23/06/03 20:50:02
投稿者: simple
|
---|---|
最後のところは、こうですか。
|
![]() |
投稿日時: 23/06/03 20:54:05
投稿者: VBA-stepup
|
---|---|
その通りです。
|
![]() |
投稿日時: 23/06/04 01:35:27
投稿者: MMYS
|
---|---|
そもそも、目的は、下記だと思います。
|
![]() |
投稿日時: 23/06/04 12:56:21
投稿者: simple
|
---|---|
ご指摘ありがとうございます。
|