Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
色をCONSTで宣言する方法
投稿日時: 23/05/29 19:08:49
投稿者: わっしょい

表題の通りですが、色をCONSTで宣言する良いほうをご教授ください。
 
単純に思い浮かぶのは、
1.RGB値で宣言する。
  Enum RGB値
      赤 = 255
      緑 = 65280
      青 = 16711680
  End Enum
 
2.Hexで宣言する。
  Public Const 赤 As String = "&HFF"
 
 
これだと、実際に色をRGBの値に変換するのに、下記のように
RGBの各値を求めるような関数を自作しないとできません。
 
  Sub RGB値変換処理(ByVal RGB値 As Double, ByRef R As Long, ByRef G As Long, ByRef B As Long)
      R = RGB値 Mod 256
      G = Int(RGB値 / 256) Mod 256
      B = Int(RGB値 / 256 / 256)
  End Sub
 
 
Enum宣言して、関数で取得するなんて方法も考えたのですが、なんか微妙です。
  Enum RGBIndex
      赤 = 0
      緑
      青
  End Enum
 
  Function RGB値(ByVal 指定色 As RGBIndex) As Double
      Select Case 指定色
          Case RGBIndex.赤
              RGB値 = RGB(255, 0, 0)
          Case RGBIndex.緑
              RGB値 = RGB(0, 255, 0)
          Case RGBIndex.青
              RGB値 = RGB(0, 0, 255)
      End Select
  End Function
 
もう少し、RGBの値が、ソース上で簡単にわかるような宣言方法はありませんでしょうか?
 
よろしくお願いいたします。
 

回答
投稿日時: 23/05/29 20:29:12
投稿者: WinArrow

こんな方法は?
 

Dim 赤 As Long

Sub test()
    赤 = RGB(255, 0, 0)
    
End Sub

回答
投稿日時: 23/05/29 20:47:23
投稿者: simple

定数にこだわる理由をもう少し説明いただくとよいかと思います。
vbRed等のカラー定数など既定のもののほかは、
定数名を工夫して、Const宣言したコード一式をどこかにまとめて置き、
使用の都度、コピーするなどというのも案外現実的かも知れません。

回答
投稿日時: 23/05/29 21:21:16
投稿者: 角田
投稿者のウェブサイトに移動

一体何を遣りたいのでしょう?
 
例えば、ピンクの色をソースで定数定義するのに
 
Const ピンク As Long = ________
 
ここに記述すべきコンスタント値の調べ方が判らないという事ですか?
 
それとも、10進数値( 13353215 )は判るので、
簡単に6桁16進数値( CBC0FF )に変換する方法
を知りたいのですか?
それなら、セルに10進数値を入力して下記式で変換すれば良いです。
態々、マクロにする必要も無いでしょう。
=RIGHT("000000"&DEC2HEX(A1),6)
 
 
色の種類ならば下記を参考にしてください。
http://addinbox.sakura.ne.jp/ColorNameList.htm
色名はウェブサイトの色指定で指定する名前です。
16進表記はVBAで利用する為の bbggrr 並びですので、
&Hからコピーすればそのまま使えます。

回答
投稿日時: 23/05/30 06:02:20
投稿者: MMYS

組み込み定数を使わない理由は何故ですか。
  
 Range("A1").Interior.Color = ColorConstants.vbRed
 Range("A2").Interior.Color = XlRgbColor.rgbPink
 Range("A3").Interior.ColorIndex = 5
  
また、Excel2003以前のColoIndexも、色番号で指定なので通常用途であればこちらも便利です。
  
RGBの各値を求める理由はなんでしょう。関数を自作して、RGBの各値を求める理由がわかりません。定数宣言でもHexで、24ビット16進で青緑赤と記述するので、ソース上で色は分かりますし。
  
  
Colorプロパティの設定値一覧(カラー定数、XlRgbColor列挙)
https://excel-ubara.com/excelvba4/EXCEL285.html
  
VBAカラー一覧(組み込み定数、RGB値、16進数)|色見本あり
https://excel-toshokan.com/vba-color-list/

回答
投稿日時: 23/05/30 15:03:34
投稿者: gombohori

こういうことでよろしいか?

 Enum MYCOLOR
  '         R            G              B   
  RED   = 255 + 256! *   0 + 65536! * 0
  GREEN =   0 + 256! * 255 + 65536! * 0
  BLUE  =   0 + 256! *   0 + 65536! * 255
  PINK  = 255 + 256! * 153 + 65536! * 255
 End Enum

 Sub sample()
  Range("A1").Interior.Color = MYCOLOR.RED
  Range("A2").Interior.Color = MYCOLOR.GREEN
  Range("A3").Interior.Color = MYCOLOR.BLUE
  Range("A4").Interior.Color = MYCOLOR.PINK
 End Sub

投稿日時: 23/05/30 21:03:02
投稿者: わっしょい

皆様、忌憚のないご意見ありがとうございました。
私の説明がいたらないこと深くお詫びいたします。
 
私がやりたいことは、
 
mdlCommonのようなモジュールに、集約して定数を宣言したいということです。
 
'使用するシート名
Public Const メインシート AS String = 'メインシート'
Public Const 設定用シート AS String = '設定用シート'
・・・
Public Const ワークシート AS String = 'ワークシート'
 
'使用するセル
Public Const 必須項目1 AS String = 'B9'
Public Const 必須項目2 AS String = 'C9'
・・・
Public Const 必須項目9 AS String = 'J9'
 
'使用する区分
Public Enum 重要な区分
    区分A = 1
    区分B
・・・
    区分Z
END Enum
 
'エラーメッセージ
Public Const エラー1 AS String = 'エラーです'
Public Const エラー2 AS String = '致命的なエラーです'
・・・
Public Const エラー9 AS String = '予期せぬエラーです'
 
 
 
'使用する色
'=============== VBAでできないのはわかっていて記載 ===============
Public Const エラー時の背景色1 AS Double = RGB(255, 0, 0)
Public Const エラー時の前景色1 AS Double = RGB(255, 255, 0)
てな感じで本当はやりたいんです。できないけど。
 
.Netならこんな感じ↓
Public エラー時の前景色2 As System.Drawing.Color = System.Drawing.Color.FromArgb(255, 255, 192)
 
 
投稿の質問のように
RGB値やHex等で、宣言してると、打ち合わせの最中に急に
「この色もう少し薄くできる?」
的な問答の時、ドタバタするので、ソース上で簡単にRGBの値が設定できるような方法がないかと思い質問しました。
 
もしよければ、私はこんな感じでやってますなど、忌憚のないご意見をお聞かせください。

投稿日時: 23/05/30 21:14:00
投稿者: わっしょい

ちなみに、
  Public Const 赤 As String = "&HFF" 'RGB(255,0,0)
ってコメント書いておけば
 
のようなコメントは、ご遠慮いたします。

投稿日時: 23/05/30 21:35:30
投稿者: わっしょい

gombohori さんの引用:
こういうことでよろしいか?
 Enum MYCOLOR
  '         R            G              B   
  RED   = 255 + 256! *   0 + 65536! * 0
  GREEN =   0 + 256! * 255 + 65536! * 0
  BLUE  =   0 + 256! *   0 + 65536! * 255
  PINK  = 255 + 256! * 153 + 65536! * 255
 End Enum

 Sub sample()
  Range("A1").Interior.Color = MYCOLOR.RED
  Range("A2").Interior.Color = MYCOLOR.GREEN
  Range("A3").Interior.Color = MYCOLOR.BLUE
  Range("A4").Interior.Color = MYCOLOR.PINK
 End Sub

 
gombohoriさんありがとうございます。
電車の中で読んだときは、面白いアイデアだなとワクワクしていたのですが、
テストしたらコンパイル通りませんでした。
 
ありがとうございました。

投稿日時: 23/05/30 21:38:11
投稿者: わっしょい

WinArrow さんの引用:
こんな方法は?
 
Dim 赤 As Long

Sub test()
    赤 = RGB(255, 0, 0)
    
End Sub

 
WinArrowさんありがとうございます。
 
輝度時に変数に全部読み込むようなことですよね。
この方法も、わかってるのですが、できれば違う方法を模索できればと思います。
 
ありがとうございました。

回答
投稿日時: 23/05/30 21:47:28
投稿者: gombohori

 >テストしたらコンパイル通りませんでした
 そうですか
 提示のコードを標準モジュールに記載して実行できることを確認してから提示してるんですが
 おかしいですね

回答
投稿日時: 23/05/30 21:54:46
投稿者: WinArrow

COnst に拘っているならば
 
例1
Public Const 赤 As Long = RGB(255, 0, 0)
または
Public Const 赤 As Long = &HFF
 
 
>ソース上で簡単にわかるような宣言方法

RGB表現
とは同じことなんですか?
 
 
HEXで定義する時
データ型を String にする意図が分かりません。

回答
投稿日時: 23/05/30 22:17:13
投稿者: gombohori

 

 Public Const 赤 As Long = RGB(255, 0, 0)
 

 は「定数式が必要です」とコンパイルエラーになりますが、これは試行した上での回答でしょうか

投稿日時: 23/05/30 22:43:50
投稿者: わっしょい

gombohori さんの引用:
>テストしたらコンパイル通りませんでした
 そうですか
 提示のコードを標準モジュールに記載して実行できることを確認してから提示してるんですが
 おかしいですね

 
gombohoriさん、遅くに早速のご回答ありがとうございます。
私の勘違いで、新規でBookを作ってテストしたらコンパイル通りました。
 
早とちりで誤報を垂れ流し、申し訳ございませんでした。
 
Enum MYCOLOR
  ' R G B
  RED = 255 + 256! * 0 + 65536! * 0
  GREEN = 0 + 256! * 255 + 65536! * 0
  BLUE = 0 + 256! * 0 + 65536! * 255
  PINK = 255 + 256! * 153 + 65536! * 255
 End Enum
 
 Sub sample()
  Range("A1").Interior.Color = MYCOLOR.RED
  Range("A2").Interior.Color = MYCOLOR.GREEN
  Range("A3").Interior.Color = MYCOLOR.BLUE
  Range("A4").Interior.Color = MYCOLOR.PINK
 End Sub
 
でも実際に、書いてみると、変数名、設定値によって、微妙にインデントがずれますね。
そんなの当たり前じゃんと言われれるとそうなのですが、投稿されたみたいにインデントがそろってると
すげーって思ったのですが、インデントがずれると微妙に読みづらいと感じてしまいました。
わがまま言って申し訳ございません。
 
でも、素晴らしいアイデアをいただいたと感謝しております。
 
本当にありがとうございました。

投稿日時: 23/05/30 22:46:24
投稿者: わっしょい

gombohori さんの引用:
 Public Const 赤 As Long = RGB(255, 0, 0)
 

 は「定数式が必要です」とコンパイルエラーになりますが、これは試行した上での回答でしょうか

 
gombohoriさん、ご回答ありがとうございます。
 
これは
'使用する色
'=============== VBAでできないのはわかっていて記載 ===============
Public Const エラー時の背景色1 AS Double = RGB(255, 0, 0)
Public Const エラー時の前景色1 AS Double = RGB(255, 255, 0)
てな感じで本当はやりたいんです。できないけど。
 
と書かせていただいた通り、VBAでできないのはわかっていて記載しました。

投稿日時: 23/05/30 22:51:39
投稿者: わっしょい

WinArrow さんの引用:
COnst に拘っているならば
>ソース上で簡単にわかるような宣言方法

RGB表現
とは同じことなんですか?
 
 
HEXで定義する時
データ型を String にする意図が分かりません。

 
WinArrowさん、遅い時間にご回答ありがとうございます。
RGBの各値さえわかれば、Cellの背景色・前景色は、すぐ設定して色味が見えるのでソース上で簡単にわかるような宣言方法と記載いたしました。
 
>HEXで定義する時
>データ型を String にする意図が分かりません。
 
はい、私がテストもせずにWebから勝手にパクったコードなので、お許しください。
以後、気を付けます。
 
ご回答ありがとうございました。

回答
投稿日時: 23/05/31 08:49:20
投稿者: WinArrow

私は、RGB各々の値で色を想像できません。
 
若し、使う色が決まっているのでしたら
決まっている色を塗りつぶしせ営したセルを用意し、各々のセルに「名前定義」しておきます。
 
その名前を、コードの中で使用する方が分かりやすいと思います。
セルの名前定義は、色の名前ではなく、機能としてのお名前がよいと思います。
 
例えば
「不合格」という名前を「赤色」とした場合
 
    Range("A2").Interior.Color = ThisWorkbook.Names("不合格").RefersToRange.Interior.Color
 
※都合で、「赤色」を別な色に変更したい場合は、
「不合格」セルの塗りつぶしを変更するだけで済みます。
コードには影響しませんよね?

回答
投稿日時: 23/05/31 09:00:38
投稿者: hatena
投稿者のウェブサイトに移動

わっしょい さんの引用:

Enum MYCOLOR
  ' R G B
  RED = 255 + 256! * 0 + 65536! * 0
  GREEN = 0 + 256! * 255 + 65536! * 0
  BLUE = 0 + 256! * 0 + 65536! * 255
  PINK = 255 + 256! * 153 + 65536! * 255
 End Enum
 
中略
 
でも実際に、書いてみると、変数名、設定値によって、微妙にインデントがずれますね。
そんなの当たり前じゃんと言われれるとそうなのですが、投稿されたみたいにインデントがそろってると
すげーって思ったのですが、インデントがずれると微妙に読みづらいと感じてしまいました。
わがまま言って申し訳ございません。

 
gombohoriさんのアイデアをお借りして、下記のような感じでどうでしょう。
 
Const R As Long = 1
Const G As Long = 256
Const B As Long = 65536
 
Enum MYCOLOR
    RED = 255 * R + 0 * G + 0 * B
    GREEN = 0 * R + 255 * G + 0 * B
    BLUE = 0 * R + 0 * G + 255 * B
    PINK = 255 * R + 153 * G + 255 * B
End Enum

 
 

回答
投稿日時: 23/05/31 09:37:24
投稿者: VBA-stepup

失礼します。
>RGB値やHex等で、宣言してると、打ち合わせの最中に急に
「この色もう少し薄くできる?」
的な問答の時、ドタバタするので、ソース上で簡単にRGBの値が設定できるような方法がないかと思い質問しました。
  
もしよければ、私はこんな感じでやってますなど、忌憚のないご意見をお聞かせください。
 
別のシートもしくは、空きスペースに好きな色を設定し色パレットとして使っています。
VBAがわからないユーザーでもそのセルを好きなように変更できます。
 

Sub myColorNo()
    Dim colorws As Worksheet
    Dim colorNo(2) As Long
    
    Set colorws = ThisWorkbook.Worksheets("color")
    
    colorNo(0) = colorws.Range("A1").Interior.Color
    colorNo(1) = colorws.Range("A2").Interior.Color
    colorNo(2) = colorws.Range("A3").Interior.Color
    
    
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets.Add
    
    ws.Range("A1").Interior.Color = colorNo(1)
    
End Sub

回答
投稿日時: 23/05/31 10:01:20
投稿者: WinArrow

セルを利用するアイデアその2
塗りつぶしを使う方法として
 
色コードを取得するユーザー定義関数を作成し
使うプロシジャで「値」として取得する方法です。
 
ユーザー定義関数は
Function chgCOLOR(ByVal RC As Range)
    chgCOLOR = RC.Interior.Color
End Function
 
セル範囲を配列変数に一挙に取り込めます。
コードの中で色を識別は無理ですが、メンテナンスは簡単になります。
色変更もユーザーに任せることも可能です。

回答
投稿日時: 23/05/31 11:15:18
投稿者: QooApp

引用:
投稿の質問のように
RGB値やHex等で、宣言してると、打ち合わせの最中に急に
「この色もう少し薄くできる?」
的な問答の時、ドタバタするので、ソース上で簡単にRGBの値が設定できるような方法がないかと思い質問しました。

 
ユーザーに表示させないワークシート(非表示化と必要であればロック)に1セル1色使用条件で紐づけるWinArrowさん方式が一番楽だと思います。交渉中は自由に設定できるようにしておいて依頼者に直接配色させることもできます。
 
技術屋と顧客(ないし感覚型の人)の乖離を埋める方法で一番手っ取り早いのは相手の土俵に寄せることだと思います。それが技術屋側の表現方法で意図をくみ取りにくいのが根本的な原因となると思います。
 
私がExcelマクロ系で彩色を行う場合の処理は原則依頼者にすべて定義させたものを受領して加工するようにしています。
※加工元ファイルと理想の加工結果(配色や配置、計算処理含む)を提出してもらってます。
 
余談
あとはメモ帳ファイル(txtファイル)とかに配色表データを任意の空白文字(タブとか)を挿入しながら書き出し、ファイル読み込み時に空白文字の削除や読み取りスキップ処理で対応することも可能かと思います。

投稿日時: 23/05/31 18:11:24
投稿者: わっしょい

皆様、忌憚のないご意見ありがとうございました。
 
私の求めていた内容と話題が乖離してきましたので、CLOSEさせていただきます。
 
ご回答いただいた方ありがとうございました。