• ベストアンサー

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 無理な質問かもしれませんが、どなたか御教授お願い致します!

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

  • ベストアンサー
  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.3

オブジェクト選択ツールをユーザーフォームで自作するのは、かなりたいへんでしょうねぇ。 マクロ実行の途中で一時中断して何かさせる、という観点で、 オフィスアシスタントを使う手もあります。 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が走ります。 まあ、こんなことも出来る、という程度の情報ですが。 本格的にバルーンをたくさん用意して作りこんでいけば、 ウィザード形式のものを作成できるようです。

tkh_tkh
質問者

補足

御回答ありがとうございます! オフィスアシスタントというのは初めて聞きました! ウィザード形式までできてしまうとは、すごいですね!! 折角コードまで描いて頂いたのですが、 Assistant.On = True がどうも実行できないようです。 PCの設定の問題でしょうか?(winXp sp3 excel2007) (msconfigで若干何かをoffにした記憶あり・・・) まずはNNAQさんが描いてくれたコード自体を、理解できるように、頑張ってみます!!

その他の回答 (3)

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.4

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 節点の数だけループさせることになると思いますけど。 オートシェイプの規定値がどうなっているのかは、取得方法が分かりませんでした。

tkh_tkh
質問者

お礼

NNAQさん御回答どうもありがとうございます!! 返答が遅れてすいません。 おぉ!!フリーフォームの形状も取れるのですね!! そうですか、Officeアシスタントに期待しましたが、なくなったのですか。。。 しかし、Excel2007は図形に関しては結構仕様が変わったというか、自動マクロ記録もできないし、textframe2なんか出来てしまったし、前からVBAをされてた方からすると不便でしょうね。。。始めたばかりなのでただただ難解だと思うばかりですが。。。 オートシェイプの規定値調べてくれてありがとうございます! NNAQさんでも分からなければ、無理な気がしますが、 これは気になるのでもう一度、質問しなおしてみます。すいません。 またどうぞ宜しくお願い致します!!

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.2

こんにちは。 > 発想を転換してユーザーフォームで頑張る以外ないという事でしょうか? 「オートシェイプを規定値に設定」って 一般機能で図形を右クリックして処理できますよね。 ユーザーフォームまで持ち出してマクロを組む必要があるのか 私にはわかりません。

tkh_tkh
質問者

お礼

OtenkiAmeさん御回答どうもありがとうございました! 「オートシェイプを規定値に設定」の情報取得という質問のテーマが絞れました! 御指導頂きどうもありがとうございます!!

tkh_tkh
質問者

補足

御回答ありがとうございます!返答が遅れてすいません。 はじめはそれで良いと思っていたのですが、 右クリックに出てくる「既定の図形に設定」ではなくいわゆるフォーマットとして定めたいのです。説明が不完全でした。すいません。 そもそも「既定の図形に設定」の情報は取得できるのでしょうか? SetShapesDefaultProperties メソッドだと、図形の書式の設定だけで、読み取りできるのでしょうか? また、TypeName や MsoShapeType や MsoAutoShapeType 等、フリーフォームの形状の情報までは取得しないのではないか思い、代案の現在に至りました。 OtenkiAmeさんのおっしゃる通りですが、もう少し頑張りたいと思います。

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.1

こんにちは。 > また、代替的なものは他にあるのでしょうか? 選択したセル範囲と各図形のセル範囲を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

tkh_tkh
質問者

補足

御回答ありがとうございます! 実際に使った事はなかったのですが、 Intersect と TopLeftCell と BottomRightCell で図形を絞り込んで行く方法は、色々調べて拝見した事がありました。 この方法も有効だと思っています。 なので、具体的にコードを記述して頂き、ありがとうございます! (初心者なので、よくわからないミスや勘違いでコードを通すのは思った以上に進まないものなので。。。) しかし inputbox がどうしてもセル選択用であるなら、発想を転換してユーザーフォームで頑張る以外ないという事でしょうか? ユーザー定義のツール?等も候補でしょうか? セル範囲の選択よりもオブジェクトの選択ツールの方がより確実に図形を選択できると思っているので、inputbox が残念でなりません。

関連するQ&A

  • エクセルVBA Inputboxについて教えてください。

    InputBoxの使い方について教えてください。 テストで下記のように書いてみました。 Sub input_test2() ans = InputBox("質問!適当に数字を入れてね") MsgBox Application.WorksheetFunction.IsNumber(ans), vbInformation, "入力判定" If Application.WorksheetFunction.IsNumber(ans) Then If ans = 0 Then MsgBox "入力されたのは、 0", vbInformation, "回答" If ans = 1 Then MsgBox "入力されたのは、 1", vbInformation, "回答" If ans = 2 Then MsgBox "入力されたのは、 2", vbInformation, "回答" If ans = 3 Then MsgBox "入力されたのは、 3", vbInformation, "回答" If ans >= 4 Then MsgBox "入力されたのは、 4以上", vbInformation, "回答" Else MsgBox "入力は数字でしてください!", vbExclamation, "お願い" End If End Sub 1.入力が数値ならTRUEがかえると思ったのですが、何を入れてもFALSEしかかえりません。どこがまずいのでしょうか? 2.表示されるInputBoxのサイズが随分横に長いのですが、サイズを変える方法はあるのでしょうか? 3.MsgBoxの"入力判定"や”回答”ようにInputBoxにも最上行に日本語を表示させる方法はないでしょうか? 以上、よろしくお願いいたします。

  • エクセルのInputBoxについて教えてください。

    エクセル2010です。 InputBoxについて教えてください。  負数以外の数値を受け取りたいのです。 以下のようにやってみました。 Sub test001() Dim ans As Double ans = Application.InputBox("数値を入力", Type:=1) If ans = False Then MsgBox "キャンセル" Exit Sub ElseIf ans < 0 Then MsgBox "負数は不可。" Call test Else MsgBox ans & "を受け取りました。" End If End Sub 一応、これで動くのですが、問題は数値0を入力された場合です。 0はFalseと認識されるようで、キャンセルとなってしまいます。0は0という数値で受け取りたいのです。 試行錯誤の結果、Type:=1をやめ、変数ansをVariantにして If ans = “False” Then と、Falseをダブルクォーテーションでくくると、0を数値としてくれるようです。でも理屈がわかりません。変数ansにキャンセルボタンで帰ってくるのはBooleanのFalseであり、Stringの”False”ではないと思うのですが。 Sub test002() Dim ans ans = Application.InputBox("数値を入力") If ans = "False" Then MsgBox "キャンセル" & TypeName(ans) Exit Sub ElseIf ans = "" Then MsgBox "未入力" & TypeName(ans) Call test002 ElseIf Not IsNumeric(ans) Then MsgBox "数値ではありません。" & TypeName(ans) Call test002 ElseIf ans < 0 Then MsgBox "負数は不可。" & TypeName(ans) Call test002 Else MsgBox ans & "を受け取りました。" & TypeName(ans) End If End Sub あと、もうひとつ質問は、数値以外の入力があった場合、再度入力させるためいちいちCall test002 を入れてますが、このやり方でただしいのでしょうか?

  • エクセルマクロでinputboxメソッドゼロ入力

    エクセル2007です。 以下のマクロで、inputboxメソッドで質問させると、キャンセルボタンを押すと、うまいぐあいに止まります。 しかし、0を押しても、止まってしまいます。本当は、C2にゼロと表示させたいのです。 Sub 練習() Dim myR myR = Application.InputBox(prompt:="数量を入力しなさい", Type:=1) If myR = False Then Exit Sub Range("C2").Value = myR End Sub

  • エクセルVBA、入力しないと閉じないInputBox

    必ず何かを入力しないと閉じないInputBoxを作ろうと思います。 以下のコードで入力がなければ閉じないというか、Line:に戻るので、何度でも現れるInputBoxになるようですが、このやり方は正しいですか? 通常はどうやるのでしょうか? Sub test() Dim a line: a = Application.InputBox("必ず入力して下さい。", "Input!") If Len(a) = 0 Or a = False Then GoTo line MsgBox "有難う。" & a & " ですね。", , "(o。_。)oペコッ" End Sub

  • VBA inputbox関数について

    質問をさせてください。 VBA inputbox関数にて 数字を入力をし、その数字を元に挿入を行うというものを施しています。 そして下記の内容で実際は動くのですがどうしても疑問点が浮かんできます。 それはinputbox関数には宣言をしないと文字列として処理されますよね? なので、宣言をlongにして整数化をしています。 しかし、If "1" <= buf1 <= "65536" Thenの部分で 数字に""(ダブルコーテーション)を入れないとうまく作動しません。 例えば「0」を入力しても正の処理へ行います。 ダブルコーテーションで囲んでいる数値は文字列として認識されるはず・・ 入力は数値として宣言をしているのだからダブルコーテーションはいらないのではないんでしょうか? また、もし数字ではなく、記号などを入力をしてしまった場合の偽の処理へいくにはどうすれば いいでしょうか? 恐れ入りますがよろしくお願いいたします。 Sub test() Dim buf1 As Long buf1 = InputBox("コピー先の列番号を入力してください") If "1" <= buf1 <= "65536" Then Cells(buf1, 1).EntireRow.Insert Else MsgBox "正しい列番号を入力してください" Exit Sub End If End Sub

  • vba InputBox キャンセルなら

    Sub test() Dim i As Long i = InputBox("値をいれてください") 'キャンセルなら 'if then exit sub End Sub このような状態で、キャンセルボタンを押すかescキーを押したら、 'キャンセルなら 'if then exit sub でプロシージャーを抜けたいのですが、 キャンセルボタンを押すと、実行時エラー13になります。 (_型が一致しません。(Error13)) エラーを発生させずに、キャンセルさせるにはどうすればいいですか?

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • エクセルマクロ inputboxの位置

    エクセル2007です。以下のinputboxメソッドで、トップとレフトの値を変えても、inputboxの位置がとても悪いのです。K14あたりに出ます。どうしたらいいでしょうか。 Sub 練習() Dim myR myR = Application.InputBox(prompt:="数量を入力しなさい", Top:=10, Left:=30, Type:=1) If VarType(myR) = vbBoolean Then Exit Sub Range("C2").Value = myR End Sub

  • エクセルVBAについて

    エクセルVBAについて 下にある、1行目に入力された数値の、選択したセルの数値を、B5セルに表示させるマクロなのですが、1行目が結合していると、うまくB5セルに表示できません。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub    '●複数セル選択は無視  If Target.Row <> 1 Then Exit Sub    '●1行目以外の選択は無視  If Target.Column > 6 Then Exit Sub   '●F列目以降の選択は無視  If Target.Value = "" Then Exit Sub   '●選択セルが未入力なら無視    Range("B5").Value = Target.Value End Sub このマクロで、結合しているセルをB5に表示させることはできますでしょうか? 1行目で選択するセルは、すべて2つのセルが結合しています。 よろしくお願いいたします。

  • InputBox  String型・Variant

    VBAです。 InputBox  String型・Variant型がエラーにならない理由がわかりません。 Sub 日付型() Dim 日 As Date 日 = InputBox("値をいれてください") End Sub Sub 数値型() Dim i As Long i = InputBox("値をいれてください") End Sub Sub 通貨型() Dim 円 As Currency 円 = InputBox("値をいれてください") End Sub Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub Sub Variant型() Dim v As Variant v = InputBox("値をいれてください") End Sub String型・Variant型以外は、 「実行時エラー '13'; 型が一致しません。」になります。 String型・Variant型はならない理由を教えてください。ご回答よろしくお願いします。

専門家に質問してみよう