[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセル2010 セルの値で、フリーフォームに色を付けたい。』(いがです。)
エクセルのVBAで困っております。
ご教授をお願い致します。
Sheet1にフリーフォームで書いた図形が、数十個あります。(最終的には300個程度)
この図形の塗りつぶしの色を、Sheet2の「E」列のセルの値により変えたいと思っております。(E1〜E300)
E列の入力値は、1〜5までです。
1:赤、2:黄、3:緑、4:ピンク、5:水色とし塗りつぶしたいと思っております。
Sheet1のフリーフォームとSheet2のセルの関係は固定です。
E1=フリーフォーム1、E2=フリーフォーム2・・・(途中で変わる事はありません)
こんな事を書いて起きながら申し訳ないのですが、当方素人ですので、丁寧に説明していただけると幸いです。
お手数をお掛けいたしますが、よろしくお願い致します。
丁寧に説明・・・・う〜ん・・・・
まず、コードを試してみて、あとは、調べてコードを読解して、わからないところを質問してくれる?
あと、素人でというのは、最初は誰でもそうなんだけど、フリーフォームで作った図形の背景色を、たとえば水色にする。 それをマクロ記録して、どんなコードで背景色が図にセットされるのか確認する。 それは当然、もうやっているんだよね?
Sub Sample()
Dim ff As Shape
Dim n As Long
Dim x As Long
For Each ff In Sheets("Sheet1").Shapes
If ff.Type = msoFreeform Then
n = Val(Split(ff.Name)(1))
If n > 0 Then
x = Val(Sheets("Sheet2").Range("E1").Offset(n - 1).Value)
Select Case x
Case 1 To 5
ff.Fill.ForeColor.RGB = VBA.Array(vbRed, vbYellow, vbGreen, vbMagenta, vbCyan)(x - 1)
End Select
End If
End If
Next
End Sub
(ぶらっと)
↑ アップしたコードはフリーフォームの名前が フリーフォーム 1 といったように、文字と数字の間に半角スペースがあるということを前提。 (文字は フリーフォーム でなくてもいいけど) そうでないならエラーになる。
(ぶらっと)
ご回答ありがとうございます。
ご指導いただき少しづつ勉強してまいります。
sampleで問題なく反映出来る事は確認出来ました。
もう少し追加で質問ですが、sampleは、E1=フリーフォーム 1,E2=フリーフォーム 2・・・
となってるかと思いますが、参照するセルとフリーフォームの関係を個別に指定する事は可能でしょうか?
フリーフォームの名前を任意に変更し、それとリンクしたE列のセルを指定する。
例:フリーフォーム 10-1=E3、フリーフォーム 2-3=E1、フリーフォーム 1-3=E1・・・とランダムな関係になります。
よろしくお願い致します。
(いがです。)
D列に 10-1 とか、 E列に色番号。
Sub Sample2()
Dim ff As Shape
Dim x As Long
Dim c As Range
Dim sh2 As Worksheet
Set sh2 = Sheets("Sheet2")
For Each c In sh2.Range("D1", sh2.Range("D" & sh2.Rows.Count).End(xlUp))
Set ff = Nothing
On Error Resume Next
Set ff = Sheets("Sheet1").Shapes("フリーフォーム " & c.Value)
On Error GoTo 0
If Not ff Is Nothing Then
x = Val(c.Offset(, 1).Value)
Select Case x
Case 1 To 5
ff.Fill.ForeColor.RGB = VBA.Array(vbRed, vbYellow, vbGreen, vbMagenta, vbCyan)(x - 1)
End Select
End If
Next
End Sub
(ぶらっと)
Sample2も問題なく反映出来る事は確認出来ました。
すみません、もう一点お願いがございます。(どんどん欲が出てきてしまって。。。)
現状のマクロでは、Sheet2のE列に1〜5の値を入力後に、マクロを実行しないと
Sheet1のフリーフォームの色が変化しないと思いますが、Sheet2のE列の値が変われば、
そのままSheet1のフリーフォームの色が変わる様に出来ないでしょうか?
よろしくお願い致します。
(いがです。)
Sample のこと? Sample2 のこと? いずれにしても、できるけど、Sample2 の場合、ちょっと(操作と実行のタイミングが)ややこしくねるね。
たとえば、D1 に 1 と記入してあった。 で、E1 を 1(赤) にした。なので、その瞬間に フリーフォーム 1 の背景色を赤にする。 これは、どうってことないんだけど、問題は、 あっ!間違った、赤にするのは フリーフォーム 2 だった! ということで、D1 を 2 にかえた。このときも反映させたいんじゃないかな? でも、そうすると、赤にしたフリーフォーム 1 は? 間違いだったので、元に戻す? 元の色は?
まぁ、やりかたとしては、D列であれE列であれ、何かしら値の入力があれば、その入力された対象だけではなく 全フリーフォームの色を洗いがえるというのが操作も考えたときシンプルだと思う。
標準モジュールに書いたSample2 は、そのままにして、Sheet2のシートタブを右クリック。 コードの表示を選んで出てくるところ(Sheet2のシートモジュール)に以下を貼り付け、 右上のXボタンをおしてエクセルに戻って、D列やE列を適当に変えてみて。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("D:E")) Is Nothing Then Sample2
End Sub
(ぶらっと)
今回いろいろと適切にご回答いただきありがとうございました。
Sample2+最後の回答で問題なく行けそうです。
(いがです。)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("D:E")) Is Nothing Then Sample2
End Sub
上記のを変更すれば出来そうな気がしましたが、エラーで動いてくれませんでした。
お手数をお掛け致しますが、よろしくお願い致します。
(いがです。)
>上記のを変更すれば出来そうな気がしましたが、エラーで動いてくれませんでした。
実際に、変更(追加?)したコードをアップしてくれる? それと、エラーというのは、どんなエラーなのか、そのエラーメッセージも教えて。
(ぶらっと)
そちらが変更したコードを見てみたい気もするけど、とりあえず。
コードの前に、前回は最初に標準モジュールのコードを作成して、後で、Sheet2のイベント処理を追加。 標準モジュールはそのままで使う方法にしたけど、標準モジュールを廃止して、Sheet2のシートモジュール一本で 処理する構えにしよう。
Sheet2 の E列が Sheet1 のフリーフォーム用、F列が Sheet3 のフリーフォーム用にしてある。 シート名は実際のものに変更してね。
Sheet2 のシートモジュールを以下で置換。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("D:F")) Is Nothing Then
Sample3 Sheets("Sheet1"), "E"
Sample3 Sheets("Sheet3"), "F"
End If
End Sub
Private Sub Sample3(sh As Worksheet, col As String)
Dim ff As Shape
Dim x As Long
Dim c As Range
For Each c In Range("D1", Range("D" & Rows.Count).End(xlUp))
Set ff = Nothing
On Error Resume Next
Set ff = sh.Shapes("フリーフォーム " & c.Value)
On Error GoTo 0
If Not ff Is Nothing Then
x = Val(c.EntireRow.Range(col & 1).Value)
Select Case x
Case 1 To 5
ff.Fill.ForeColor.RGB = VBA.Array(vbRed, vbYellow, vbGreen, vbMagenta, vbCyan)(x - 1)
End Select
End If
Next
End Sub
(ぶらっと)
中途半端で分かりにくい質問にも、適切にご回答いただきましてありがとうございます。
今回も非常に助かりました。
(いがです。)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.