• ベストアンサー

EXCEL VBA で自在に図形を変化させたい(2)

前回,質問させてもらい、非常に役に立つ回答をもらい解決しました。 今回、いろいろ本を見ても解決できない問題がありましたので再度質問をします。 EXCEL上にコマンドボタンを一つ配置します。右クリック→プロパティ→オブジェクト名をCmd作図に変更しておきます。 デザインモードでボタンをダブルクリックしてVBEでコード表示にします。 Private Sub Cmd作図_Click() ActiveSheet.Shapes.AddLine 200, 200, 400, 400 End Sub これでEXCEL上のコマンドボタンを押すと直線が作図できます。 次にAddLine以下の数字を変えて再度実行しますと別の直線がかけるのですが最初の直線が残ったままですので重なったりします。 前回、回答では Private Sub Cmd作図_Click() With ActiveSheet For Each Sh In .Shapes Sh.Delete Next Sh ActiveSheet.Shapes.AddLine 200, 200, 400, 400 End With End Sub という回答をもらっています。こうすれば前回描いた線を消してから作図できます。 しかし、前回は「マクロの実行」ボタンからの作図でしたので問題にはならなかったのですが、今回、EXCEL上にコマンドボタンを配置したところ、コマンドボタンもShapesと認識してしまうらしく、線と一緒に消されてしまいます。 この問題を解決できるコードを教えてもらいたいのですが。 よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#5です。消すだけならPublicを使って凌ぎました。 x,y,zは勝手な値を入れました。 Public a, b, c, d As String Private Sub CommandButton1_Click() Dim x As Single, y As Single, z As Single, Sh As Shape On Error Resume Next x = 100 y = 50 z = 200 With ActiveSheet a = .Shapes.AddLine(200, 200, 200, 200 - x).Name b = .Shapes.AddLine(200, 200 - x, 200 + y, 200 - x - y * (z / 10)).Name c = .Shapes.AddLine(200 + y, 200 - x - y * (z / 10), 200 + y, 200).Name d = .Shapes.AddLine(200 + y, 200, 200, 200).Name End With End Sub Private Sub CommandButton2_Click() If a = "" Then Exit Sub Else With ActiveSheet .Shapes(a).Delete .Shapes(b).Delete .Shapes(c).Delete .Shapes(d).Delete a = "": b = "": c = "": d = "" End With End If End Sub

kakusan_t
質問者

お礼

何度も回答ありがとうございます。 早速,試してみました。 EXCEL上のコマンドボタンを消さずに見事に図形を消すことが出来ます。 ただ、一点、気になるのが最初にEXCELを開き描画した後、必ず削除ボタン(CommandButton2のことです)で消してから描画しないと前の描画が消えなくなってしまうことです。 メッセージボックスなどで警告すればいいのかなと思っています。 しかし、これで一件落着です。 ありがとうございました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#2です。補足に関して。 a,b,c,dmは Private Sub Cmd描画_Click() End Sub の中で使えるが、そこを抜けて 別のモジュール Private Sub Cmd削除_Click() End Sub では、何の意味もなく、使えないのではないですか。 取りあえず。 引数で渡せるかどうか。 また蛇足ですが、この辺の数の型はLongが多いようですからマニュアルを見てください。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.4

こんにちは。 >多分、コマンドボタン以外(英語のEXCEPTのような)は消します。という条件文が必要なのではないかと思うのですが それが、 If sh.name <> "Cmd作図" then これですよ。(^^;;; それはそうとして、おかしいですねぇ。 当方回答する時は一応動作確認の上で回答しているんですが。 それに最初の質問ではユーザーフォームもないし描画コマンドないし・・・・。(^^;;; で、再度ユーザーフォーム、描画用コマンドボタン等同じ条件でテストしてみましたが、ちゃんと動作します。 考えられることは、シート上のコマンドボタンのオブジェクト名(Cmd作図)が、IF文で比較している名前と微妙に違うのではありませんか。 If sh.name <> "Cmd作図" のように、"Cmd作図" となってますか? ーーーーーーーーーーーーーーーーーーーーーーーーー Private Sub Cmd描画_Click() Dim x As Single, y As Single, z As Single, Sh As Shape On Error Resume Next x = CSng(Text立ち上がり.Value) y = CSng(Text幅.Value) z = CSng(Text勾配.Value) With ActiveSheet For Each Sh In .Shapes If Sh.Name <> "Cmd作図" Then Sh.Delete End If Next Sh .Shapes.AddLine 200, 200, 200, 200 - x .Shapes.AddLine 200, 200 - x, 200 + y, 200 - x - y * (z / 10) .Shapes.AddLine 200 + y, 200 - x - y * (z / 10), 200 + y, 200 .Shapes.AddLine 200 + y, 200, 200, 200 End With End Sub ーーーーーーーーーーーーーーーーーーーー 以上です。

kakusan_t
質問者

お礼

何度も回答ありがとうございました。 昨日より暇を見てはトライしているのですがだめでした。 しかし、コードにつきましてはたいへん勉強させていただきました。(今も勉強中です。 笑) このコードが利用できればimogasiさんの回答と合わせて2つの有効なコードがわかったことになります。 この場を借りてお礼申し上げます。

kakusan_t
質問者

補足

再度、回答ありがとうございます。 いろいろ試したのですがやはり消えてしまいます。 EXCEL上にコマンドボタンを貼り付けダブルクリックでコードに UserForm1.Show オブジェクト名ははCmd作図に直してあります。 Cmd作図ボタンを押すとUserForm1がEXCEL上に現れ、立ち上がり、幅、勾配をそれぞれ20,90,5と入力して描画ボタンを押すと図形は作図されます。 そして前に描いてあった図形も消えています。 ここまでは予定どおりなのですがCmd作図ボタンもDeleteされてしまいます。 う~ん、何かが違うのですかね。 ひょっとしてコードのウィンドウがUseForm1(描画ボタンのコードが書かれている)とSheet1(作図ボタンのコードが書かれている)の2つ別々だからですかね。

  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

おはようございます。 シートに図形を貼り付けるとなかなかですよねぇ。(^^;;; コマンドボタンCmd作図を消したくなければ Private Sub Cmd作図_Click() With ActiveSheet  For Each Sh In .Shapes   If sh.Name <> "Cmd作図" Then     sh.Delete   End If  Next Sh  ActiveSheet.Shapes.AddLine 200, 200, 400, 400 End With End Sub それから、シートに四角、円等など色んな図形を描きそれがどんな名前になっているか調べて、今回のようにその名前を利用すると簡単便利になりますよ。 調べるには例えば下記のようなコード。 Sub Test()  Dim Shp As Object  For Each Shp In ActiveSheet.Shapes   MsgBox Shp.Name  Next Shp End Sub 以上です。  

kakusan_t
質問者

補足

回答ありがとうございます。 試してみたのですが残念ながらコマンドボタンが消えてしまいます。 多分、コマンドボタン以外(英語のEXCEPTのような)は消します。という条件文が必要なのではないかと思うのですが。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

下記を参考に考えてください。 Sub test02() For i = 1 To 5 x = ActiveSheet.Shapes.AddLine(100 + i * 50, 100, 100 + i * 50, 200).Name MsgBox "次へ" ActiveSheet.Shapes(x).Delete Next i End Sub 移りが早いと確認がしにくいのでMsgBoxを途中に入れてます。 縦棒が右に動くように見えるのが確認できます。 その前の直線は消えています。 AddとNameが同時に出来てしまうこと Nameで指定したいShapesの特定が出来てしまうこと がミソです。

kakusan_t
質問者

補足

回答ありがとうございます。 良いヒントと感じましたの応用してみました。 1番の方の補足の欄に記入しましたUserForm1に削除ボタンを追加しました。 描画ボタンで作図後、別の図面を描くときは削除ボタンで消します。 削除ボタン無しで古い図形が自動的に削除出来ればよかったのですが...。 プログラムは以下の通りです。 Private Sub Cmd描画_Click() Dim x As Single, y As Single, z As Single, Sh As Shape On Error Resume Next x = CSng(Text立ち上がり.Value) y = CSng(Text幅.Value) z = CSng(Text勾配.Value) With ActiveSheet a = .Shapes.AddLine(200, 200, 200, 200 - x).Name b = .Shapes.AddLine(200, 200 - x, 200 + y, 200 - x - y * (z / 10)).Name c = .Shapes.AddLine(200 + y, 200 - x - y * (z / 10), 200 + y, 200).Name d = .Shapes.AddLine(200 + y, 200, 200, 200).Name End With End Sub Private Sub Cmd削除_Click() With ActiveSheet .Shapes(a).Delete .Shapes(b).Delete .Shapes(c).Delete .Shapes(d).Delete End With End Sub 残念ながらエラーになります。 .Shapes(a).Delete のところでデバックします。

  • hogehage
  • ベストアンサー率50% (54/107)
回答No.1

For Each Sh In .Shapes を For Each Sh In .Lines とすれば、削除対象はラインだけになります。

kakusan_t
質問者

補足

回答ありがとうございます。 質問の内容では確かに出来ました。 しかし、以下のプログラムだと元の線が消えません。 Private Sub Cmd作図_Click() UserForm1.Show End Sub Private Sub Cmd描画_Click() Dim x As Single, y As Single, z As Single, Sh As Shape On Error Resume Next x = CSng(Text立ち上がり.Value) y = CSng(Text幅.Value) z = CSng(Text勾配.Value) With ActiveSheet For Each Sh In .Lines Sh.Delete Next Sh .Shapes.AddLine 200, 200, 200, 200 - x .Shapes.AddLine 200, 200 - x, 200 + y, 200 - x - y * (z / 10) .Shapes.AddLine 200 + y, 200 - x - y * (z / 10), 200 + y, 200 .Shapes.AddLine 200 + y, 200, 200, 200 End With End Sub UserForm1には「立ち上がり」、「幅」、「勾配」のテキストボックスとCmd描画のコマンドボタンが配置されています。

関連するQ&A

  • Excel VBA で自在に図形を変化させたい

    Excel VBAを使って図形を自由に変化させたいと思っています。 一つの形の四角形や三角形をVBAを使ってシート上に表記することは出来ます。 私はユーザーインターフェースを作り、テキストボックスに値を入れることで図形を変化させることをしたいと思っています。 例えば、一つの三角形を正三角形にしたり、直角二等辺三角形にしたり、自在に角度を変えてVBAに描かせたいと思っています。 三角形は以下のようにコードを記述しましたらシートに表示できました。 Sub 三角形作成() Set ArwLine = ActiveSheet.Shapes.AddLine(10, 10, 200, 200) Set ArwLine = ActiveSheet.Shapes.AddLine(200, 200, 100, 400) Set ArwLine = ActiveSheet.Shapes.AddLine(100, 400, 10, 10) End Sub これを以下のようにして変数(x、y)にユーザーインターファースから値を代入するようにしたいのですがどのようにすればよいのでしょうか教えてください。 Private Sub CommandButton1_Click() UserForm1.Show End Sub Sub 三角形作成() Set ArwLine = ActiveSheet.Shapes.AddLine(10, 10, 200, 200) Set ArwLine = ActiveSheet.Shapes.AddLine(200, 200, x, y) Set ArwLine = ActiveSheet.Shapes.AddLine(x, y, 10, 10) End Sub 前回、「Excel VBAで図面を書きたい」という質問をしたのですがややこしく書いたため解答される方が居ませんでしたので編集して再質問をさせていただきます。 よろしくお願いします。

  • EXCEL VBAで自在に図形を変化させたい。

    今回の質問は図形に寸法値を入れるために基礎学習として簡単なマクロを作った件についてです。 シート上のコマンドボタンでフォームを呼び出し、文字の位置(100とか)を入力し、数字等文字を打ち込むと 打ち込んだ文字がその位置に表示されるというものです。 Private Sub Cmd文字表示_Click() Dim x As Single, y As Single, Sh As Shape On Error Resume Next x = CSng(Text位置A.Value) y = CSng(TextBox1.Value) With ActiveSheet For Each Sh In .Shapes If Sh.Name <> "Cmd文字入力" Then Sh.Delete End If Next Sh .Shapes.AddTextbox(msoTextOrientationHorizontal, x, x, _ x, x).Select End With With Selection.ShapeRange .Fill.Visible = msoFalse .Fill.Transparency = 0# .Line.Weight = 0.75 .Line.DashStyle = msoLineSolid .Line.Style = msoLineSingle .Line.Transparency = 0# .Line.Visible = msoFalse End With Selection.Characters.Text = "y" 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 End Sub 文字位置を自由に変えることは出来ますが打ち込んだ文字に変化させることが出来ません。 簡略的なコードや文字を表示させるには別の方法があるという方がいましたらご教示お願いします。

  • Excel(VBA)シート上のコマンドボタンクリック時に

    Sheet1に配置したのコマンドボタン(cmd1)を押した時に, Sheet2上に配置したコマンドボタン(cmd2)を押した時と 同じ処理を走らせたいのですが。 Sheet2に、 Private Sub cmd2_Click() MsgBox"処理が走りました" End Sub Sheet1に、 Private Sub cmd1_Click() WorkSheets("Sheet2").Shapes("cmd2").??? End Sub ???に色々候補があがりますが、この候補の中のどれかを使うことは可能ですか? Sheet2の cmd2_Click() 以下の処理を、標準モジュールに書いて呼ぶしかないのかと 思ったのですが、直接、cmd1_Click() から cmd2_Click()の処理を呼べたらいいなぁと 思って質問させて頂きました。 可能か、不可能か教えてください。 バカな質問だということは心得ておりますが、当方、初心者ゆえ何分お許し下さい。 Ver.2000

  • Excel VBAでの図形削除について質問です。

    Excel VBAでの図形削除について質問です。 ボタンをクリックすると、ラインを使って、直角三角形を作成できる様にしました。 その際に、画像を全て削除してから作成する様にしました。 しかし、コマンドボタンまで消えてしまい困っています。 Dim MyLine As Shape Dim rngStart As Range, rngEnd As Range Dim BX As Double, BY As Double, EX As Double, EY As Double Dim dellShape As Object Set dellShape = ActiveSheet dellShape.Shapes.SelectAll 'すべての図形を選択する Selection.Delete '現在選択されているオブジェクトを削除する 'Shapeを配置するための基準となるセル Set rngStart = Range("C30") Set rngEnd = Range("J11") 'セルのLeft、Top、Widthプロパティーを利用して位置決め BX = rngStart.Left BY = rngStart.Top EX = BX + 300 EY = BY + 0 'Shapeの描画 Set MyLine = ActiveSheet.Shapes.AddLine(BX, BY, EX, EY) '横幅 Set MyLine = ActiveSheet.Shapes.AddLine(EX, EY, EX, 200) '高さ Set MyLine = ActiveSheet.Shapes.AddLine(BX, BY, EX, 200) '斜辺 これで?削除?作図と出来るのですが、作図された図形をDeleteキーで手動で削除した後に、 もう一度コマンドボタンをクリックすると、コマンドボタンまで削除されてしまいます。 通常ではコマンドボタンは削除されないので、原因が解りません。 同じ経験をされた方や、ExcelVBAに詳しい方、アドバイスよろしくお願いいたします。

  • VB6 オートシェイプ描画

    VB6 オートシェイプ描画 VB6でExcel,2000(ActiveSheet)にオートシェイプを使用したいのですが、エラーが出てしまいます。 コマンドボタンクリック時、エラー ------------------------------- 実行時エラー'1004': 指定された値は境界を超えています。 ------------------------------- AddLineは出来たのですが四角や円がこのエラーです。どこが間違えているのでしょうか? 宜しくお願いします。 Private Sub CB13_Click() Dim xlApp As Excel.Application Set xlApp = GetObject(, "Excel.Application") xlApp.ActiveSheet.Shapes.AddLine 50, 50, 100, 100 '(OK) xlApp.ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100).Select '(NG) Set xlApp = Nothing End Sub

  • エクセルの図形(線)の情報

    シート内に作図されている線の情報を調べるにはどうすればいいのでしょうか? 下記のX1~Y2の値が知りたいのですが。 ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2).Select あくまでも既に存在している線が対象です。 よろしくお願いします。

  • EXCEL VBA これであっていますか?

    エクセルに地図を貼り付け、その中のある地点Aから半径1キロ、2キロ、3キロといった具合に円を描いています。ある地点B、Cも同様に円があります。セルに“A” と入力した際に該当する地点の円(1キロ、2キロ、3キロの3種類)を赤く表示し、終了すると円が消える(線なしに変わる)ようにするために以下のようなVBAを組みました。が、円が2つしか赤くならなかったり、 ばあいによっては「インデックスが境界を超えています」とエラーが出たりします。 どうしたら良いか教えてください。 Sub iro() Dim i As Variant i = InputBox("表示する地点を指定してください", "地点指定") If i = "A" Then ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False modosu ElseIf i = "B" Then ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False Else MsgBox "指定した地点がありません", vbOKOnly End If End Sub Sub hyoji() Selection.ShapeRange.Line.Visible = msoTrue '「線なし」に設定されている場合、線を表示 Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 Range("A1").Select End Sub Sub modosu() Selection.ShapeRange.Line.Visible = msoFalse '「線なし」に設定 Range("A1").Select End Sub

  • excel VBA 作成したUserFormにoptionButton

    excel VBA 作成したUserFormにoptionButtonを多数配置しています。このUserFormをワークシート上に再表示すとる、チェック項目に入力したチェックが消えてしまいます。消えない方法が解りません。 private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=False '図形1表示 End sub private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=True  '図形1非表示 End sub  同様な書式で数項目あります。 又、保存したワークシートを読み込んだ場合も同様に出来ないでしょうか。optionButtonのチェック項目が多数あります。チェック項目は図形を表示と非表示です。何方か良い方法がありましたら教えて頂けないでしょうか。宜しくお願いします。

  • [エクセル2007] 図形を非表示にするマクロ

    図形「図A」を非表示にするマクロがあります。 Sub 図削除() ActiveSheet.Shapes("図A").Visible = False End Sub これを図A、図B、図C・・・・・・と増やしていく場合はどうすれば良いのでしょうか? Sub 図削除() ActiveSheet.Shapes("図A").Visible = False ActiveSheet.Shapes("図B").Visible = False ActiveSheet.Shapes("図C").Visible = False            ・            ・             ・ End Sub とするしかないのでしょうか?

  • エクセルVBAの構文。 どこが間違っているのでしょうか?

    以下の2つは同じ意味だと思うのですが、test2はエラーになります。どうしてなのでしょうか? Sub test1() ActiveSheet.Shapes.AddShape(msoShapeRectangle, 300#, 100#, 140#, 80#).Select Selection.Formula = "$A$1" End Sub Sub test2() With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 300#, 100#, 140#, 80#) .Formula = "$A$1" End With End Sub

専門家に質問してみよう