- ベストアンサー
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で図面を書きたい」という質問をしたのですがややこしく書いたため解答される方が居ませんでしたので編集して再質問をさせていただきます。 よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
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を実行
その他の回答 (7)
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。本質問の背後には、CAD的な使い方をしたいと言うことがあったのですね。それで納得しましたが、この質問にはそれらしきことは書いてなかったので。 エクセルは扱うのが数値・文字列型のソフトで、図形を扱うのは本旨でなく、今の路線で行くと、そのうち難しい局面になるでしょう。 VBAのAはForApplicationのAで、Aはこの場合はエクセルで、エクセルの機能・操作とべったりのもので、それだけにエクセルでは便利(VBなどで組むに比べ)ですが、逆にそれ以外の範疇のニーズには、足かせになるかもしれない。 例えばエクセルではセルという概念がじゃまして、マウスでポイントした場所に四角形を書けない(正確なポイントが出来ない。図形を載せる台紙として不完全です。)。使えるイベントも非常に貧弱です。 私もかって、住宅の間取り図をプログラムで自作できないか、夢想したことがありました。そうこうしているうちに、良いソフトが出たようで、立体図形・パースまで作るソフトも安価なのが出てきて、興味も消えました。 (1)まずご希望の機能のフリーやシェアウエアを探しましょう。現在は作ろうとすると、複雑な知識が必要になりすぎて手におえません。作るより既製のものを使う時代でしょう。 (2)まだ勉強し始めですがVISIOがマイクロソフト の製品にあり、システム設計文書などに使われています。 VBAもOffice製品の1つと言うことでしょうか、あるので、検討されてはいかがでしょう。エクセルよりは マシでは無いかと想像します。 (3)それにこう言うものを作ろうとしたとき、まず構成図(構想。仕組みの骨子のようなもの)がしっかりしてないと駄目だと思います。アルゴリズムよりもう少し上の概念のようなもの。共通のものが何で、特殊なものが何か関連はどうかと言うようなものです。それがないと、個別の特殊ケースの羅列になります。そう言うものの仕組みこそ本当は識者の批判の場に曝して良いものを作るべきと思いますが、OKWEBでは無理ですが、すでに出来あがってますか。 (4)こう言う件の解説や実例が載るとすれば、載りそうなのは、建築関係の雑誌か、「インターフェイス」誌や「トランジスタ技術」誌のレベルのような気がする。 APIの利用も避けて通れないのではないでしょうか。
お礼
度重なる回答ありがとうございます。 かかれている内容はよくわかります。少々,私の記述が難しいものを要求しているように見えてしまったのかなと思っています。 おかげさまで今回の質問は6番の方のアドバイスで解決しました。 私の6番の方へのお礼に書いてあるコードを試してみてもらえれば、以外にも簡単な内容のことをしたかったのだと言うことがわかると思います。 VISIOは今回、試行錯誤している中で知りました。しかし、少々,高価ですのでDelphi、C++Builderなどの低価格のソフトを使っていきたいと思っています。
- Hayashi_Trek
- ベストアンサー率44% (366/818)
> 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関数の場合は変換できないとエラー処理が必要になる。)
お礼
回答ありがとうございます。 データの型のアドバイスありがとうございます。 VBAの本を見ていると一番最初に出てくるのがこの部分なんですよね、 一番、イメージとして理解しにくい部分です。つい読み飛ばしてしまう部分です。 勉強させていただきます。
- papayuka
- ベストアンサー率45% (1388/3066)
#2です。 > 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける > →Excelに戻り、ツール→マクロ実行→Sheet1.Testを実行 手順が違います。 Sheet1.Test って事は、Sheet1のモジュールに貼り付けてます。 #2の回答の通り「標準モジュール」に貼り付けてください。 1.新規にExcelを開く 2.VB Editorを開く 3.VBE画面の挿入-標準モジュールでModule1が追加されるので、ここに#2のコードをコピペ 4.Excelに戻りツール→マクロ実行→Testを実行
お礼
深夜の回答ありがとうございます。 標準モジュールに貼り付けて実行したところ見事に出来ました。 このコードはかなり使えそうです。 標準モジュールということが良く理解できなかったのが原因です。本の抜粋ばかり見てましたので基本が出来て居ないんですよね。 最終的にはいろいろな形に変形したいのでコードを分析して応用したいと思います。
補足
Excel VBAを使い、個人で開発したフリーソフトが公開されていますが「こんなこと良く出来るな」と思うソフトがあります。 VBAと言えどもかなりのことは出来るのではないかと思います。 本屋をあちこち回り図形を変化させることが書いてある本を探したのですが、単に線を引くことや四角を描くことデータベースを作ることが書かれているのが大半でした。 C++で大半のことが出来ると言うことなのでソフトを購入したのですが肝心の解説書が図形を変化させるというプログラムが書かれている物は皆無でした。 やはり、データベース中心です。 でも、CAD自体がC++で出来ていることもあるので可能だと思いますし、期待しています。 「私が探しているものはデータベースではなくて図形を自在に描ける方法なんです....残念! 斬り!」 と言う心境でしょうか。
- papayuka
- ベストアンサー率45% (1388/3066)
#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
補足
ありがとうございます。 再度,チャレンジしたのですがだめでした。 私の試みた方法ですが 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Excelに戻り、ツール→マクロ実行→Sheet1.Testを実行→三角形表示→三角形をクリック→マクロ‘Book1!MyCallerが見つかりません‘とダイアログボックスが出てエラー (2回目の回答もこのような結果になりました) もう一つは 新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Editer内でマクロ実行→InputBoxを表示→数字をX,Yに入れる→型が一致しませんとデバックエラー 明日、またトライしてみます。
- imogasi
- ベストアンサー率27% (4737/17069)
本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)にユーザーインターファースから値を代入するようにしたいのですがどのようにすればよいのでしょうか」と言う質問になるのか判らない。
お礼
回答ありがとうございます。 >どのようにすればよいのでしょうか」と言う質問になるのか判らない。 そうですね。変数が良くわかっていないのが原因です。一旦わかればかなり応用が利くと思うのですが。 何冊も本を見比べているのですがなかなかこの問題に直結するものがなくて。 言い訳ばかりですみません。
補足
>ビシネスには関係ない課題のようですが、何に使えるのだろうか。 ということにお答えします。私は建築関係の仕事についています。 JWWのようにフリーのCADや100万円するCADを使っています。JWWはお絵かきCADです。(しかし、その実力とシェアには敬意を表します。)。100万円するCADは建築の間取りを描いたり、プレゼンテーションが半自動で出来ます。 しかし、建築物の詳細となりますとほとんどフリーハンド状態でJWWなどのお絵かきCADを使って描きます。部材の発注にも詳細図を描いて使います。 そこでいつも悩むのが、自分でプログラム出来る簡易CADというものがないかということです。AutoCadにそれらしきものがあると言うことがわかったのですがそこまで投資しなくてもと言う考えがあります。 実際はExcelに絵を描いておき、シートのセルにある寸法を入れると絵の線の脇のおのおののセルに数値が計算されて入ると言う図面を書いて使っています。 なにぶんにも数値を入れても動かない絵ですので、怪しいときはCADで描きます。そこで手間を省くためにVBAを使って数値で変わる絵が描けないかと思ったわけです。 いろいろ調べたのですが、世の中にもう少し、「図形を描くプログラムする本」などという本があればなと思っています。
- papayuka
- ベストアンサー率45% (1388/3066)
たぶん前の質問も読んだと思いますが、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
お礼
回答ありがとうございます。 さっそく試してみたのですが Set sh = ActiveSheet.Shapes(Application.Caller) の部分で「型が一致しません」というデバックがでます。 Excel97、Excel2002ともだめでした。 しかし、三角形はちゃんとかかれています。 InputBoxという手があることには気が付きませんでした。 回答のコードは私にはなかなか難しいですが勉強になります。
- Samurai-Jack
- ベストアンサー率18% (130/697)
ユーザーフォームにX軸用のテキストボックス(textbox1)とY軸用のテキストボックス(textbox2)を配置します。 そして、SUB 三角作成の最初の行に X=textbox1.text Y=textbox2.text とすればいいのではないでしょうか? はずしています?
お礼
回答ありがとうございます。 そうですね。私も最初はそうではないのかと思い試してみたのですがうまくいかなくて。 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 と入れて試したのですがデバックで「オブジェクトがありません」と出ます。 そういえばシートに貼り付けたコマンドボタンを押してユーザーインターフェースを表示させ、テキストボックスに値を入れても図形を書く何らかのコマンドボタンが無ければ図形を書いてくれないなと思いました。 一連の作業をプログラムすることが出来ないと動かすのは難しいなと感じています。 もう少し知恵をお貸しください。
お礼
度重なる回答ありがとうございます。 回答のコードを試してみましたらちゃんと描けました。 この回答をヒントに自分なりにバージョンアップしてみました。 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にしないと立ち上がりと幅の数字によってはマイナスになってしまうことがわかり苦労しました。 見事に解決しました。 適切なアドバイス感謝いたします。