オプションボタンで○を描いたり消したり

このQ&Aのポイント
  • オプションボタンを使ってセルに○を描画したり消したりする作業について悩んでいます。シートをリンクせずに10枚作成し、各シートに2つのオプションボタンを配置したいです。現在のコードではセルからずれてしまう問題があります。
  • セルに収まるような最大の○を描画するためのコードをご教授ください。他のPCでも同様に動作するようにしたいです。
  • 以前作成したコードでは、オプションボタンの配置が不正確なため、セル内に収まるように修正したいです。他のPCでも問題なく動作するようにしたいです。
回答を見る
  • ベストアンサー

オプションボタンで○を描いたり消したり

いつもありがとうございます。 今度は下記内容で悩んでいます。 どなたか、助けて下さい。 (したい事) オプションボタン1を押す セルJ58に○をいっぱいにオートシェイプで描く 同時にセルJ62のオートシェイプがあれば消す オプションボタン2を押す セルJ62に○をいっぱいにオートシェイプで描く 同時にセルJ58のオートシェイプがあれば消す これと同じ作業ができるシートを10枚作りたいのですが・・・ 各シートはリンクせず、シート内にそれぞれ2つのオプションボタンで対応したいのです。 とりあえず、下記コードを作ったのですが、他のPCですとセルからづれてしまうので セル内に収まるような最大の○を付したいので、どなたかご教授お願い致します。 Sub (1)オプション1_Click() ActiveSheet.Unprotect ActiveSheet.Shapes.AddShape(msoShapeOval, 185, 628, 45.5, 14.5).Select Selection.ShapeRange.Line.Weight = 1 Selection.ShapeRange.Fill.Visible = msoFalse With ActiveSheet For Each ob In .DrawingObjects If Not Intersect(ob.TopLeftCell, .Range("J62")) Is Nothing Then ob.Delete End If Next End With Range("J58").Select ActiveSheet.Protect End Sub

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

  • ベストアンサー
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.1

わかりやすいように書きましたが 実際は事前に変数化して使うと良いかと思います。 また複数シートを使うときなどのことも考えると rangeのところはその前にシート名をつけておくなどしてください。 "C5"を指定したところは書き換えてください。 ActiveSheet.Shapes.AddShape(msoShapeOval, Range("C5").Left, Range("C5").Top, Range("C5").Width, Range("C5").Height).Select また、その都度描いたり消したりするのはよくありません。 最初の1回だけ上記のようなコードか手作業で作成して その後はvisibleプロパティで表示・非表示を切り替えるのが良いでしょう。

9494786
質問者

お礼

早々のご回答、ありがとうございます。 ばっちり動きました。 ありがとうございました!

9494786
質問者

補足

VBA素人でして、仰っておられる内容が理解できません。 お手数ですが、詳しく教えて下さい。 ・「描いたり消したりするのはよくありません」とは、何故ですか? ・「visibleプロパティ」とは具体的にどのような方法で、どういった利点がありますか?

その他の回答 (1)

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.2

<<補足です>> ・「描いたり消したりするのはよくありません」とは、何故ですか?    ActiveSheetやSelectionを使うのなら別にかまわないといえば構わないのですが、    今後、高速で図を処理するときなどに困るからです。    ・「visibleプロパティ」とは具体的にどのような方法で、どういった利点がありますか?   その英語のままで、表示・非表示を切り替えるものです。    sheet1.shapes(1).visible=true 'false     のようにして使います。  そこで、下記のようにしておいて呼び出せば、呼び出すたびに表示・非表示が切り替わりますのでプログラムを書く面倒がなくなります。 sheet1.shapes(1).visible=not sheet1.shapes(1).visible

9494786
質問者

お礼

度々の質問にも関わらず、ご丁寧に回答いただき ありがとうございます。 しばらくPCから離れた環境にいた為、お礼が遅くなり失礼しました。 勉強になりました。 より高度なコードが書けるようがんばります!

関連するQ&A

  • えくせるまくろで。

    お世話になっております。 基礎的な質問かもしれませんが、、 さっきからうまくいってませんです。 セルに入力された値によって変化し、オートシェイプの→の端につなげて→をかきたいんですが、、、 line1 line2はすでにあるものとして、 Sub sample1() ActiveSheet.Shapes("Line 1").Select Selection.ShapeRange.Item("Line 1").Left = 258.75 Selection.ShapeRange.Item("Line 1").Width = 67.5 / 6 * Range("A1") hako1 = ShapeRange.Item("Line 1").Left + 67.5 / 6 * Range("A1") ActiveSheet.Shapes("Line 2").Select Selection.ShapeRange.Item("Line 2").Left = hako1 Selection.ShapeRange.Item("Line 2").Width = 67.5 / 6 * Range("A2") End Sub と、こうしてたんですが、。 オブジェクトが必要です。とアラームがでます。 どうしたらいいか教えてください。

  • Excel マクロ 任意のセルから実行したい

    こんにちは、Excel2003を使用しています。 ExcelでK55からE55までのセルの値を削除して(空白にして) それぞれに「---を引いた透明のダイアローグボックス」を コピーしていくマクロを作成したことがあります。 このときは開始するセルがK55と決まっていたのですが 今度は任意のセルから(たとえば選択したセルの右隣とか) 実行したいのですがどのようにマクロを作ればよいでしょうか ご存じの方お教えください。 なお参考に上記のマクロを記載します。 Range("E55:J55").Select Selection.ClearContents Range("H55").Select ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 672#, 729#, _ 81#, 13.5).Select Selection.Characters.Text = "" With Selection.Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.ShapeRange.Fill.Visible = msoFalse 'Selection.ShapeRange.Fill.Solid 'Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoFalse ActiveSheet.Shapes("Text Box 12").Select Selection.Characters.Text = "---" With Selection.Characters(Start:=1, Length:=3).Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With Selection.HorizontalAlignment = xlCenter Range("K55").Select ActiveSheet.Shapes("Text Box 12").Select Selection.Copy Range("I55").Select ActiveSheet.Paste Range("H55").Select ActiveSheet.Paste Range("G55").Select ActiveSheet.Paste Range("F55").Select ActiveSheet.Paste Range("E55").Select ActiveSheet.Paste Range("E56").Select Selection.Copy Range("F56:J56").Select ActiveSheet.Paste Application.CutCopyMode = False Range("E56:J56").Select Selection.Copy Range("E57:E59").Select ActiveSheet.Paste Application.CutCopyMode = False Range("K59").Select End Sub

  • VBAのGroup化について

    お世話になります。以下のマクロがうまく動きません。 ------------------------------------------------- Dim objShp1 As Shape For Each objShp1 In ActiveSheet.Shapes If objShp1.Name = "Picture 3" Then ActiveSheet.Shapes.Range(Array("A", "B", "Picture 3")).Select Selection.ShapeRange.Group.Select Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 Else ActiveSheet.Shapes.Range(Array("A", "B")).Select Selection.ShapeRange.Group.Select <---------(1) Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 End If Next ------------------------------------------------- このマクロは全体の一部分になりますが、(1)のところでエラーになります。 どこが間違っているのか、さっぱりわかりません。 すみませんが、お助けいただければ幸いです。

  • VBA シート上のボタンクリックしたら実行

    お世話になっております。 シート上に、予定1、予定2…        実際1、実際2… という名前で作成したオートシェイプがあります。 このオートシェイプをクリックしたら、 既にあるオートシェイプ(矢印)を消し、 オートシェイプ(矢印)を作成するというものをしたいと思っています。 -------------------------- Sub Test() Dim TESTShape As Shape Dim i As Long Dim j As Long j = 1 For i = 5 To 64 With ActiveSheet.Range("J" & i) If i Mod 2 = 1 Then '2で割って余りが1なら Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Fill.Visible = msoTrue TESTShape.Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = 41 TESTShape.Name = "予定" & j ' Else Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Name = "実際" & j ' j = j + 1 End If End With Next End Sub -------------------------- 上記プログラムで、シート上にボタンを作成しました。 そのシートに直接プログラムを書き込み? Private Sub 予定1_Click() MsgBox "TEST" End Sub と試してみていますが、オートシェイプから シートプログラム?の実行はできないのでしょうか。 このシートは色んなシートにコピーして使おうと思っているため、 ボタンをおしたら矢印を消したり、追加したりする動作も他のブックにコピーしたいと思っています。 そのためシートに書き込もうとしているのですが、上手く行かず… 根本的に、なにか間違っているかもしれません。 シートに書き込むプログラムをどう書くべきなのかあまり良くわかっておりません…。 シート上のボタンをクリックしたら実行できるのは、 標準モジュールに書き込んだプログラムのみなのでしょうか? 質問がわかりにくく、説明不足の点も多々あるかもしれません。 その場合は、どんどん聞いてください。お願いします。 回答お待ちしております。

  • VBAでオートシェイプのグループ化についての質問です。

    VBAでオートシェイプのグループ化についての質問です。 オートシェイプ線(Line)で台形を作成し全てを選択し、グループ化したいと考えています。 また、連続して台形を作成していきたいと考えています。 ?4本線を引く ?グループ化(Aグループ) ?4本線を引く ?グループ化(Aグループ)  ⇒ 連続して作成・・・ Dim st() As Variant Dim ob As Shape Dim MyLine As Shape '線の作成 Set MyLine = ActiveSheet.Shapes.AddLine(startX, startY, widthX, heightY) '線の選択 For Each ob In ActiveSheet.Shapes   ReDim Preserve st(j)   st(j) = ob.name   j = j + 1 Next ob 'グループ化 Worksheets("test").Shapes.Range(st).Select Selection.ShapeRange.Group.Select と上記コードで一つのグループは作成出来たのですが、次に作成すると Worksheets("test").Shapes.Range(st).Select Selection.ShapeRange.Group.Select でエラーになります。 恐らく前のグループ化内の線も選択してしまうのではないかと思っていますが、対処の仕方が解りません。 線の作成方法から選択方法等いろいろ意見が聞きたいと思っています。 アドバイスよろしくお願いいたします。 m(__)m

  • EXCELのVBAによる写真貼り付け時に重なる。

    VBAの初心者です。 エクセルに写真データを貼り付けるVBAで、以下のマクロを実行するとシートの同じセル位置B5に、写真が2枚重なった状態となります。 セルのB5とH5の位置に写真をそれぞれ貼りつけるために、どのように修正すればよいのでしょうか?ご教授ください。 OS:Vista ソフト:Excel2007 Sub 写真ファイル呼び出し() ' Sheets("風景1").Select Range("B5").Select ActiveSheet.Pictures.Insert(Worksheets("風景写真").Range("o4").Value).Select With Selection Selection.ShapeRange.LockAspectRatio = msoTrue '縦横比を固定するコマンド Selection.ShapeRange.Width = 245 '縦横比固定、幅のみを指定する End With 'Sheets("風景2").Select Range("H5").Select ActiveSheet.Pictures.Insert(Worksheets("風景写真").Range("o5").Value).Select With Selection Selection.ShapeRange.LockAspectRatio = msoTrue '縦横比を固定するコマンド Selection.ShapeRange.Width = 245 '縦横比固定、幅のみを指定する End With End Sub

  • 図形 Selectionが省略できない VBA

    「タイトル」という名の図形はシート上に存在するのですが、 Sub a() ActiveSheet.Shapes.Range(Array("タイトル")).ShapeRange.Height = 110 End Sub Sub b() ActiveSheet.Shapes.Range(Array("タイトル")).Select Selection.ShapeRange.Height = 110 End Sub aだとエラーになりますが、 bだと正常に動きます。 SelectやSelectionは省略できるものだと思ってるのですが なぜaだとエラーになるのでしょうか? 一度図形をアクティブにする動作が必要なのですか?

  • マクロでシート2~6のデータをシート1に転記したい

    マクロでシート2~6のデータをシート1に転記したいです。 シート2~6のデータを シート1に順番に転記したくてマクロの記録を利用して作成しました。 シート2~6は列は同じですが行数は異なります。 また行数は作業の都度異なります。 同じ記述が繰り返されているので もう少し記述が短くできるのではと思うのですが どうすればいいでしょうか? Sub データ更新() 'シート1の前回データをクリア Sheets("シート1").Select Range("A2:Q2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("A2").Select Sheets("シート1").Select Range("A1").Select Sheets("シート2").Select Range("A1").Select 'ヘッダーも合わせて取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート3").Select Range("A2").Select 'データのみ取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート4").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート5").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート6").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select End Sub

  • エクセル VBA 画像操作

    VBAについて質問です。 画像を何枚かを重ねて、シート上に置いてあります。 VLOOKUPにて、画像番号を獲得して、その番号の画像を最上面へ移動させたいのですが ActiveSheet.Shapes.Range(Array("Picture 201")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ActiveSheet.Shapes.Range(Array("Picture 221")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ActiveSheet.Shapes.Range(Array("Picture 215")).Select ActiveWindow.SmallScroll ToRight:=-342 Selection.ShapeRange.ZOrder msoBringToFront ("Picture 215")の部分を、セルの値で変更したいのですが どうか、お力お貸しください。 よろしくお願いします。

  • 複数のシートにまたがり、フィルタオプションの設定から値を抽出するマクロ

    複数のシートにまたがり、フィルタオプションの設定から値を抽出するマクロを組んでおります。 表示したくないシート(data,output)を非表示にしたら、エラーが出てしまいました。 非表示シートの状態で処理することはできませんでしょうか。 Sub Macro7() Application.ScreenUpdating = False Sheets("data").Select Columns("A:J").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Sheets("マップ").Range("E2:N3"), Unique:=False Columns("A:J").Select Selection.Copy Sheets("output").Select Range("A1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Copy Sheets("マップ").Select Range("E5").Select ActiveSheet.Paste Range("H4").Select Sheets("data").Select Application.CutCopyMode = False ActiveSheet.ShowAllData Sheets("マップ").Select End Sub

専門家に質問してみよう