Excel (VBA)

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

 
(Windows 8系全般 : Excel 2013)
図形の色を、ユーザーが選択した任意の色に変えたい
投稿日時: 17/12/25 22:16:07
投稿者: sho_he

ある特定の図形の色を、ユーザーフォーム上でユーザーが選択した任意の色に変えるマクロを組みたいです。
イメージとしては、ユーザーフォーム上で、カラーパレットが開かれ、ユーザーがそこで色を選択し、その色に図形の色が変わるというものです。
色々と調べてみましたが、まったくやり方がわかりません。
何か良いアドバイスをいただけたらと思います。

回答
投稿日時: 17/12/25 22:31:50
投稿者: simple

特定の図形を選択した状態で、
「図形の塗りつぶし」のボタン?をクリックすれば、
パレットが現れて任意の色にできますよね。
これではどのあたりがまずいですか?
 
ユーザーフォームにパレットを表示するって簡単なことではないですよ。
無謀なトライとしか見えません。失礼。

投稿日時: 17/12/25 23:03:23
投稿者: sho_he

数百個の図形の中から、条件に一致する全ての図形を、一度に色分けする目的でマクロを組みます。
また、条件も複数作成し、条件によって色を変えたいので、ユーザー任意の色が選択できればと考えています。
 
難しいことは承知した上での質問になります。

回答
投稿日時: 17/12/25 23:29:40
投稿者: もこな2

横から口出し失礼します。
 

引用:
色々と調べてみましたが、まったくやり方がわかりません。
何か良いアドバイスをいただけたらと思います

引用:
難しいことは承知した上での質問になります

まぁいろいろ調べて悩んだからご質問されたんでしょうけど、回答者は質問者がどんなことを考えて、どのようなアプローチを試してダメだったのかが分からないので、そのあたりの説明がなく丸投げのような質問をされてしまうと回答のしようがなくなっちゃいます。
 
一応ですが。。。カラーパレット自体を自分で作っちゃうっていうのはどうですかね
十色程度であればユーザーフォームのコマンドボタンに色塗って、並べておけば、それっぽく見えたりしませんか?
(すでに試されてボツにしたのかもしれませんが、前述のとおり、「色々と調べてみましたが」の説明がないのでわかりません。)

回答
投稿日時: 17/12/26 10:01:01
投稿者: WinArrow
投稿者のウェブサイトに移動

>色々と調べてみましたが、まったくやり方がわかりません。
これだけの説明では、丸投げと受け取られてしまいます。
 
いろいろ調べたのですから
やりたいことの作業を分解して
この部分は分かった。
この部分はわかない。
分からないまでも、このような調査をした。
 
など、具体的な説明が必要です。
 
ネット検索すれば
例えば、
カラーパレットの作り方(表示の仕方)
とか
図形に色を設定する方法
とか、部分的に参考になるページがあります。
 
それらをカスタマイズしながら組立てることで、自身のスキルアップにもつながるし、
他人にも自信をもってアドバイスできるようになります。
 
 
 

回答
投稿日時: 17/12/26 10:04:50
投稿者: WinArrow
投稿者のウェブサイトに移動

申し添えていおきますが、
 
若し、会社の仕事でお使いの道具を作ろうとしているならば、
余り、トリッキーなものを作ると、仕事を後継者に引き継げられない・・・・なんてことにならないよう
注意することです。

回答
投稿日時: 17/12/26 11:12:44
投稿者: 細雪

sho_he さんの引用:
数百個の図形の中から、条件に一致する全ての図形を、一度に色分けする目的でマクロを組みます。
また、条件も複数作成し、条件によって色を変えたいので、ユーザー任意の色が選択できればと考えています。
難しいことは承知した上での質問になります。

sho_he さんの引用:
色々と調べてみましたが、まったく やり方がわかりません。

 
とのことですが、例えばGoogleで「VBA カラーパレット」で検索してみたりもしましたか?
多少の変動はあるかもしれませんが、3つ目前後くらいでヒントが見つかるような気がします。
多分、Yahooでも6つ目くらいです。
サンプルが見つかれば改造は容易いと思います。
 
 
念のためお聞きしたいのですが・・
「任意の色」⇒「決められた数色から選択」
に妥協できないものですか?
それだけで難易度がグンと下がるような気がします。
 
 
・・・で、おっしゃる
「複数条件に合う図形を数百個から抜き出す」処理の方は出来ているのでしょうか。
  ※まぁ、ここは For each でがんばるのが常套ですかね。
というか、その「条件」ってどのようなモノを想定なさっているのでしょう?
それが分からないとアドバイスも出来ない・・・というか
むしろ私自身の後学のため、是非ご提示ください。
図形を選別する条件、というのをあまり考えたことが無いもので。

投稿日時: 17/12/26 22:53:34
投稿者: sho_he

皆さん、コメントありがとうございます。
丸投げと捉えられてしまうような質問の仕方をしてしまい、すみません。
 
カラーパレットを表示させて、そこでユーザーが色を自由に選択できれば、
良いのではないか、という考えから自分で調べてみました。
その結果、具体的な方法は見つからず、
@カラーパレットの表示は難しい。
AAPIを使用すれば似たようなことができる。
といったことがわかりました。
 
APIに関してはまったく触ったことがないので、内容は理解できませんでした。
この掲示板で質問をしたら、どなたかがその方法を知っているかもしれないと考え質問させていただきました。
 
しかし、もこな2さんと細雪さんのおっしゃるように、
色数を限定して、ユーザーに選択させる仕組みで充分かもしれません。
自分では思いつきませんでした。
ありがとうございます。
 
条件に一致する図形(オートシェイプ)を抜き出す処理はできています。
for each を使います。
図形には、名前ボックスに数字が割り振られており。
その数字の行に必要なデータが入っています。
そのデータと条件の整合性を if ステートメントで、確認して色を塗ります。

回答
投稿日時: 17/12/27 13:47:11
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
条件に一致する図形(オートシェイプ)を抜き出す処理はできています。
for each を使います。
 図形には、名前ボックスに数字が割り振られており。
その数字の行に必要なデータが入っています。
そのデータと条件の整合性を if ステートメントで、確認して色を塗ります。

「色パレットを表示して色を選択する方法」を
考えているようだけど、
 
その数字の行に必要なデータ
に背景色を設定したセル(条件に対応したいくつかのセル)を用意し
そのセルの背景色を図形に適用させる
という案はいかがでしょう?
マクロを実行する前にセルに色を設定させておく・・・・ということです。

回答
投稿日時: 17/12/27 14:59:46
投稿者: でれすけ

こんにちは
 
Sub test()
 
  MsgBox SelectShapeColor
 
End Sub
 
Function SelectShapeColor() As Long
 
Dim tmp_shp As Shape
 
   Set tmp_shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 390, 55.5,
72, 72) ' 使い捨てのシェープを用意
   tmp_shp.Select
 
   Application.CommandBars.ExecuteMso "ObjectFillMoreColorsDialog" ' 【その
他の色】を実行
   SelectShapeColor = tmp_shp.Fill.ForeColor ' 使い捨てシェープの前景色を取

   tmp_shp.Delete 'ぽい
 
End Function[/code]

回答
投稿日時: 17/12/27 17:06:34
投稿者: WinArrow
投稿者のウェブサイトに移動

私のレスの中の
セルの背景色を図形の背景色に適用する
のサンプルコードを紹介します。
    With ActiveSheet
        .Shapes(1).Fill.ForeColor.RGB = .Range("H3").Interior.Color
    End With
 
Application.InputBoxのType:=8を使ってセルを選択させる方法を
使えば、セルを色パレット代用にすることができます。
 
 

回答
投稿日時: 17/12/27 17:25:05
投稿者: 細雪

sho_he さんの引用:

条件に一致する図形(オートシェイプ)を抜き出す処理はできています。
for each を使います。
図形には、名前ボックスに数字が割り振られており。
その数字の行に必要なデータが入っています。
そのデータと条件の整合性を if ステートメントで、確認して色を塗ります。

 
なるほど、図を選択しつつ色を塗るロジックは出来ていて、あとはその「色の指定」ってことですね。
 
 
以下、誉められた手段では決してないとは思うのですが・・例えば、
フォームに、テキストボックスを3個、ラベルを1個用意します。
テキストボックスそれぞれ名前を
・myR   (赤の明度)
・myG   (緑の明度)
・myB   (青の明度)
ラベルの名前を
・RGBSample    (色のサンプル)
としておきます。※適当です。決まりは全くありません。
 
で、フォームに
Private Sub UserForm_Initialize()
    myR.Value = 255
    myG.Value = 255
    myB.Value = 255
     
    RGBSample.BackColor = RGB(myR.Value, myG.Value, myB.Value)
End Sub
こんな感じで「フォームが初期化されるときにラベル RGBSample の背景色を白に、
       かつ、テキストボックス(RGB)の初期値として 255 を与える」コードを仕込みます。
       ※ご存知とは思いますが、0(暗)〜255(明)で各色の明度を指定、
        RGB(0, 0, 0) 黒 〜 RGB(255, 255, 255) 白   です。
 
各テキストボックスには
Private Sub myB_AfterUpdate()
    RGBSample.BackColor = RGB(myR.Value, myG.Value, myB.Value)
End Sub
 
Private Sub myG_AfterUpdate()
    RGBSample.BackColor = RGB(myR.Value, myG.Value, myB.Value)
End Sub
 
Private Sub myR_AfterUpdate()
    RGBSample.BackColor = RGB(myR.Value, myG.Value, myB.Value)
End Sub
このように「テキストボックス(RGBの明度)が更新されたら、ラベルの背景色を変える」ようにします。
 
コレを応用して「図形の塗りつぶし色」に渡してやれば、
カラーパレットの超簡素化されたような(遠く及ばない)ものとして使えなくはないです。
各色のテキストボックスにスピンボタンを組み合わせるとほんの少しだけ近づけるかもしれません。

投稿日時: 17/12/27 21:55:04
投稿者: sho_he

皆さん色々とアイデアを出してくださってありがとうございます。
 
中でも、もこな2さんが最初に提案してくださった、アイデアで試してみたいと思います。
ユーザーフォームの中にコマンドボタンを10個程度作って、
その色をColorIndexで取得して、図形の塗りつぶしに使おうと思います。
 
今後、質問する際は、自分が考えている仕様、
理解できていること、仕上がっているプログラムを、きちんと示そうと思います。
皆さん、ご親切にありがとうございました。