VBAの入力ボックスのデータ型について

このQ&Aのポイント
  • VBAのInputBox関数を使用してデータを入力する際、String型とVariant型以外のデータ型を指定すると実行時エラーが発生します。
  • String型とVariant型はエラーにならない理由は、InputBox関数が文字列や任意のデータ型の値を受け入れることができるためです。
  • 一方、他のデータ型を指定すると、InputBox関数はそのデータ型に合わせた値を返す必要がありますが、受け取った値を指定されたデータ型に変換できない場合はエラーになります。
回答を見る
  • ベストアンサー

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型はならない理由を教えてください。ご回答よろしくお願いします。

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

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.4

>「キャンセル」を押した場合もエラーにならないのでしょうか? 端的に言うなら、「キャンセル」を押した場合にエラーになるというのが 貴方の思い込みだからです。 ヘルプの InputBox 関数のページには、解説としてキャンセルを押した ときの動作が説明されています。その通りに動いているだけです。 関数は説明書に書かれている通りの動きしかしないのです。 読まないと分からない事です。

ikujyhtg
質問者

お礼

>「キャンセル」を押した場合にエラーになるというのが 貴方の思い込みだからです。 私の思い込みでしたね。 失礼しました。 ヘルプをよく読んでみます。 ありがとうございました。

その他の回答 (3)

  • uruz
  • ベストアンサー率49% (417/840)
回答No.3

>「String型のデータを返す場合はエラーにならない」という事はわかりましたが どうして 「どうして」と言われても... 先の回答に書いたように「InputBox関数はString型のデータを返す関数だからです。」としか... 「String型のデータを返す場合」とありますが、InputBox関数がString型以外の値を戻すことはありません。必ずString型です。 入力BOXに数値として123を入れてもInputBox関数が返す値はString型の"123"という文字列を返します。 これを数値としたい場合はキャスト関数( Cint() Clng() Csng() Val()など)で変換する必要があります。 >「キャンセル」を押した場合もエラーにならないのでしょうか? 「キャンセル」を押した場合もString型の文字列を返します。 返される値は空白の文字列( "" )です

ikujyhtg
質問者

お礼

何度もお答えいただいてすいません。 たしかに「なんで」「どうして」と聞かれても困りますよね。 「InputBox関数はString型のデータを返す関数だからです」 で覚えます。。 ありがとうございました。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

このプログラムは入力した値によって動作が変わりますよ? VB は何とか自力での変換を試みます。 それでも変換できなかったときに実行時エラーを出します。 > String型・Variant型以外は、 > 「実行時エラー '13'; 型が一致しません。」になります。 日付や数値に変換可能な値を入力すれば、エラーにならないのでは? > InputBox  String型・Variant型がエラーにならない理由がわかりません。 文字を1文字も入力しなかった場合の事を言っていますか??? 長さ0の文字列は、文字列として有効です。(※プログラム上では "" で表す。) Variant型も同じですね。

ikujyhtg
質問者

お礼

>このプログラムは入力した値によって動作が変わりますよ? そうでしたね。 私はInputboxで「キャンセル」をしたときの動作で実験してました。 説明不足ですいません。 ありがとうございました。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.1

InputBox関数はString型のデータを返す関数だからせす。 Variant型の変数は特殊な変数型で全ての型の値を収納できます。 ○ String型=String型 ○ Variant型=String型 × Long型=String型 ○ Long型=Clng(String型) ただし、数値に変換可能なStringデータあること

ikujyhtg
質問者

お礼

ご回答ありがとうございます。 「String型のデータを返す場合はエラーにならない」という事はわかりましたが どうして Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub を実行して、「キャンセル」を押した場合もエラーにならないのでしょうか? 度々質問してすいません。 また >Long型=Clng(String型) >ただし、数値に変換可能なStringデータあること と言うのは、 インプットボックスに入れる値が大文字の「2」の場合 数値に変換できるから大丈夫という事ですね!

関連するQ&A

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • InputBoxについて

    Sub test1() Dim tmp As String tmp = Application.InputBox("testです") End Sub Sub test2() Dim tmp As String tmp = InputBox("testです") End Sub この二つのコードを比較すると、 test1の方は、ダイアログボックスのタイトルに「入力」が表示され、 四角いインプットボックスが表示されます。 test2の方は、私がいつも使っているインプットボックスなのですが、 「tmp =」と 「InputBox」の間に何かコードが省略されてるのでしょうか? Application.を付ける事によって、形が変わってしまうのでしょうか? また、オブジェクトブラウザを見ると 【1】Function InputBox(Prompt As String, [Title], [Default], [Left], [T Excel.Application のメンバ 【2】Function InputBox(Prompt, [Title], [Default], [XPos], [YPos], [Help VBA.Interaction のメンバ がありましたが、 test1、test2それぞれどちらの事なのでしょうか?

  • Variant型で宣言してるのにEmptyになる

    エクセルVBA2003について質問です。 Sub aaa1() Dim a As Variant Debug.Print TypeName(a) End Sub を実行してイミディエイトウインドウで確認すると Emptyが返ってきます。 Variantが返ってこない理由は何でしょうか? また、変数の方の宣言をしない場合は Variant型になるはずなのに Sub aaa2() Dim a Debug.Print TypeName(a) End Sub を実行すると、同じくEmptyが返ってきます。 Variantが返らない理由を教えてください。よろしくお願いします。

  • vba InputBox キャンセルなら

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

  • 「内部処理形式 String の Variant」

    「内部処理形式 String の Variant」とは? VBAでCurDirのヘルプを見ると -------------------------------------------- 指定したドライブの現在のパスを表すバリアント型 (内部処理形式 String の Variant) の値を返します。 -------------------------------------------- と記載されるのですが 「内部処理形式 String の Variant」の意味がよくわかりません。 Sub test() Debug.Print TypeName(CurDir) End Sub を実行すると、Stringが返ってきましたが 「内部処理形式 String の Variant」という事は、「String」と言う意味ですか?

  • Excelのinputboxでのエラーについて

    線を引く構文を作り動作はするのですが、inputboxでウインドウの「×」や「キャンセル」ボタンを押すとエラーになるのを回避したいのですが、判りません。ご教示お願いいたします。 Sub 赤太線引き() Dim i As String i = Application.InputBox("線を伸縮できます" + Chr(13) + "数値を増してください", "オプション", 1, Type:=1) Dim T1 As Single, L1 As Single Dim T2 As Single, L2 As Single Dim myShp As Shape With Range("ah61") T1 = .Top L1 = .Left End With With Range("cg60") T2 = .Offset(1, 1).Top L2 = .Offset(1, 1).Left End With ActiveSheet.Shapes.AddLine(L1 + i, T1, L2, T2).Select With Selection.ShapeRange.Line .Visible = msoTrue .Style = msoLineSolid .Weight = 15# .ForeColor.SchemeColor = 10 Selection.ShapeRange.ZOrder msoSendToBack End With Range("bq56").Select End Sub VBAの素人ですが、×やキャンセルでは「i」が返せないのだと思います。よろしくお願い致します。 inputboxは関数でもメソッドでもどちらでもいいのですが。

  • キャンセルボタンをクリックしたかどうかを取得したい

    InputBoxでもしキャンセルボタンが押されたら・・・ってどうやればいいですか? Sub あああ() Dim a As String a = InputBox("文字を入れてください。") MsgBox a End Sub をした時に、キャンセルボタンをクリックしたかどうかを取得したいのですが、どうすればいいんですか? a = InputBox("文字を入れてください。") の次に Cancel = True をいれても vbCancel = True をいれてもエラーになります。 Sub あああ() Dim a As String a = InputBox("文字を入れてください。") If a = "" Then MsgBox "キャンセルが押されました" End If End Sub これだとOKでもキャンセルでもメッセージが表示されます。

  • Excel2003VBA Variantについて

    教えてください。 下記にxのコードとyのコードとwのコードとを記載しました。 この内、 wのコード、xのコードでは(3)も含めノーエラーで終わるのですが、 yのコードでは(3)でエラーになってしまいます。 エラー内容は 「インデックスが有効範囲にありません。」 です。 どうしてでしょうか? ご教示をお願い致します。                記 Sub w() Dim B As Variant     ReDim B(1) '・・・(1)     ReDim B(5) '・・・(2)     ReDim B(10)     ReDim Preserve B(15) '・・・(3) End Sub Sub x() Dim B As Variant     ReDim B(1)     B = Split("B4:C15,D4:E15,F4:G15,B4:G15", ",") '・・・(1)     ReDim Preserve B(5) '・・・(2)     ReDim B(10)     ReDim Preserve B(15) '・・・(3) End Sub Sub y() Dim B As Variant     ReDim B(1) '・・・(1)     ReDim B(5) '・・・(2)     B = Evaluate("row(A1:A10)")     ReDim Preserve B(15) '・・・(3) End Sub                          以上

  • VisualBasic でInputbox関数を使う方法について

    入力ボックスを表示し、その中に入力された数値を変数に格納したいのですが、.NETのときは動作したのですが、VB2005ですと、エラーとなってしまいます。何か設定項目があるのでしょうか?ご教示お願い致します。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Decimal i = InputBox("メッセージ", "値を取得") End Sub End Class なお、helpから検索したVisual Basic 言語リファレンスの「InputBox 関数 (Visual Basic)参照 使用例」に掲載されているソースをそのまま実行してもエラーが帰ってきます。

  • application.inputbox 空白時に

    こんにちは。EXCEL VBA初心者です。 application.inputbox でセル範囲を取得する場合、空白の場合は iを次に進ませたいのですが、 何か方法はないでしょうか? Sub test1() Dim Target As Range Dim i As Integer i = 1 For i = 1 To 5 Set Target = Application.InputBox("セルを選択してください", Type:=8) MsgBox i Next i End Sub

専門家に質問してみよう