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も見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
あなたの習慣について教えてください!!
あなたが習慣だと思って実践しているものを共有してくださいませんか? 筋肉トレーニングでも朝シャワーでも、あなたが習慣だなと思えば何でも構いません
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
3次元空間上の2つの座標から...
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
座標
-
【C#】アクションゲームの地...
-
ダイアログ内コントロールの位...
-
DirectXを使ってテクスチャ(画...
-
Excel VBAでマウス移動&ダブル...
-
多角形に長方形が入るかどうか...
-
選択範囲の座標値の抽出
-
VB6のPrinter.ScaleWidth に対...
-
以下のプログラムは重心を求め...
-
マウスのある個所の色
-
マウス座標からリストボックス...
-
MFC
-
回転する矩形同士の当たり判定...
-
C言語で制作するピラミッドアー...
-
任意点を中心とした回転
-
当たり判定後に面に沿って動か...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
3次元空間上の2つの座標から...
-
マインクラフト(pc版)で座標...
-
エクセルである点からの距離で...
-
ダイアログ内コントロールの位...
-
始点、終点の二つの座標と半径...
-
エクセルで回転する座標の出し方
-
閉図形の座標の配列が右回りか...
-
C言語 配列で座標
-
ワード上Shapeの位置情報を統一...
-
直線上にある点の座標の求め方
-
画像ファイルに座標が記録され...
-
多角形の内部かどうか判定する方法
-
OpenGLの線の太さ
-
シーケンサー(PLC?)で制...
-
c言語でキーボードから2点の座...
-
ピクチャボックスの座標取得
-
以下のプログラムは重心を求め...
-
交差する2線分の交点座標の求め方
-
直線と傾きのある楕円の交点を...
おすすめ情報