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で図面を書きたい」という質問をしたのですがややこしく書いたため解答される方が居ませんでしたので編集して再質問をさせていただきます。
よろしくお願いします。
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を実行
度重なる回答ありがとうございます。
回答のコードを試してみましたらちゃんと描けました。
この回答をヒントに自分なりにバージョンアップしてみました。
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にしないと立ち上がりと幅の数字によってはマイナスになってしまうことがわかり苦労しました。
見事に解決しました。
適切なアドバイス感謝いたします。
No.8
- 回答日時:
#3です。
本質問の背後には、CAD的な使い方をしたいと言うことがあったのですね。それで納得しましたが、この質問にはそれらしきことは書いてなかったので。エクセルは扱うのが数値・文字列型のソフトで、図形を扱うのは本旨でなく、今の路線で行くと、そのうち難しい局面になるでしょう。
VBAのAはForApplicationのAで、Aはこの場合はエクセルで、エクセルの機能・操作とべったりのもので、それだけにエクセルでは便利(VBなどで組むに比べ)ですが、逆にそれ以外の範疇のニーズには、足かせになるかもしれない。
例えばエクセルではセルという概念がじゃまして、マウスでポイントした場所に四角形を書けない(正確なポイントが出来ない。図形を載せる台紙として不完全です。)。使えるイベントも非常に貧弱です。
私もかって、住宅の間取り図をプログラムで自作できないか、夢想したことがありました。そうこうしているうちに、良いソフトが出たようで、立体図形・パースまで作るソフトも安価なのが出てきて、興味も消えました。
(1)まずご希望の機能のフリーやシェアウエアを探しましょう。現在は作ろうとすると、複雑な知識が必要になりすぎて手におえません。作るより既製のものを使う時代でしょう。
(2)まだ勉強し始めですがVISIOがマイクロソフト
の製品にあり、システム設計文書などに使われています。
VBAもOffice製品の1つと言うことでしょうか、あるので、検討されてはいかがでしょう。エクセルよりは
マシでは無いかと想像します。
(3)それにこう言うものを作ろうとしたとき、まず構成図(構想。仕組みの骨子のようなもの)がしっかりしてないと駄目だと思います。アルゴリズムよりもう少し上の概念のようなもの。共通のものが何で、特殊なものが何か関連はどうかと言うようなものです。それがないと、個別の特殊ケースの羅列になります。そう言うものの仕組みこそ本当は識者の批判の場に曝して良いものを作るべきと思いますが、OKWEBでは無理ですが、すでに出来あがってますか。
(4)こう言う件の解説や実例が載るとすれば、載りそうなのは、建築関係の雑誌か、「インターフェイス」誌や「トランジスタ技術」誌のレベルのような気がする。
APIの利用も避けて通れないのではないでしょうか。
度重なる回答ありがとうございます。
かかれている内容はよくわかります。少々,私の記述が難しいものを要求しているように見えてしまったのかなと思っています。
おかげさまで今回の質問は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関数の場合は変換できないとエラー処理が必要になる。)
回答ありがとうございます。
データの型のアドバイスありがとうございます。
VBAの本を見ていると一番最初に出てくるのがこの部分なんですよね、
一番、イメージとして理解しにくい部分です。つい読み飛ばしてしまう部分です。
勉強させていただきます。
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を実行
この回答への補足
Excel VBAを使い、個人で開発したフリーソフトが公開されていますが「こんなこと良く出来るな」と思うソフトがあります。
VBAと言えどもかなりのことは出来るのではないかと思います。
本屋をあちこち回り図形を変化させることが書いてある本を探したのですが、単に線を引くことや四角を描くことデータベースを作ることが書かれているのが大半でした。
C++で大半のことが出来ると言うことなのでソフトを購入したのですが肝心の解説書が図形を変化させるというプログラムが書かれている物は皆無でした。
やはり、データベース中心です。
でも、CAD自体がC++で出来ていることもあるので可能だと思いますし、期待しています。
「私が探しているものはデータベースではなくて図形を自在に描ける方法なんです....残念! 斬り!」
と言う心境でしょうか。
深夜の回答ありがとうございます。
標準モジュールに貼り付けて実行したところ見事に出来ました。
このコードはかなり使えそうです。
標準モジュールということが良く理解できなかったのが原因です。本の抜粋ばかり見てましたので基本が出来て居ないんですよね。
最終的にはいろいろな形に変形したいのでコードを分析して応用したいと思います。
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
この回答への補足
ありがとうございます。
再度,チャレンジしたのですがだめでした。
私の試みた方法ですが
新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Excelに戻り、ツール→マクロ実行→Sheet1.Testを実行→三角形表示→三角形をクリック→マクロ‘Book1!MyCallerが見つかりません‘とダイアログボックスが出てエラー (2回目の回答もこのような結果になりました)
もう一つは
新規にExcelを開きVB Editerを開く→コードを開く→コピーしたコードを貼り付ける→Editer内でマクロ実行→InputBoxを表示→数字をX,Yに入れる→型が一致しませんとデバックエラー
明日、またトライしてみます。
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)にユーザーインターファースから値を代入するようにしたいのですがどのようにすればよいのでしょうか」と言う質問になるのか判らない。
この回答への補足
>ビシネスには関係ない課題のようですが、何に使えるのだろうか。
ということにお答えします。私は建築関係の仕事についています。
JWWのようにフリーのCADや100万円するCADを使っています。JWWはお絵かきCADです。(しかし、その実力とシェアには敬意を表します。)。100万円するCADは建築の間取りを描いたり、プレゼンテーションが半自動で出来ます。
しかし、建築物の詳細となりますとほとんどフリーハンド状態でJWWなどのお絵かきCADを使って描きます。部材の発注にも詳細図を描いて使います。
そこでいつも悩むのが、自分でプログラム出来る簡易CADというものがないかということです。AutoCadにそれらしきものがあると言うことがわかったのですがそこまで投資しなくてもと言う考えがあります。
実際はExcelに絵を描いておき、シートのセルにある寸法を入れると絵の線の脇のおのおののセルに数値が計算されて入ると言う図面を書いて使っています。
なにぶんにも数値を入れても動かない絵ですので、怪しいときはCADで描きます。そこで手間を省くためにVBAを使って数値で変わる絵が描けないかと思ったわけです。
いろいろ調べたのですが、世の中にもう少し、「図形を描くプログラムする本」などという本があればなと思っています。
回答ありがとうございます。
>どのようにすればよいのでしょうか」と言う質問になるのか判らない。
そうですね。変数が良くわかっていないのが原因です。一旦わかればかなり応用が利くと思うのですが。
何冊も本を見比べているのですがなかなかこの問題に直結するものがなくて。
言い訳ばかりですみません。
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
回答ありがとうございます。
さっそく試してみたのですが
Set sh = ActiveSheet.Shapes(Application.Caller)
の部分で「型が一致しません」というデバックがでます。
Excel97、Excel2002ともだめでした。
しかし、三角形はちゃんとかかれています。
InputBoxという手があることには気が付きませんでした。
回答のコードは私にはなかなか難しいですが勉強になります。
No.1
- 回答日時:
ユーザーフォームに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
と入れて試したのですがデバックで「オブジェクトがありません」と出ます。
そういえばシートに貼り付けたコマンドボタンを押してユーザーインターフェースを表示させ、テキストボックスに値を入れても図形を書く何らかのコマンドボタンが無ければ図形を書いてくれないなと思いました。
一連の作業をプログラムすることが出来ないと動かすのは難しいなと感じています。
もう少し知恵をお貸しください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- 数学 【数学の図形の名称と面積の計算方法】正三角形と扇形があります。正三角形の2辺を伸ばす 9 2023/02/06 23:30
- 数学 数学の質問です。 円に内接する四角形ABCD において, AB=2, BC = 1, CD = 3, 3 2023/04/18 18:28
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- 数学 画像の中学2年生の数学の問題について教えていただきたいです。 三角形ADCが二等辺三角形であることと 2 2023/01/29 16:14
- 数学 平面ベクトル 3 2022/08/02 20:29
- 数学 中3の数学で写真の問題がどうしても解けません。 「図のADBさえ分かれば解ける。」 ↓ 「DACを知 1 2023/01/17 19:58
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
一番最初にネットにつないだのはいつ?
ネットユーザーもいろんな世代が生まれていますが、始めて接続したときのワクワクは同じはず! 人生で一番最初にネットに接続したときの思い出を教えて下さい。
-
【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
【お題】 ・ありそうだけど、絶対に無いことわざを教えてください。
-
食べられるかと思ったけど…ダメでした
「この煮物、だいぶ放置しちゃったけど大丈夫かな…」 「食べ物じゃないけど、なんか食べたらすごく美味しそうな気がする」
-
【選手権お題その2】この漫画の2コマ目を考えてください
サッカーのワンシーンを切り取った1コマ目。果たして2コマ目にはどんな展開になるのか教えてください。
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
Excelのシート上のShapeにイベントは設定できる?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
交差する2線分の交点座標の求め方
-
マインクラフト(pc版)で座標...
-
OpenGLの描画について(拡大縮...
-
グラフの交点の求め方(Excel)
-
ピクセル座標で2点間の直線上...
-
C#でスクリーンセーバーを作る...
-
閉図形の座標の配列が右回りか...
-
始点、終点の二つの座標と半径...
-
Minecraft 統合版(PC)の描画距...
-
勝手にウィンドウが開いて止ま...
-
VBAでコントロールのハンドルを...
-
コントロールの書式設定で、“コ...
-
エクセルで1行目から3行目が消...
-
msgboxの表示位置
-
フォーム上のリストボックスに...
-
VBAでのタイトルバーの取得
-
エクセルで作った新しいウイン...
-
bootcampを取り出してしまった場合
-
.NETでチャートにスクロールバ...
-
VBで外部プログラムを位置のみ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
ダイアログ内コントロールの位...
-
エクセルで回転する座標の出し方
-
シーケンサー(PLC?)で制...
-
エクセルである点からの距離で...
-
始点、終点の二つの座標と半径...
-
C言語 配列で座標
-
多角形の内部かどうか判定する方法
-
閉図形の座標の配列が右回りか...
-
以下のプログラムは重心を求め...
-
c言語でキーボードから2点の座...
-
Excel VBA で自在に図形を変化...
-
タッチパッドのタッチ座標取得
-
C言語において、0の座標をキャ...
-
当たり判定後に面に沿って動か...
-
ワード上Shapeの位置情報を統一...
-
黒体放射軌跡のxy色度座標への...
-
一番近い点を見つけたい。
おすすめ情報