• ベストアンサー

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で図面を書きたい」という質問をしたのですがややこしく書いたため解答される方が居ませんでしたので編集して再質問をさせていただきます。 よろしくお願いします。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

VBAで出来ると思いますし、もちろん他の言語でも可能でしょう。 質問で書かれたコード「Sub 三角形作成()」で kakusan_t さん自身が既に三角形を描画してますよね? あとは辺の長さや角度を指定するたびに、以前の図形を消してから三角形を書き直せば良いだけです。 ただ、角度が1度かわる毎に終点の座標をどれだけずらせば良いかなど、コンピューター上で座標に置き換える計算式を作る知識が必要で、これが簡単ではないと思います。(数学の知識がある方なら簡単かも知れませんけど) 本にずばりの例文があるようなものでは無いと思いますよ。 ちなみに 1.新規にExcelを開く 2.VB Editorを開く 3.VBE画面の挿入-ユーザーフォームでUserFormを作り、TextBoxを2つと、CommandButtonを1つ置く 4.CommandButtonをダブルクリックして下記をコピペ '----------------------------------------------------------------------------- Private Sub CommandButton1_Click() Dim x As Single, y As Single, sh As Shape  On Error Resume Next  x = CSng(TextBox1.Value)  y = CSng(TextBox2.Value)  With ActiveSheet   For Each sh In .Shapes     sh.Delete   Next sh   .Shapes.AddLine 10, 10, 200, 200   .Shapes.AddLine 200, 200, x, y   .Shapes.AddLine x, y, 10, 10  End With End Sub '----------------------------------------------------------------------------- 5.VBE画面の挿入-標準モジュールでModule1が追加されるので、下記をコピペ '----------------------------------------------------------------------------- Sub Test()   UserForm1.Show End Sub '----------------------------------------------------------------------------- 6.Excelに戻りツール→マクロ実行→Testを実行

kakusan_t
質問者

お礼

度重なる回答ありがとうございます。 回答のコードを試してみましたらちゃんと描けました。 この回答をヒントに自分なりにバージョンアップしてみました。 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 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 Private Sub Cmd終了_Click() Unload UserForm1 End Sub 見事に自分が思っていた図形が描けました。これが私が最初に質問した内容の答えです。 立ち上がりに20、幅に90、そして勾配の数字を5,6,7と変化させるとちゃんとそれに従って描く事が出来ます。 住宅の屋根の部材を描いています。 基準点を200、200にしないと立ち上がりと幅の数字によってはマイナスになってしまうことがわかり苦労しました。 見事に解決しました。 適切なアドバイス感謝いたします。

その他の回答 (7)

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

#3です。本質問の背後には、CAD的な使い方をしたいと言うことがあったのですね。それで納得しましたが、この質問にはそれらしきことは書いてなかったので。 エクセルは扱うのが数値・文字列型のソフトで、図形を扱うのは本旨でなく、今の路線で行くと、そのうち難しい局面になるでしょう。 VBAのAはForApplicationのAで、Aはこの場合はエクセルで、エクセルの機能・操作とべったりのもので、それだけにエクセルでは便利(VBなどで組むに比べ)ですが、逆にそれ以外の範疇のニーズには、足かせになるかもしれない。 例えばエクセルではセルという概念がじゃまして、マウスでポイントした場所に四角形を書けない(正確なポイントが出来ない。図形を載せる台紙として不完全です。)。使えるイベントも非常に貧弱です。 私もかって、住宅の間取り図をプログラムで自作できないか、夢想したことがありました。そうこうしているうちに、良いソフトが出たようで、立体図形・パースまで作るソフトも安価なのが出てきて、興味も消えました。 (1)まずご希望の機能のフリーやシェアウエアを探しましょう。現在は作ろうとすると、複雑な知識が必要になりすぎて手におえません。作るより既製のものを使う時代でしょう。 (2)まだ勉強し始めですがVISIOがマイクロソフト の製品にあり、システム設計文書などに使われています。 VBAもOffice製品の1つと言うことでしょうか、あるので、検討されてはいかがでしょう。エクセルよりは マシでは無いかと想像します。 (3)それにこう言うものを作ろうとしたとき、まず構成図(構想。仕組みの骨子のようなもの)がしっかりしてないと駄目だと思います。アルゴリズムよりもう少し上の概念のようなもの。共通のものが何で、特殊なものが何か関連はどうかと言うようなものです。それがないと、個別の特殊ケースの羅列になります。そう言うものの仕組みこそ本当は識者の批判の場に曝して良いものを作るべきと思いますが、OKWEBでは無理ですが、すでに出来あがってますか。 (4)こう言う件の解説や実例が載るとすれば、載りそうなのは、建築関係の雑誌か、「インターフェイス」誌や「トランジスタ技術」誌のレベルのような気がする。 APIの利用も避けて通れないのではないでしょうか。

kakusan_t
質問者

お礼

度重なる回答ありがとうございます。 かかれている内容はよくわかります。少々,私の記述が難しいものを要求しているように見えてしまったのかなと思っています。 おかげさまで今回の質問は6番の方のアドバイスで解決しました。 私の6番の方へのお礼に書いてあるコードを試してみてもらえれば、以外にも簡単な内容のことをしたかったのだと言うことがわかると思います。 VISIOは今回、試行錯誤している中で知りました。しかし、少々,高価ですのでDelphi、C++Builderなどの低価格のソフトを使っていきたいと思っています。

回答No.7

> Private Sub UserForm_Initialize() > Dim x As Integer > Dim y As Integer > x = TextBox1.Text > y = Textbox2.Text > End Sub > こんな風にしましたらデバックで「型が違います」と出ます。 「データの型」が合っていないから当然です。 x,yはInteger型なのに、TextBox1.Text,Textbox2.Textはテキスト型(String型)なのでエラーになります。 この場合、Val関数を使ってString型を数値に変換すればOKです。 x = Val(TextBox1.Text) Val関数を使えば、TextBox1.Textが数値に変換できない値の場合(例えば数字以外の文字や空白)に0になるのでエラー処理が省けます。 (CInt関数やCLng関数の場合は変換できないとエラー処理が必要になる。)

kakusan_t
質問者

お礼

回答ありがとうございます。 データの型のアドバイスありがとうございます。 VBAの本を見ていると一番最初に出てくるのがこの部分なんですよね、 一番、イメージとして理解しにくい部分です。つい読み飛ばしてしまう部分です。 勉強させていただきます。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

#2です。 > 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける > →Excelに戻り、ツール→マクロ実行→Sheet1.Testを実行 手順が違います。 Sheet1.Test って事は、Sheet1のモジュールに貼り付けてます。 #2の回答の通り「標準モジュール」に貼り付けてください。 1.新規にExcelを開く 2.VB Editorを開く 3.VBE画面の挿入-標準モジュールでModule1が追加されるので、ここに#2のコードをコピペ 4.Excelに戻りツール→マクロ実行→Testを実行

kakusan_t
質問者

お礼

深夜の回答ありがとうございます。 標準モジュールに貼り付けて実行したところ見事に出来ました。 このコードはかなり使えそうです。 標準モジュールということが良く理解できなかったのが原因です。本の抜粋ばかり見てましたので基本が出来て居ないんですよね。 最終的にはいろいろな形に変形したいのでコードを分析して応用したいと思います。

kakusan_t
質問者

補足

Excel VBAを使い、個人で開発したフリーソフトが公開されていますが「こんなこと良く出来るな」と思うソフトがあります。 VBAと言えどもかなりのことは出来るのではないかと思います。 本屋をあちこち回り図形を変化させることが書いてある本を探したのですが、単に線を引くことや四角を描くことデータベースを作ることが書かれているのが大半でした。 C++で大半のことが出来ると言うことなのでソフトを購入したのですが肝心の解説書が図形を変化させるというプログラムが書かれている物は皆無でした。 やはり、データベース中心です。 でも、CAD自体がC++で出来ていることもあるので可能だと思いますし、期待しています。 「私が探しているものはデータベースではなくて図形を自在に描ける方法なんです....残念!  斬り!」 と言う心境でしょうか。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#2です。 > の部分で「型が一致しません」というデバックがでます。 こちらではExcel97とExcel2000で正常動作しますが、、、 新規ブックでやってますか? myCallerの中身を下記にした場合に 「Visual Basic を呼び出した方法 = フリーフォーム1」 とメッセージボックスが出ますか? Private Sub myCaller()  Select Case TypeName(Application.Caller)   Case "Range"     v = Application.Caller.Address   Case "String"     v = Application.Caller   Case "Error"     v = "エラー"   Case Else     v = "不明です"  End Select  MsgBox "Visual Basic を呼び出した方法 = " & v End Sub

kakusan_t
質問者

補足

ありがとうございます。 再度,チャレンジしたのですがだめでした。 私の試みた方法ですが 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Excelに戻り、ツール→マクロ実行→Sheet1.Testを実行→三角形表示→三角形をクリック→マクロ‘Book1!MyCallerが見つかりません‘とダイアログボックスが出てエラー (2回目の回答もこのような結果になりました) もう一つは 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Editer内でマクロ実行→InputBoxを表示→数字をX,Yに入れる→型が一致しませんとデバックエラー 明日、またトライしてみます。

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

本OKWEBで解答がない(極少ない)理由は、過去の質問を読んでいる経験から私の思うところ (1)内容が難しい(解答できる人が少なさそう) (2)何か(学校など)の課題を丸投げ的に見える (3)質問の文章表現が判り難いとか、解答を具体的に書くのに必要な条件を記してない (4)フル解答を上げるとすると、解答書き込みに時間がかかりそう (5)物理や数学などに関した質問 >解答される方が居ませんでしたので 本件は(2)と(4)とやや(3)ではないかと思う。 さて本題に入ると ●(A)辺の長さなど数量的なものはテキストボックスに入力させる (B)図形の種類などはコードででも指定させる そしてそれらをパラメータ(引数)にして(どんな図形を書くのか質問に1種しか書いてないが)、図形描画ルーチンを作っておいて、そこに渡せば(飛べば)良い。 数量はLong型が多い。 ●多角形を各直線で組みたてるので無く、オートシェイプにあるものは、出来るだけそれを指定してVBAで使う。AddLine3つでなく ActiveSheet.Shapes.AddShape(msoShapeIsoscelesTriangle, 150#, 59.25, 42.75, ・・のようにTriangleを使う方が良いのでは。 どう言う種類の多角形や図形を描かせるかにより(ここが具体的に書いてないし、書かれても長いコーディングになってしまう(上記の(4)です)ので解答は具体的にならない。 大きさだけを変化させるのでしょうか。 ビシネスには関係ない課題のようですが、何に使えるのだろうか。 何が難しいのか、判らないのか、質問を読んだものに判り難い質問です。 もうすぐ近くまで判っている(「ユーザーインターフェースを作り、テキストボックスに値を入れることで」) のに、どうして「以下のようにして変数(x、y)にユーザーインターファースから値を代入するようにしたいのですがどのようにすればよいのでしょうか」と言う質問になるのか判らない。

kakusan_t
質問者

お礼

回答ありがとうございます。 >どのようにすればよいのでしょうか」と言う質問になるのか判らない。 そうですね。変数が良くわかっていないのが原因です。一旦わかればかなり応用が利くと思うのですが。 何冊も本を見比べているのですがなかなかこの問題に直結するものがなくて。 言い訳ばかりですみません。

kakusan_t
質問者

補足

>ビシネスには関係ない課題のようですが、何に使えるのだろうか。 ということにお答えします。私は建築関係の仕事についています。 JWWのようにフリーのCADや100万円するCADを使っています。JWWはお絵かきCADです。(しかし、その実力とシェアには敬意を表します。)。100万円するCADは建築の間取りを描いたり、プレゼンテーションが半自動で出来ます。 しかし、建築物の詳細となりますとほとんどフリーハンド状態でJWWなどのお絵かきCADを使って描きます。部材の発注にも詳細図を描いて使います。 そこでいつも悩むのが、自分でプログラム出来る簡易CADというものがないかということです。AutoCadにそれらしきものがあると言うことがわかったのですがそこまで投資しなくてもと言う考えがあります。 実際はExcelに絵を描いておき、シートのセルにある寸法を入れると絵の線の脇のおのおののセルに数値が計算されて入ると言う図面を書いて使っています。 なにぶんにも数値を入れても動かない絵ですので、怪しいときはCADで描きます。そこで手間を省くためにVBAを使って数値で変わる絵が描けないかと思ったわけです。 いろいろ調べたのですが、世の中にもう少し、「図形を描くプログラムする本」などという本があればなと思っています。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

たぶん前の質問も読んだと思いますが、CADでやった方が良いと感じましたのでレスしませんでした。 ご希望と違いますので参考程度に見てください。 新規ブックの標準モジュールに下記をコピペします。 1.マクロ「Test」を実行すると三角形を書きます。 2.その三角形をクリックするとインプットボックスが出ます。 3.作成した三角形の2つ目の接点座標をx,yで指定すると変化します。 '----------------------------------------------------------------------------- Sub Test() Dim ffb As FreeformBuilder, sh As Shape  Set ffb = ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 9.75, 9.75)  With ffb    .AddNodes msoSegmentLine, msoEditingAuto, 200.25, 200.25    .AddNodes msoSegmentLine, msoEditingAuto, 99.75, 399#    .AddNodes msoSegmentLine, msoEditingAuto, 9.75, 9.75    Set sh = .ConvertToShape    sh.OnAction = "myCaller"  End With End Sub '----------------------------------------------------------------------------- Private Sub myCaller() Dim sh As Shape, x As Single, y As Single  x = Application.InputBox("x座標を指定", "座標指定", Type:=1)  y = Application.InputBox("y座標を指定", "座標指定", Type:=1)  Set sh = ActiveSheet.Shapes(Application.Caller)  sh.Select  Selection.ShapeRange.Nodes.SetPosition 2, x, y  sh.TopLeftCell.Activate End Sub

kakusan_t
質問者

お礼

回答ありがとうございます。 さっそく試してみたのですが Set sh = ActiveSheet.Shapes(Application.Caller) の部分で「型が一致しません」というデバックがでます。 Excel97、Excel2002ともだめでした。 しかし、三角形はちゃんとかかれています。 InputBoxという手があることには気が付きませんでした。 回答のコードは私にはなかなか難しいですが勉強になります。

回答No.1

ユーザーフォームにX軸用のテキストボックス(textbox1)とY軸用のテキストボックス(textbox2)を配置します。 そして、SUB 三角作成の最初の行に X=textbox1.text Y=textbox2.text とすればいいのではないでしょうか? はずしています?

kakusan_t
質問者

お礼

回答ありがとうございます。 そうですね。私も最初はそうではないのかと思い試してみたのですがうまくいかなくて。 Private Sub UserForm_Initialize() Dim x As Integer Dim y As Integer x = TextBox1.Text y = Textbox2.Text End Sub こんな風にしましたらデバックで「型が違います」と出ます。 回答のように三角形作成の最初の行に X=textbox1.text Y=textbox2.text と入れて試したのですがデバックで「オブジェクトがありません」と出ます。 そういえばシートに貼り付けたコマンドボタンを押してユーザーインターフェースを表示させ、テキストボックスに値を入れても図形を書く何らかのコマンドボタンが無ければ図形を書いてくれないなと思いました。 一連の作業をプログラムすることが出来ないと動かすのは難しいなと感じています。 もう少し知恵をお貸しください。

関連するQ&A

  • 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と認識してしまうらしく、線と一緒に消されてしまいます。 この問題を解決できるコードを教えてもらいたいのですが。 よろしくお願いします。

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

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

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • 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のチェック項目が多数あります。チェック項目は図形を表示と非表示です。何方か良い方法がありましたら教えて頂けないでしょうか。宜しくお願いします。

  • 図形 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だとエラーになるのでしょうか? 一度図形をアクティブにする動作が必要なのですか?

  • 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での図形削除について質問です。

    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に詳しい方、アドバイスよろしくお願いいたします。

  • [エクセル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では角度はどっち回りですか?

    VBAでインボリュート曲線を描画するプログラムを書いたのですがなぜか時計回りになってしまいます。 自分は角度は3時の方向から反時計回りで増えていくと思っているのですがVBAでは逆回転なのでしょうか。 どっち回りか教えてください。 参考に作ったプログラムを書きます Sub インボリュート() '---------変数の宣言 Dim x1 As Double Dim y1 As Double Dim x2 As Double Dim y2 As Double Dim pai As Double Dim R As Integer '半径 Dim L As Double '-----値を初期設定 R = 50    L = 0 pai = 3.1415926535897 For θ = 0 To 3 * pai Step (pai / 1000) L = θ * R x1 = R * Cos(θ) y1 = R * Sin(θ) x2 = x1 + L * Cos(θ + 3 / 2 * pai) y2 = y1 + L * Sin(θ + 3 / 2 * pai) '---------シート上に図形を描画する ActiveSheet.Shapes.AddShape msoShapeOval, 500 + x1, 500 + y1, 1, 1 ActiveSheet.Shapes.AddShape msoShapeOval, 500 + x2, 500 + y2, 1, 1 Next θ End Sub ちなみにExcel2000です

  • エクセルで簡単なオートシェイプのマクロをつくりました マクロの実行とステップごとの実行の結果がちがってしまいます

    オートシェイプを使った簡単な寸法線の入った図をマクロで書きました。 ステップごとだと期待どおりのアウトプットなのですが、ダイレクトにマクロを実行すると途中のステップがとんでしまうようです。 どうしてでしょうか。 教えてください。 1 Sub 寸法線1() 2 Dim l1, l2, l3, l4, lb, la1, la2, fig1, fig2, fig3, fig4 As Shape 3 x1 = 200 4 y1 = 500 5 x2 = x1 + 100 6 k = Cells(7, 5).Value / Cells(7, 4).Value 7 y2 = y1 - 100 * k 8 Set l1 = ActiveSheet.Shapes.AddLine(x1, y1, x2 + 20, y1) 9 Set l2 = ActiveSheet.Shapes.AddLine(x1, y1, x1, y2 - 15) 10 Set lb = ActiveSheet.Shapes.AddLine(x1, y1, x2, y2) lb.Line.Weight = 2# 11 Set l3 = ActiveSheet.Shapes.AddLine(x2 + 5, y2, x2 + 20, y2) 12 Set l4 = ActiveSheet.Shapes.AddLine(x2, y2 - 5, x2, y2 - 15) 13 Set la1 = ActiveSheet.Shapes.AddLine(x2 + 12.5, y1 - 2, x2 + 12.5, y2 + 2) 14 la1.Line.BeginArrowheadStyle = msoArrowheadTriangle 15 la1.Line.BeginArrowheadLength = msoArrowheadLengthMedium 16 la1.Line.BeginArrowheadWidth = msoArrowheadWidthMedium 17 la1.Line.EndArrowheadStyle = msoArrowheadTriangle 18 la1.Line.EndArrowheadLength = msoArrowheadLengthMedium 19 la1.Line.EndArrowheadWidth = msoArrowheadWidthMedium 20 Set la2 = ActiveSheet.Shapes.AddLine(x1 + 2, y2 - 10, x2 - 2, y2 - 10) 21 la2.Line.BeginArrowheadStyle = msoArrowheadTriangle 22 la2.Line.BeginArrowheadLength = msoArrowheadLengthMedium 23 la2.Line.BeginArrowheadWidth = msoArrowheadWidthMedium 24 la2.Line.EndArrowheadStyle = msoArrowheadTriangle 25 la2.Line.EndArrowheadLength = msoArrowheadLengthMedium 26 la2.Line.EndArrowheadWidth = msoArrowheadWidthMedium 27 Set fig1 = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ x1 - 10, y1 + 5, 17, 17) 28 fig1.Select 29 Selection.Characters.Text = Str(Cells(6, 3)) 30 Selection.Characters.Font.Bold = True 31 Selection.ShapeRange.Line.Visible = msoFalse 32 Set fig2 = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ x2 + 5, y2 - 20, 18, 18) 33 fig2.Select 34 Selection.Characters.Text = Str(Cells(7, 3)) 35 Selection.Characters.Font.Bold = True 36 Selection.ShapeRange.Line.Visible = msoFalse 37 Set fig3 = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _ x1 + (x2 - x1) * 0.5 - 13, y2 - 32, 45, 17) 38 fig3.Select 39 Selection.Characters.Text = Str(Cells(7, 4)) 40 Selection.ShapeRange.Line.Visible = msoFalse 41 Set fig4 = ActiveSheet.Shapes.AddTextbox(msoTextOrientationUpward, _ x2 + 15, y1 - 0.5 * (y1 - y2) - 8, 17, 45) 42 fig4.Select 43 Selection.Characters.Text = Str(Cells(7, 5)) 44 Selection.ShapeRange.Line.Visible = msoFalse 45 MsgBox "pause" 46 Call l1.Select 47 Call l2.Select(False) 48 Call l3.Select(False) 49 Call l4.Select(False) 50 Call lb.Select(False) 51 Call la1.Select(False) 52 Call la2.Select(False) 53 Call fig1.Select(False) 54 Call fig2.Select(False) 55 Call fig3.Select(False) 56 Call fig4.Select(False) 57 MsgBox "hit any" 58 Selection.ShapeRange.Group.Delete 59 End Sub Cells(7, 5)=50 cells(7,4)=100 cells(6,3)=1 cells(7,3)=2 です。 左端に行番号をふってあります。 36から44まで飛んでしまいます。 節点 座標 X Y 1 0 0 2 100 50