HOME > 即効テクニック > Excel VBA > 関数関連のテクニック > ユーザーの入力を文字列で取得する(InputBox関数)

ユーザーの入力を文字列で取得する(InputBox関数)|Excel VBA

関数関連のテクニック

ユーザーの入力を文字列で取得する(InputBox関数)

(Excel 2000/2002/2003/2007/2010)

InputBox関数は、ダイアログボックスを表示してユーザーに値の入力を要求し、入力された値を文字列として取得する関数です。
引数Xpos、Yposでダイアログボックスを表示する場所を指定します。どちらか一方でも省略した場合は、水平方向は画面中央、垂直方向は画面の3分の1の位置に表示します。
また、関連付けたヘルプを表示するには、引数HelpFileとContextで設定します。

構文 InputBox(Prompt, Title, Default, Xpos, Ypos, HelpFile, Context)
設定項目 内容
Prompt ダイアログボックスに表示するメッセージを指定 [省略不可]
Title ダイアログボックスのタイトルバーの文字列を指定 [省略可能]
Default テキストボックスに表示する既定値を指定 [省略可能]
Xpos 左端の位置を画面左端からの距離(twip単位)で指定 [省略可能]
Ypos 上端の位置を画面上端からの距離(twip単位)で指定 [省略可能]
HelpFile ヘルプを設定する場合の、ヘルプファイルの名前を指定 [省略可能]
Context 表示したいヘルプトピックを表すコンテキスト番号を指定 [省略可能]

次のサンプル1は、アクティブシートの名前をユーザーに設定させるマクロです。

●サンプル1●

Sub Sample1()
    Dim myStr As String

InputSheetName:
    On Error GoTo ErrHandle
    
    myStr = InputBox(Prompt:="シート名を入力してください", _
        Default:=ActiveSheet.Name, Title:="シート名入力", XPos:=0, YPos:=0)
    
    '---(1)キャンセル時または空欄の時の処理
    If Len(myStr) = 0 Then
        MsgBox "シート名の変更をキャンセルします", vbInformation
    
    '---(2)既定値以外の文字だった場合
    ElseIf myStr <> ActiveSheet.Name Then
        MsgBox "シート名を" & myStr & "に変更します", vbInformation
        ActiveSheet.Name = myStr
    End If
    
    Exit Sub

ErrHandle:
    '---(3)エラー発生時の処理
    MsgBox Err.Description & String(2, vbCrLf) & _
            "再度入力してください", vbCritical
            
    '---入力をやりなおし
    Resume InputSheetName
End Sub

サンプル1を実行すると、入力用のダイアログボックスが画面左上端に現れます。
既定値として、アクティブシートの名前を表示します。

仮にこのまま[OK]ボタンをクリックすると、変数myStrには、テキストボックスに既定値として反転表示されている文字列が代入されます。
他のシート名と重複している場合や、命名規則に反している場合にはエラーが発生するため、ErrHandleの処理を行い、再入力を促します。
[キャンセル]ボタンをクリックした場合や、右上の[×]ボタンでダイアログを閉じた場合、また何も入力しなかった場合は、InputBox関数は空の文字列を返すので、(1)の条件式で判定します。

■空欄とキャンセルを識別する

サンプル1ではキャンセルした場合と、空欄のまま[OK]ボタンをクリックした場合を区別していませんが、要件によっては両者を区別したい場合もあります。

それには、InputBox関数が返す空の文字列を判別します。
InputBox関数が返す空の文字列には、2種類あります。

何も入力せずに[OK]ボタンをクリックした場合、
InputBox関数は「長さ0の文字列("")」を返します。
これは、 If myStr = "" Then または If Len(myStr) = 0 Then で判定します。

一方、[キャンセル]ボタン、または[×]ボタンでキャンセルした場合、
InputBox関数は「値0の文字列(vbNullString)」を返します。
これは、StrPtr関数を使って If StrPtr(myStr) = 0 Then のように判定します。

次のサンプルは、6文字以内の文字列をユーザーに入力させ、キャンセルした場合と、空欄のまま[OK]ボタンをクリックした場合を区別して処理を行います。

●サンプル2●

Sub Sample2()
    Dim myStr As String

    Do While True
    myStr = InputBox("6文字以内で文字列を入力してください")
    
        '---(1)キャンセルしたとき
        If StrPtr(myStr) = 0 Then
            MsgBox "キャンセルします"
            Exit Do

        '---(2)空欄のまま[OK]したとき
        ElseIf myStr = "" Then
            MsgBox "未入力です", vbExclamation
            
        '---(3)入力文字が6文字より長いとき
        ElseIf Len(myStr) > 6 Then
            MsgBox "文字が長すぎます", vbExclamation
        
        Else
        '---(4)入力文字が6文字以内のとき
            MsgBox "入力された文字列は「" & myStr & "」です"
            Exit Do
        End If
    Loop
End Sub

キャンセルの判定に使用している「値0の文字列(vbNullString)」は、String型の変数の初期状態を表す値です。String型の変数を初期状態に戻したり、API関数に初期状態のString型データを引数として渡すときなどに使用します。

「長さ0の文字列("")」とは別のものですが、通常はあまり区別されることはありません。
実際、「値0の文字列(vbNullString)」は、

If vbNullString = "" Then

のように、「長さ0の文字列("")」と比較してもTrueになり、

Len(vbNullString) 

としても 0 が返ります。

「値0の文字列」と「長さ0の文字列」を判別するには、String型の変数のアドレス値を返すStrPtr関数を使用します。
StrPtr関数は、String型変数を宣言した直後など、変数が「値0の文字列(vbNullString)」のとき、0を返します。
一方、変数を宣言した後、何らかの値や「長さ0の文字列("")」を代入すると、その変数のアドレス値を返します。
そこで、StrPtr関数の戻り値が0かどうかで、両者を判別します。

Dim strX As String
MsgBox StrPtr(strX)	'→ strXの値はvbNullString。0 が表示される
strX = ""
MsgBox StrPtr(strX)	'→ "" や値を代入するとアドレス値が表示される

ただし前述のように、変数myStrの値が「値0の文字列(vbNullString)」になっていても、
If myStr = "" Then や、 If Len(myStr) = 0 Then はいずれもTrueになるため、

If StrPtr(myStr) = 0 Then

のキャンセルの判定を先に行うところがポイントです。

●補足1●

StrPtr関数は非表示のメンバです。オブジェクトブラウザで[非表示のメンバを表示]をオンにすると、参照できます。

●補足2●

InputBox関数と間違いやすい機能にInputBoxメソッドがあります。
両者を比較するとInputBox関数の方が低機能ですが、文字列の入力だけであれば、こちらで十分対応できるでしょう。
逆に、数値データだけ入力させたり、セル範囲を指定させたりする場合は、InputBoxメソッドの方がよいでしょう。ケースに応じて使い分けてください。