• ベストアンサー

楕円の塗りつぶし

色々と試してはみたのですが、なかなかうまくいきません。 Private Sub Worksheet_Calculate() For i = 1 To 100 n = (i - 1) * 3 + 8 If Cells(n, "R").Value < -10 Then c = 10 Else Select Case Cells(n, "S").Value Case Is = 0 c = 10 Case Is > -89 c = 17 Case Is < -100 c = 10 Case Else c = 12 End Select End If With Sheets("ABC").Shapes("テキスト " & i) .Line.ForeColor.SchemeColor = c .TextFrame.Characters.Font.ColorIndex = c - 7 .TextFrame.Characters.Font.Size = 6 End With If Cells(n, "W").Value = 37 Then a = 39 Else a = 3 End If With Sheets("ABC").Shapes("楕円 1") .Fill.ForeColor.SchemeColor = a - 7 .TextFrame.Characters.Font.ColorIndex = a End With Next i End Sub といった感じで作成しています。 今回 If Cells(n, "W").Value = 37 Then a = 39 Else a = 3 End If With Sheets("ABC").Shapes("楕円 1") .Fill.ForeColor.SchemeColor = a - 7 .TextFrame.Characters.Font.ColorIndex = a End With 上記の部分を追加しました。 トラブルだらけです。 読みに行ったセルの値が37なら楕円を39の色にて塗りつぶす、 それ以外なら3です。 ただ、まだ塗りつぶしの色と文字の色の関係は調べていません。 長くわかりづらいと思いますが、宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >Range("L11") の11の部分に変数の n を使用したいのですが、 Range("L" & n).Interior.ColorIndex = 37 Then もしくは、 Cells(n, 12).Interior.ColorIndex = 37 Then となります。

k-kikuchi
質問者

お礼

有難う御座いました。 うまくいきました。 最終的には b = Cells(n, "L").Interior.ColorIndex If b = 37 Then a = 46 Else a = 43 End If With Sheets("外周(外来波)").Shapes("楕円 " & i) .Fill.ForeColor.SchemeColor = a End With で、色番号37以外はもくっつけました。 変数 b a でややこしくなっていますが、 完成いたしました。 本当に有難う御座いました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 >他のBOOKよりコピーしてきて貼り付けているのでCalculateにしています。 通常、コピーして張り付ける場合は、Calculate イベントではなくて、Change イベントで十分です。人がマニュアル操作で行わないイベントの場合、Calculate イベントを使います。 Private Sub Worksheet_ChangeByVal Target As Range) If Intersect(Target, Rows(1)) Is Nothing Then Exit Sub A列以外に操作した場合は、イベントを除外する。 >テキストボックス・楕円は100個あります。 そうしたら、書いたり消したりしないほうがよいです。思った以上に、操作する上限が低いのです。たぶん、VRAMメモリとの関係だと思います。数千程度の繰り返しで、オブジェクトが見えなくなったりすることがあります。 >With Sheets("ABC").Shapes("テキスト " & i) >の部分でインデックスが有効ではないとエラーメッセージが出ます。 この場合は、私が行う方法は、新たに、オートシェイプの名前をマクロ用に付けなおす方法です。 "テキスト " & i というのは、単に、ツールバーのツールボタンでつけた結果だと思います。 スペースが入ったりしています。 '注意:テキストボックスと楕円のインデックス番号が、1 - 1 と連動している場合に限ります。 'もし、連動していない場合は、このマクロは使えません。 'テキストボックスと楕円の再名前付け Sub ShapesNaming()   Dim shp As Shape   Dim i As Long, j As Long   i = 1: j = 1   For Each shp In ActiveSheet.Shapes     If shp.AutoShapeType = msoShapeOval Then       shp.Name = "Oval" & i       i = i + 1     End If     If shp.AutoShapeType = msoShapeRectangle Then       shp.Name = "Text" & j       j = j + 1     End If   Next shp End Sub '結果は、楕円 1 ~100 は、Oval1 ~ Oval100, テキスト 1~100 は、Text1~Text100 その上で、 With Sheets("ABC").Shapes("Text" & i) '半角空白が入りません。 With Sheets("ABC").Shapes("Oval" & i) と書き換えます。 >TextFrame.Characters.Font.ColorIndex = c - 7 >.TextFrame.Characters.Font.Size = 6 これは、コードにエラーが出やすいので、  .DrawingObject.Characters.Font.ColorIndex = c - 7  .DrawingObject.Characters.Font.Size = 6   とします。 どうも、変数のc と aとの関係が見えてきません。コードで分からない部分を言葉で補足して、全体的にコードが見えると良いのですが……。

k-kikuchi
質問者

お礼

有難う御座います。 >通常、コピーして張り付ける場合は、Calculate イベントではなくて、Change イベントで十分です。人がマニュアル操作で行わないイベントの場合、Calculate イベントを使います。 すいません。貼り付けた後にセルの中を色々変更する場合があるので Calculate イベント にしています。 >この場合は、私が行う方法は、新たに、オートシェイプの名前をマクロ用に付けなおす方法です。 ある程度動作が確認できてから変更させて頂きます。 なにせ素人なもので、一度に色々変更してしまうと、 どこが悪かったのか判断できなくなってしまいます。 >'注意:テキストボックスと楕円のインデックス番号が、1 - 1 と連動している場合に限ります。 >'もし、連動していない場合は、このマクロは使えません。 連動しています。 >どうも、変数のc と aとの関係が見えてきません。コードで分からない部分を言葉で補足して、全体的にコードが見えると良いのですが……。 すいません。説明不足で・・・ c は貼り付けをした中のセルの内容によって テクストボックスを3色に塗り分けるための色の番号です。 a は貼り付けをした中のセルが塗りつぶされていれば楕円を指定色で塗りつぶすための色番号です。 詳しくは下に記載しました。 宜しくお願いします。

k-kikuchi
質問者

補足

色々、試してみました。 とりあえず、マクロ関数というのですかね。 怪しそうなので、別の手を考えて If Range("L11").Interior.ColorIndex = 37 Then With Sheets("ABC").Shapes("楕円 " & i) .Fill.ForeColor.SchemeColor = 46 End With End If と変えてみました。 エラーも消え、塗りつぶしも動作しました。 ただ、 Range("L11") の11の部分に変数の n を使用したいのですが、 記載方法が解りません。 Range("L", n)でエラーになります。 もう少しと近づいた感じです。 宜しくお願いいたします。

回答No.3

> With Sheets("ABC").Shapes("テキスト " & i) ここでインデックスが有効範囲ではないと出るのは、 シート名"ABC"がないことが考えられますね。

k-kikuchi
質問者

お礼

有難う御座います。 何度も確認したのですが、名前は合っています。 今までは使っていました。 今回の追加にてエラーが出るようになりました。 今回追加した部分ではなく、 今まで使っていた部分です。 色々試したのですが、 今回L列のセルの色を判断し、(判断といっても塗りつぶされているかいないかです) 色がついていたら楕円を決められた色で塗りつぶす。 といったことを実行したいのです。 塗りつぶしがあるかどうかの方法がわからなかったので、 挿入→名前→定義にて、「CELLCOLOR」というものを作りました。 =GET.CELL(63,$L8)+NOW( )*0 W列に =CELLCOLOR にて、L列の色番号を拾ってきています。 実際に塗りつぶされていた色は37でした。 この定義の部分を設定するとエラーが発生するようになります。 これを削除し、W列に直接37を入力するとエラーは起こりませんでした。 遅くなりましたが、EXCEL2003を使用しています。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 コードが良く分からない部分があります。 Shapes の置いてある場所と、アクティブシートとは別なのでしょうか? なぜ、Calculate イベントという忙しいイベントにしているのかも良く分かりません。 Change イベント程度で十分ではないでしょうか。OLEでデータをインポートしているのでしょうか? テキストボックスは、100もあるのでしょうか。余計なことかもしれませんが、ワークシートのつくりとして、全体的に無理はないでしょうか? それと、 With Sheets("ABC").Shapes("楕円 1") こういう、割り付けはループの中では無理です。ひとつのオブジェクトに100回も同じようなことをさせても、無駄だと思います。 If Cells(n, "W").Value = 37 Then a = 39 Else a = 3 End If a の値が、3と出て、 .Fill.ForeColor.SchemeColor = a - 7 '* .TextFrame.Characters.Font.ColorIndex = a では、マイナスになれば、エラーが出ます。 SchemeColor は、ColorIndex に7を足すと出ます。だから、"a +7" でしょうけれども、塗りつぶしと同じフォントの色にしたら見えないと思います。

k-kikuchi
質問者

お礼

ご回答有難う御座います。 Shapes の置いてある場所と、アクティブシートとは別なのでしょうか? あまり詳しくないのでわかりませんが、コードの書いてあるシートと楕円のあるシートは別です。 他のBOOKよりコピーしてきて貼り付けているのでCalculateにしています。 テキストボックス・楕円は100個あります。 実際いつも100個使うわけではないのですが、基本シートとして作ってあります。 ここにきて間違いを発見しました。 楕円も100個なので、ループしています。 1→iに直します。

k-kikuchi
質問者

補足

色々試してみましたが、うまくいきませんでした。 If Cells(n, "W").Value = 37 Then a = 39 Else a = 36 End If With Sheets("ABC").Shapes("楕円 " & i) .Fill.ForeColor.SchemeColor = a + 7 End With と直してみました。 すると、ここではない With Sheets("ABC").Shapes("テキスト " & i) の部分でインデックスが有効ではないとエラーメッセージが出ます。 テクストボックスの数も100個あります。 以前は問題なく動作していました。 今回の部分の追加にて発生しました。 なかなかうまくいかないものです。

回答No.1

> If Cells(n, "W").Value = 37 Then > a = 39 > Else > a = 3 > End If > > With Sheets("ABC").Shapes("楕円 1") > .Fill.ForeColor.SchemeColor = a - 7 > .TextFrame.Characters.Font.ColorIndex = a > End With 上記の内容ですと、aが3になっている場合、 > .Fill.ForeColor.SchemeColor = a - 7 この一文を通過するときに、「-4」になってしまうため、 この部分でエラーが出ると思いますよ。 どのようなことを行いたいのかがわからないので、適切な回答では ないかもしれませんが、If文の中に入れるなどした方がよさそうです。

k-kikuchi
質問者

お礼

有難う御座います。 全然気づいていませんでした。 まだ試していませんが、とりあえずお礼まで 今回やりたいことは、 実際にはセルに色がついていたら、 楕円をある色で塗りつぶす。 それ以外ならまたある色で塗りつぶす。 その楕円が100個あります。 セルに色がついていたらという使い方がわからなかったので セルの色を”GET.CELL(63,$A1)+NOW( )*0"で 色の番号を拾ってきてセルの内容がその番号だったら 楕円を塗りつぶすにしています。 とりあえず a-7 を直してみます。 有難う御座います。

関連するQ&A

  • テキストボックスの色変更

    自動でテクストボックスの色変更をしたいのですが、 前回こちらにて質問をさせていただき大変助かったのですが、 さらに、問題に突き当たりました。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("R8: S341 ")) Is Nothing Then Exit Sub If Cells(Target.Row, "R").Value < -10 Then c = 10 Else Select Case Cells(Target.Row, "S").Value Case Is > -89 c = 17 Case Is < -100 c = 10 Case Else c = 12 End Select End If With Sheets("sheets2").Shapes("テキスト " & Target.Row) .Line.ForeColor.SchemeColor = c .TextFrame.Characters.Font.ColorIndex = c - 7 End With End Sub にて、色と文字色の変更はできたのですが、 R列、S列を関数で読み込んでくると自動では変わりません。 手動で打ち込むと変わるのですが 一緒に文字サイズの指定もできるのでしょうか? 宜しくお願いいたします。

  • エクセル マクロで引いた線の色設定が戻せない

    エクセルで作成した、出席簿にマクロで 土日などに赤線で罫線の間に縦に オートシェィプ直線を引いています。 次に転出者の欄には、横に線をマクロで引いていますが 色が変えられません。 マクロ終了後もオートシェイプの線色は黒でも 、線を引くと赤のままです。 その線を選択して、色を変えないと 変えられない状態です。 マクロ終了前に、色をリセットする事は出来ませんか? 下記の内容がマクロの一部です。 よろしくお願いします。 If yobi = doyo Or yobi = niti Then Cells(3, 2 + n).Activate If yobi = niti Then With Selection.Font .ColorIndex = 3 End With End If ActiveSheet.Shapes.AddLine(110.25 + 21.75 * (n - 1), 42, 110.25 + 21.75 * (n - 1), 651).Select Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 '10=赤色 End If If yobi = "" Then ActiveSheet.Shapes.AddLine(110.25 + 21.75 * (n - 1), 14.25, 110.25 + 21.75 * (n - 1), 651).Select Selection.ShapeRange.Line.ForeColor.SchemeColor = 8 '8=黒色 End If

  • エクセルマクロ

    OS:WINDOWS7 SOFT:EXCELL 2007 PC:VAIO VGN-FW73JGB です。マクロで図形入り文字を入れると、文字の右側が切れます。中央に配置するように設定すれば良いですが、その都度変更する必要があるので、教えて頂きたいです。よろしくお願いします。 If CheckBox5 = True Then Set sp = ActiveSheet.Shapes.AddTextbox(msoTextOrientationVertical, 290, 212.5, 20, 45) With sp .TextFrame.Characters.Text = "延 長" sp.Select Selection.ShapeRange.Fill.Visible = msoFalse With sp With .Line .Weight = xlThin .ForeColor.SchemeColor = 8 End With End With End With End If

  • エクセルVBAでテキストボックスのフォントの色

    エクセル2016です。以下のコードで文字は赤になりますが、これをRGB方式ではなくColorindex=3で指定するにはどう書き直せばよろしいでしょうか? Sub TEST03() With Sheets("Sheet1").Shapes("TextBox 3").TextFrame2 With .TextRange .Text = "TEST/TEST/03" .Font.Name = "Meiryo UI" .Font.Bold = msoTrue .Font.Size = 16 .Font.Fill.ForeColor.RGB = RGB(255, 0, 0) .ParagraphFormat.Alignment = msoAlignCenter End With .VerticalAnchor = msoAnchorMiddle End With End Sub 別途、Sheets("Sheet1").Shapes("TextBox 1").TextFrame.Characters.Font.ColorIndex = 3 と書けば赤になりますが、Sub TEST03()のRGB = RGB(255, 0, 0)の代わりに指定する方法が知りたいのです。 よろしくお願いします。

  • エクセルのコメントで自動サイズ調整

    Excel2000です。 ワークシート、 Sheets("Comment")上のデータにもとづき、自動でセルにコメントを挿入するマクロを書きました。 以下で、正常に作動します。 問題は、TextFrameの自動サイズ調整の部分です。 このままだと、文字列の長さに応じて横にだけ長くなってしまうのです。 かといって、文字列の長さはバラバラなのでサイズを固定するわけにもいきません。 コメントの横幅は一定で、縦の長さだけ文字数に応じて自動で変わるような設定はできないものでしょうか? Sheets("Comment")上のデータをAlt+Enterでセル内改行させることにより対応はできますが、もっといい方法がないか質問させていただきました。 Lenで文字数を調べ、これに応じて対応させるのは、全角半角が入り混じったデータなので無理そうです。 宜しくお願い申し上げます。 Sub Comment挿入() Dim sa As String, ad As String, tx As String With Sheets("Comment") For i = 2 To 42 sn = .Cells(i, "A").Value 'シート名 ad = .Cells(i, "B").Value 'セルアドレス tx = .Cells(i, "C").Value 'テキスト With Sheets(sn).Range(ad) .AddComment With .Comment .Visible = False .Text Text:=tx .Shape.Shadow.Visible = msoFalse '影無し .Shape.Fill.ForeColor.SchemeColor = 42 '背景を水色 .Shape.Line.ForeColor.SchemeColor = 10 '枠線を赤 .Shape.TextFrame.Characters.Font.Name = "MS UI Gothic" 'フォント指定 .Shape.TextFrame.Characters.Font.ColorIndex = 3 'フォント色を赤 .Shape.TextFrame.AutoSize = True '自動サイズ調整 End With End With Next i End With End Sub

  • エクセルVBAでの複数のオートシェイプの色塗り方法

    ネットから下記のコードを見つけたのですが、1つのシートに複数のオートシェイプの色塗りを変更する方法を教えてください。 例えばセル"A1"には数値の1と"A2"には数値2を入力したら、 オートシェイプAにはセル"A1"に対応した色塗り『赤色』を オートシェイプBにはセル"A2"に対応した色塗り『黄色』といった感じです。 下記のコードをいくつも繋げれば、複数のオートシェイプの色塗りが出来ると思ったのですが、コードを繋げる方法がわかりません。その他に何か良い方法がありましたら教えてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub With ActiveSheet.Shapes("ABC").Fill.ForeColor Select Case Target.Value Case Is = "赤" .SchemeColor = 2 Case Is = "黄" .SchemeColor = 5 Case Is = "緑" .SchemeColor = 3 Case Is = "青" .SchemeColor = 4 Case Else .SchemeColor = 1 End Select End With End Sub

  • エクセルVBAでShapeRangeについて

    すみません、教えてください。 以下のマクロは正常に動きます。 Sub TEST() With ActiveSheet For Each s In .Shapes If s.AutoShapeType = msoShape5pointStar Then s.Delete Next .Cells.Interior.ColorIndex = 1 Set AA = .Shapes.AddShape(msoShape5pointStar, 55, 22, 25#, 25#) AA.Fill.Visible = msoTrue AA.Fill.Solid AA.Fill.ForeColor.SchemeColor = 13 AA.Fill.Transparency = 0# AA.line.Weight = 0.75 AA.line.DashStyle = msoLineSolid AA.line.Style = msoLineSingle AA.line.Transparency = 0# AA.line.Visible = msoTrue AA.line.ForeColor.SchemeColor = 64 ' AA.Copy '(1) ' .Paste '(1) ' Set AB = Selection '(1) ' .Range("A1").Select'(1) Set AB = AA.Duplicate '(2) AB.Top = 44 AB.Left = 110 ' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2 AB.Fill.ForeColor.SchemeColor = 10 '(2)の2 End With End Sub ところが、 Set AB = AA.Duplicate '(2)の部分を、コメントアウトしている '(1)の記述に変えると、 AB.Fill.ForeColor.SchemeColor = 10 '(2)の2 の部分も ' AB.ShapeRange.Fill.ForeColor.SchemeColor = 10'(1)の2 に変えないとエラーになります。 ' AA.Copy '(1) ' .Paste '(1) ' Set AB = Selection '(1) も Set AB = AA.Duplicate '(2) も、同じことのように思えるのですが、この違いで、ShapeRangeというのを入れたり消したりしなければならないのはどうしてでしょうか? エクセルは2000です。

  • VBA 「文字が入っていたら、上下に線を引く」

    困っています。どなたか教えてください。 下記のように作成しましたが、 A列に文字が入っていたら、上下に線を引くというプロシージャにしたいと思っています。 If Cells(c, 4) = "" Then Range(Cells(c, 1), Cells(c, 6)).Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlDot .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With bolFlg = True Else まだまだ続きますが・・・・。 よろしくお願いいたします。

  • エクセルVBAで芸術的な画面の動き?

    このカテを検索していて、以下のような芸術的というか、とても面白いVBAのコードを見つけました。テストしたらエクセルでこんなことが出来るのかと驚きました。 自分ではコードはわかりますが、センスがなくてこういう動きはなかなか思いつきません。 多分他にもいろんなことが出来るのでしょうが、どんな面白いのがありますか?是非教えてください。 Sub test01() Randomize With ActiveSheet .Cells.Interior.ColorIndex = 1 CL = Int((50 * Rnd) + 1) L1 = Int((700 * Rnd) + 20) H1 = Int((450 * Rnd) + 20) Set SA = .Shapes.AddShape(msoShape5pointStar, L1, H1, 25, 25) SA.Name = "Merlion_" & SA.Name SA.Fill.ForeColor.SchemeColor = CL For n = 1 To 100 CL = Int((50 * Rnd) + 1) L2 = Int((600 * Rnd) + 20) H2 = Int((300 * Rnd) + 20) SA.Top = H2 - SA.Width / 2 SA.Left = L2 - SA.Height / 2 SA.Fill.ForeColor.SchemeColor = CL Set SL = .Shapes.AddLine(L1, H1, L2, H2) SL.Name = "Merlion_" & SL.Name Application.StatusBar = SL.Name SL.line.Weight = 0.75 SL.line.ForeColor.SchemeColor = CL L1 = L2 H1 = H2 Next SA.ZOrder msoBringToFront SA.line.Visible = True SA.line.ForeColor.SchemeColor = CL For i = 1 To 800 Step 60 SA.Rotation = i / 10 SA.line.Weight = i DoEvents Next For Each s In .Shapes If s.Name Like "Merlion_*" Then s.Delete Next .Cells.Interior.ColorIndex = xlNone End With End Sub

  • エクセルVBAでオートシェープを円く動かしたい。

    星型をシート上で回転しながらぐるっと円周のように動かそうと、ためしに下記のマクロを書きましたが、やはり方向転換がぎこちなく、スムーズな丸い動きにはなりません。 かと言って、上下左右以外に動かす方法はないでしょうし、何かいいやり方はないでしょうか? Sub Star() With ActiveSheet.Shapes.AddShape(msoShape5pointStar, 273#, 43#, 50#, 50#) .Fill.ForeColor.SchemeColor = 13 .Line.Weight = 0.75 .Line.ForeColor.SchemeColor = 64 For i = 1 To 180 a = 1 b = 1 If i > 90 Then a = -1 If i < 45 Or i > 135 Then b = -1 .IncrementRotation 2 .IncrementTop 2 * a .IncrementLeft -2 * b DoEvents Next End With End Sub

専門家に質問してみよう