- ベストアンサー
excel vba inputbox
初心者です。質問させて下さい。 inputboxでhelpを参照すると、typeの指定は以下ですが、 値 意味 0 数式 1 数値 2 文字列 (テキスト) 4 論理値 (True または False) 8 セル参照 (Range オブジェクト) 16 #N/A などのエラー値 64 数値配列 やはり、図形を選択させる事は不可能でしょうか? 具体的には、 マクロ実行中にinputboxを表示させて、図形を選択させ、図形名を表示させて、その図形を既定の図形に設定させたいと思っています。 図形を一つ選択した状態ならば、その図形の名前は以下のコードのように取得できるのですが、inputboxでは図形がなぜか選択できないです。 そもそも、inputboxを使用しようと思ったのは、他のコマンドやツール等が非選択状態になること、またマクロ実行の途中で一時中断することができ、これらの条件は便利だし必要だと思ったからです。 inputboxは何かで設定を変える等で図形を選択できるのでしょうか?無理でしょうか? また、代替的なものは他にあるのでしょうか? Sub testA() Dim Def As Object Set Def = Excel.Selection If TypeOf Def Is Excel.Rectangle Then MsgBox (Def.Name) End If End Sub 無理な質問かもしれませんが、どなたか御教授お願い致します!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
オブジェクト選択ツールをユーザーフォームで自作するのは、かなりたいへんでしょうねぇ。 マクロ実行の途中で一時中断して何かさせる、という観点で、 オフィスアシスタントを使う手もあります。 Sub Sample() With Assistant .On = True .Visible = True '.Sounds = True .Filename = "saeko.acs" With .NewBalloon 'bln .BalloonType = msoBalloonTypeButtons 'Numbers .Button = msoButtonSetOK .animation = msoAnimationWorkingAtSomething .Labels(1).Text = "図形を選択してOKをクリックしましょう。" .Mode = msoModeModeless .Callback = "test00" .Show End With End With End Sub Sub test00(bln As Balloon, lbtn As Long, lPriv As Long) Dim Def As Object Set Def = Excel.Selection If TypeOf Def Is Excel.Rectangle Then MsgBox (Def.Name) End If bln.Close 'Assistant.On = False End Sub Sampleマクロは終了して、バルーンのボタンクリックで イベントプロシージャのように、test00が走ります。 まあ、こんなことも出来る、という程度の情報ですが。 本格的にバルーンをたくさん用意して作りこんでいけば、 ウィザード形式のものを作成できるようです。
その他の回答 (3)
Officeアシスタントは、excel2007では廃止になりました。 http://officetanaka.net/excel/excel2007/041.htm 無駄な回答ですいませんでした。 さて、図形の操作はよく分からないので、簡単に。 フリーフォームの形状はこんなふうに、取得できるのではないでしょうか。 With Selection.ShapeRange MsgBox .Type = msoFreeform MsgBox .Nodes.Count With .Nodes(1) MsgBox .EditingType MsgBox .SegmentType End With End With 節点の数だけループさせることになると思いますけど。 オートシェイプの規定値がどうなっているのかは、取得方法が分かりませんでした。
お礼
NNAQさん御回答どうもありがとうございます!! 返答が遅れてすいません。 おぉ!!フリーフォームの形状も取れるのですね!! そうですか、Officeアシスタントに期待しましたが、なくなったのですか。。。 しかし、Excel2007は図形に関しては結構仕様が変わったというか、自動マクロ記録もできないし、textframe2なんか出来てしまったし、前からVBAをされてた方からすると不便でしょうね。。。始めたばかりなのでただただ難解だと思うばかりですが。。。 オートシェイプの規定値調べてくれてありがとうございます! NNAQさんでも分からなければ、無理な気がしますが、 これは気になるのでもう一度、質問しなおしてみます。すいません。 またどうぞ宜しくお願い致します!!
- OtenkiAme
- ベストアンサー率77% (69/89)
こんにちは。 > 発想を転換してユーザーフォームで頑張る以外ないという事でしょうか? 「オートシェイプを規定値に設定」って 一般機能で図形を右クリックして処理できますよね。 ユーザーフォームまで持ち出してマクロを組む必要があるのか 私にはわかりません。
お礼
OtenkiAmeさん御回答どうもありがとうございました! 「オートシェイプを規定値に設定」の情報取得という質問のテーマが絞れました! 御指導頂きどうもありがとうございます!!
補足
御回答ありがとうございます!返答が遅れてすいません。 はじめはそれで良いと思っていたのですが、 右クリックに出てくる「既定の図形に設定」ではなくいわゆるフォーマットとして定めたいのです。説明が不完全でした。すいません。 そもそも「既定の図形に設定」の情報は取得できるのでしょうか? SetShapesDefaultProperties メソッドだと、図形の書式の設定だけで、読み取りできるのでしょうか? また、TypeName や MsoShapeType や MsoAutoShapeType 等、フリーフォームの形状の情報までは取得しないのではないか思い、代案の現在に至りました。 OtenkiAmeさんのおっしゃる通りですが、もう少し頑張りたいと思います。
- OtenkiAme
- ベストアンサー率77% (69/89)
こんにちは。 > また、代替的なものは他にあるのでしょうか? 選択したセル範囲と各図形のセル範囲をIntersectで調べて設定するようにしたら如何でしょうか? Dim Sentaku As Range Dim Zukei As Shape On Error Resume Next Set Sentaku = Application.InputBox( _ Prompt:="規定値にしたい図形を描いたセルを選択" & vbCr & _ "(図形にかかっていればOK!)", Type:=8) On Error GoTo 0 If Sentaku Is Nothing Then Exit Sub For Each Zukei In ActiveSheet.Shapes If Not Application.Intersect( _ Sentaku, Range(Zukei.TopLeftCell, Zukei.BottomRightCell)) Is Nothing Then MsgBox Zukei.Name 'Zukei.SetShapesDefaultProperties Exit Sub End If Next Zukei Set Sentaku = Nothing
補足
御回答ありがとうございます! 実際に使った事はなかったのですが、 Intersect と TopLeftCell と BottomRightCell で図形を絞り込んで行く方法は、色々調べて拝見した事がありました。 この方法も有効だと思っています。 なので、具体的にコードを記述して頂き、ありがとうございます! (初心者なので、よくわからないミスや勘違いでコードを通すのは思った以上に進まないものなので。。。) しかし inputbox がどうしてもセル選択用であるなら、発想を転換してユーザーフォームで頑張る以外ないという事でしょうか? ユーザー定義のツール?等も候補でしょうか? セル範囲の選択よりもオブジェクトの選択ツールの方がより確実に図形を選択できると思っているので、inputbox が残念でなりません。
補足
御回答ありがとうございます! オフィスアシスタントというのは初めて聞きました! ウィザード形式までできてしまうとは、すごいですね!! 折角コードまで描いて頂いたのですが、 Assistant.On = True がどうも実行できないようです。 PCの設定の問題でしょうか?(winXp sp3 excel2007) (msconfigで若干何かをoffにした記憶あり・・・) まずはNNAQさんが描いてくれたコード自体を、理解できるように、頑張ってみます!!