• ベストアンサー

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 文字位置を自由に変えることは出来ますが打ち込んだ文字に変化させることが出来ません。 簡略的なコードや文字を表示させるには別の方法があるという方がいましたらご教示お願いします。

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

  • ベストアンサー
  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.1

とりあえず、23行目の引用符を取り除いて Selection.Characters.Text = y とすれば、TextBox1に入力した数値が表示されます。 TextBox1に入れた文字が変数yに入りますが、 yはSingle型ですから、数値しか表示できません。 また、「小数点以下2桁」など書式設定をして表示したいなら、 Selection.Characters.Text = Format(y, "0.##") などとします。 文字でも数値でもとにかくTextBox1に入力したとおりに表示させたいなら、 2行目を Dim x As Single, y As String, Sh As Shape 5行目を y = TextBox2.Value 23行目を Selection.Characters.Text = y でよいと思います。

kakusan_t
質問者

お礼

回答ありがとうございます。 早速、一番下の回答でトライしてみました。出来ました! Dim x As Single, y As String, Sh As Shape y = TextBox2.Value ここまでは思いついていました。 しかし、 Selection.Characters.Text = "y" の””がまずいということまで気が付きませんでした。 とはいえ、自分でもある程度までは出来ていたことに喜んでいます。 文字を表記するのは線を描くよりもコードが長いですね。 最初はワードアートで考えていました。本にはそれしか載っていなかったので。 テキストボックスは私が考えたのですがコードが長いですね。 文字を表記する方法はこれしかないのでしょうか。 図形を描いてその線分の長さを線の脇に書くことを考えているのですがSetステートメントなどでこのコードを短縮しておき、他の線には変数で対応することを考えています。 ひとまずありがとうございました。

その他の回答 (2)

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

こんにちは。 If Sh.Name <> "Cmd文字入力" Then が使えるようになりましたね。 ちょっと気になってきたのでほっとしました。 序にコードの長さについて一言。 マクロ記録では不必要なプロパティまで設定してしまうので冗長なコードにはなりますが、その反面、プロパティーを覚える手助けにはなると思いますので不必要なコードを無闇に削除するのではなく、意味をよく理解してから削除するように心掛けてください。VBA勉強中であれば尚更のこと。 また、マクロ記録では頻繁にSelectが出てきますがこれはほとんどが不必要なものですので必要な時以外は削除するようにしましょう。 それから「表示のみ」の場合は、Label Controlが基本です。 ところで今勉強中の図形の寸法表示ですが、例えば四角形の「縦」の寸法表示は上手くいきますか? 以上です。

kakusan_t
質問者

お礼

回答ありがとうございます。 >ところで今勉強中の図形の寸法表示ですが、例えば四角形の「縦」の寸法表示は上手くいきますか? この文章を見てヒョっとしたらと感じましたのでトライしてみました。昨日、深夜まで試行錯誤したのですが出来ませんでした。 安易に考えていたようです。 テキストボックス、縦書きテキストボックスのどちらかを使いテキストボックスの書式設定で方向を縦使いに直すマクロの記録をを取りました。 With Selection .HorizontalAlignment = xlLeft .VerticalAlignment = xlTop .Orientation = xlUpward .AutoSize = False .AddIndent = False End With このうちの .Orientation = xlUpward が該当するコードであることがわかりましたので前に作った文字表示のマクロにコピペしたのですが横使いのままでした。 セル範囲でしたら Range("A1:A5").Orientation = 90 というコードでできるということがわかりましたのでアレンジしてやってみたのですが出来ませんでした。 マクロの記録で記録したコードにコマンドボタンをつけてみましたら出来なくなってしまいました。 マクロの実行で出来ることがコマンドボタンでは出来なくなるという点でコードの記述に問題があるのではと感じています。

kakusan_t
質問者

補足

>If Sh.Name <> "Cmd文字入力" Then >が使えるようになりましたね。 >ちょっと気になってきたのでほっとしました。 前回の質問を締め切った後にとうとう原因がわかりました。 Sheet1上にある「名前ボックス」がCommandBattun1であることに気が付きました。早速、名前を「Cmd作図」にしたところ見事にコマンドボタンが消えなくなりました。 今までそんなところは気にもしなかったのですがSheet1上にあるオブジェクトの属性というべきものを表示する重要なところなんだなと感じました。 私にとっては時間をかけた分、大きな一歩でした。 前回ヒントをもらってからプログラムもかなり進化しています。 If文を使い、ある高さを超えると4角形から5角形を描画することや寸法線表示も図形の形状に合わせて出来るようにしました。 VBAは、一つの定形のコードを覚えるとどんどん応用が出来る感じがしています。

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.2

短くするには不要な命令を削ってはいかがでしょうか。 2番目のWithブロックの中は .Fill.Visible = msoFalse .Line.Visible = msoFalse だけでいいと思うし、 3番目のWithブロックは With Selection.Characters.Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 End With でいいと思います。 文字を自由な位置に置きたいなら、仰るとおりテキストボックスやその同類(オートシェイプ)を使うしかないと思います。

kakusan_t
質問者

お礼

再度、回答ありがとうございます。 早速、コードを削ってみました。 かなり簡略化できました。 マクロの記録でコードを作るといろいろコードが表示されてしまいますよね。 でも、これってどうゆうコードなのかなって調べるときはいいですね。 ありがとうございます。