【VBA】InputBoxのキャンセルを適切に処理するやり方~3つの判定方法で完全解決~
VBAでInputBoxを使っていて「キャンセルボタンを押したのに処理が続いてしまう」「空の入力なのかキャンセルなのか分からない」といった問題に悩んでいませんか?
実は、InputBoxは通常の方法ではキャンセル判定が正しく行えません。
この記事では、
StrPtr関数、Application.InputBoxメソッド、Variant型変数を使った3つの確実なキャンセル判定方法を、
実際のコードサンプルと共に分かりやすく解説します。
初心者の方でも今すぐ実践できる内容で、業務でよく発生するトラブル事例と対処法も紹介。この記事を読めば、InputBoxのキャンセル処理を完全にマスターできます。
VBA InputBoxキャンセル処理が必要な理由とは?
VBAでInputBoxを使用する際、キャンセルボタンが押された場合の処理を適切に行わないと、プログラムが予期しない動作をしてしまいます。
この問題が発生する原因は、
InputBoxがキャンセル時に空文字列(“")を返すから
です。
そのため、ユーザーが何も入力せずにOKボタンを押した場合とキャンセルボタンを押した場合を区別することが困難になります。
InputBoxを使用する際は適切なキャンセル処理を実装し、エラーの発生を防ぎましょう。
InputBoxの基本的な動作とキャンセル時の挙動
InputBox関数は、ユーザーからの入力を受け付けるダイアログボックスを表示するVBAの標準関数です。
この関数は、通常の入力値を文字列として返しますが、キャンセルボタンが押された場合は空文字列(“")を返します。
InputBox関数を使った基本的なサンプルコードがこちら
Sub tesuto()
Dim userInput As String
userInput = InputBox("名前を入力してください")
MsgBox "入力値: " & userInput
End Sub
上記のコードでは、
表示されるInputBoxにテキストを入力するとメッセージボックスに入力したテキストが表示される
という内容です。
簡単にInputBoxを表示させることができるのですが、
空欄でOKを押すと「入力値: 」、キャンセルボタンを押すと「入力値: 」と同じ結果が表示されてしまう
という問題点があります。
実行結果がこちら
実際に何も入力されていない状態とキャンセルされた状態が区別できないので注意が必要です。
空文字列(“")とキャンセルの違いを理解する重要性
空文字列とキャンセルの違いを正しく理解することは、堅牢なVBAプログラムを作成するために欠かせません。
ユーザーが何も入力せずにOKボタンを押した場合、これは「空の入力」として処理、キャンセルボタンを押した場合は「処理の中止」として処理するのが理想的ですよね。
空欄とキャンセルの区別ができていないダメなサンプルコードがこちら
Sub tesuto()
Dim result As String
result = InputBox("データを入力してください")
If result = "" Then
MsgBox "何も入力されていません" ' これでは区別できない
End If
End Sub
上記のコードは
変数resultが空欄の場合、「何も入力されていない」というメッセージボックスを表示する
という内容です。
一見、空欄とキャンセルを区別できそうですができていません。
実行結果がこちら
この区別ができないと、
キャンセルしたのに処理が続行されたり、逆に空の入力を受け付けなかったりする問題に繋がる
ので注意してください。
実際の業務で起こりがちなトラブル事例
業務システムでInputBoxを使用する際、キャンセル処理が適切でないと様々な問題が発生します。
最も多いのは、データベースへの登録処理でキャンセルしたにも関わらず、空のデータが登録されてしまうケースです。
キャンセル処理が実装されていないVBAのサンプルコードがこちら
Sub DataInput()
Dim empName As String
empName = InputBox("社員名を入力してください")
' キャンセル判定なしの危険なコード
Cells(1, 1).Value = empName ' 空文字列が入力される
End Sub
上記のコードは
InputBoxに入力した値をA1セルに反映させる
という内容です。
このコードでは、キャンセルされても空文字列がセルに入力されてしまいます。
実行結果がこちら
また、ファイル名の入力処理でキャンセルされた場合に、拡張子のみのファイルが作成されてしまうトラブルも頻繁に発生します。
これらの問題を防ぐためには、適切なキャンセル判定が必要不可欠です。
【方法1】StrPtr関数を使った確実なキャンセル判定
StrPtr関数を使用したキャンセル判定は、最も確実で推奨される方法です。
この関数は、
文字列のポインタを返しキャンセル時は0を返す
という特性があります。
空文字列の場合は0以外の値を返すため、キャンセルの判定が可能。
StrPtr関数を使って、InputBoxの戻り値を正確に判定し適切な処理分岐を実装してみましょう。
StrPtr関数の基本的な仕組みと動作原理
StrPtr関数は、
文字列データがメモリ上に格納されている場所のアドレス(ポインタ)を返す
という処理をします。
通常の文字列や空文字列はメモリ上に領域を確保するため0以外の値を返しますが、InputBoxでキャンセルされた場合は特別な処理により0が返されます。
StrPtr関数の処理が確認できるサンプルコードがこちら
Sub testo()
Dim testStr As String
testStr = ""
Debug.Print StrPtr(testStr) ' 0以外の値(例:1234567)
' キャンセル時は0が返される
Dim result As String
result = InputBox("データを入力してください")
Debug.Print StrPtr(result)
End Sub
4行目のコードは、空欄のときのStrPtr関数の結果を表示する
8行目のコードは、InputBoxをキャンセルしたときのStrPtr関数の結果を表示する
という内容です。
実行結果がこちら
この仕組みにより、文字列の内容ではなくメモリアドレスを参照することで、キャンセルされたかどうかを確実に判定できます。
StrPtr関数によるキャンセル判定の実装コード
StrPtr関数を使用したキャンセル判定の実装は、非常にシンプルで効果的です。
戻り値を一度変数に格納し、StrPtr関数で判定することで確実にキャンセルを検出できます。
StrPtr関数を使ったキャンセル処理検出VBAのサンプルコードがこちら
Sub InputWithCancelCheck()
Dim userInput As String
userInput = InputBox("名前を入力してください")
If StrPtr(userInput) = 0 Then
MsgBox "キャンセルされました"
Exit Sub
ElseIf userInput = "" Then
MsgBox "空文字列が入力されました"
Else
MsgBox "入力値: " & userInput
End If
End Sub
上記のコードは、
空欄の時は「空文字列が入力されました」、テキストを入力したときは「入力値:〇〇」、キャンセルしたときは「キャンセルされました」とメッセージボックスで表示する
という内容です。
実行結果がこちら
StrPtr関数を活用してInputBoxを導入しましょう。
StrPtr関数使用時の注意点とエラー対策
StrPtr関数の注意点は、
関数の戻り値を直接判定せず必ず変数に格納してから処理すること、64ビット版Excelでは戻り値がLongPtrデータ型になるため適切な型宣言が必要
の2つです。
64ビット版のStrPtr関数を使ったサンプルコードがこちら
Sub testo()
#If VBA7 Then
Dim ptr As LongPtr
#Else
Dim ptr As Long
#End If
Dim result As String
result = InputBox("データを入力してください")
ptr = StrPtr(result)
If ptr = 0 Then
MsgBox "キャンセルされました"
End If
End Sub
デバッグ時は、StrPtr関数の戻り値をイミディエイトウィンドウで確認することで、正しく動作しているかを検証できるのでおすすめです。
関連記事「デバックの方法」では、イミディエイトウィンドウの活用法などが紹介されています。
[blogcard url="https://mamemametochan.com/excel-19/"]
【方法2】Application.InputBoxメソッドでFalse判定
Application.InputBoxメソッドは、InputBox関数とは異なる動作をするため、キャンセル判定に活用できます。
このメソッドはキャンセル時にFalse値を返すため、Boolean型での判定が可能です。
Type引数を使用することで、入力値の型を指定でき、より厳密な入力制御が可能ですが、InputBox関数とは戻り値の型が異なるため、適切なデータ型での受け取りが重要です。
Application.InputBoxメソッドを使用することで、シンプルで分かりやすいキャンセル処理を実装できます。
InputBox関数とInputBoxメソッドの違いを徹底解説
InputBox関数とApplication.InputBoxメソッドは、名前は似ていますが全く異なる動作をします。
InputBox関数は常に文字列を返す
Application.InputBoxメソッドはType引数により戻り値の型を変更でき、キャンセル時はFalse値を返す
という違いがあります。
InputBox関数とApplication.InputBoxメソッドの違いを比較できるサンプルコードがこちら
Sub testo()
' InputBox関数の場合
Dim result1 As String
result1 = InputBox("数値を入力してください")
' キャンセル時は空文字列("")が返される
' Application.InputBoxメソッドの場合
Dim result2 As Variant
result2 = Application.InputBox("数値を入力してください", Type:=1)
' キャンセル時はFalse値が返される
End Sub
実行結果がこちら
キャンセルしたときの結果に明確な違いがあります。
この違いを利用することでより直感的なキャンセル判定の実装が可能です。
また、Type引数により入力値の型チェックも自動で行われるため、データ検証の手間を省くことにも繋がります。
InputBoxメソッドを使ったキャンセル判定の実装例
Application.InputBoxメソッドを使用したキャンセル判定は、戻り値をVariant型で受け取り、Boolean判定を行います。
この方法は、コードが読みやすく、初心者にも理解しやすいという利点があります。
Application.InputBoxメソッドを使ったサンプルコードがこちら
Sub InputBoxMethodExample()
Dim result As Variant
result = Application.InputBox("年齢を入力してください", Type:=1)
If result = False Then
MsgBox "キャンセルされました"
Exit Sub
End If
MsgBox "入力された年齢: " & result & "歳"
End Sub
上記のコードは、
Type:=1により数値のみの入力を受け付け、キャンセル時はFalse値で判定する
という内容です。
文字列が入力された場合は自動的に再入力を促すダイアログが表示されるため、データの整合性も保たれます。
文字列を入力した実行結果がこちら
Type引数を活用した高度な入力制御方法
Application.InputBoxメソッドのType引数を使用することで、入力値の型を厳密に制御できます。
数値、文字列、論理値、範囲など、様々な型を指定することで、より堅牢な入力処理が可能。
Application.InputBoxメソッドのType引数を使ったサンプルコードがこちら
Sub AdvancedInputControl()
Dim cellRange As Variant
' Type:=8でセル範囲を指定
cellRange = Application.InputBox("範囲を選択してください", Type:=8)
If cellRange = False Then
MsgBox "キャンセルされました"
Exit Sub
End If
MsgBox "選択範囲: " & cellRange.Address
End Sub
Type引数の主な値は、1(数値)、2(文字列)、4(論理値)、8(セル範囲)、16(エラー値)、64(配列)です。
これらを組み合わせることで、複数の型を同時に受け付けることも可能です。
この機能により、ユーザーの入力ミスを事前に防ぎ、品質の高いVBAプログラムを作成できます。
【方法3】Variant型変数を使った型判定によるキャンセル処理
Variant型変数を使用したキャンセル判定は、VBAの柔軟なデータ型システムを活用した方法です。
InputBoxの戻り値をVariant型で受け取り、VarType関数やIsEmpty関数を使用して型や状態を判定します。
この方法は、複雑な条件分岐が必要な場合に特に有効で、一つの変数で複数の状態の管理が可能です。
ただし、
Variant型は処理速度が若干遅くなるため、パフォーマンスが重要な場合は注意しましょう。
Variant型変数の特性を活用したキャンセル判定
Variant型変数は、VBAの中で最も柔軟なデータ型で、様々な値や状態を格納できます。
InputBoxの戻り値をVariant型で受け取ることで、文字列、数値、論理値、さらには特殊な状態の判定が可能です。
InputBoxの戻り値をVariant型で受け取るサンプルコードがこちら
Sub VariantCancelCheck()
Dim userInput As Variant
userInput = InputBox("データを入力してください")
' Variant型の特性を利用した判定
If VarType(userInput) = vbString Then
If userInput = "" Then
MsgBox "空文字列が入力されました"
Else
MsgBox "入力値: " & userInput
End If
End If
End Sub
Variant型の特性により、変数に格納された値の型を動的に判定できるため、より細かな処理分岐が可能になります。
この方法は、データの種類が事前に分からない場合や、複数の型を扱う必要がある場合に特に効果的です。
IsEmpty関数・VarType関数を使った判定方法
IsEmpty関数とVarType関数を組み合わせることで、Variant型変数の状態を詳細に判定できます。
IsEmpty関数は変数が初期化されていない状態を検出し、VarType関数は変数に格納されている値の型を返します。
IsEmpty関数とVarType関数を組み合わせたサンプルコードがこちら
Sub DetailedVariantCheck()
Dim result As Variant
result = Application.InputBox("値を入力してください", Type:=2)
If result = False Then
MsgBox "キャンセルされました"
ElseIf IsEmpty(result) Then
MsgBox "未初期化状態です"
ElseIf VarType(result) = vbString Then
If Len(result) = 0 Then
MsgBox "空文字列が入力されました"
Else
MsgBox "文字列: " & result
End If
End If
End Sub
VarType関数の戻り値(vbString=8、vbInteger=2、vbBoolean=11など)を使用することで、値の型に応じた適切な処理を実装できます。
この方法により、入力値の検証とキャンセル判定を同時に行うことができます。
関連記事「変数の型を調べるVarType関数の使い方」では、VarType関数の特徴を詳しく紹介しています。
[blogcard url="https://mamemametochan.com/excel-120/"]
複雑な条件分岐における型判定の活用法
複雑な業務システムでは、複数の条件を組み合わせた判定が必要になることがあります。
こんなときは、Variant型変数と型判定関数の組み合わせで様々な状況に対応できる処理を実装しましょう。
様々な状況に対応できるInputBoxを使ったサンプルコードがこちら
Sub ComplexConditionCheck()
Dim inputValue As Variant
inputValue = Application.InputBox("数値または文字列を入力", Type:=1 + 2)
Select Case True
Case inputValue = False
MsgBox "キャンセルされました"
Case VarType(inputValue) = vbDouble
If inputValue > 0 Then
MsgBox "正の数値: " & inputValue
Else
MsgBox "負の数値または0: " & inputValue
End If
Case VarType(inputValue) = vbString
If Len(inputValue) > 10 Then
MsgBox "長い文字列: " & Left(inputValue, 10) & "..."
Else
MsgBox "短い文字列: " & inputValue
End If
End Select
End Sub
上記のコードは、
Type引数で複数の型を受け付け(1+2=数値+文字列)、型判定により適切な処理を選択する
という内容です。
Select Case文を使用することで、複雑な条件分岐も読みやすく実装できます。
実践的なサンプルコードとトラブルシューティング
実際のエクセル業務で使用できる実践的なサンプルコードを紹介します。
エラーハンドリング、入力値検証、ユーザビリティの向上を考慮し、開発中によく発生するトラブルとその対処法についても併せて解説しています。
これから紹介するサンプルコードをエクセル業務の効率化に役立ててください。
入力値検証機能付きInputBox処理の完全版コード
業務システムで使用する場合、単純なキャンセル判定だけでは不十分です。
入力値の検証、エラーハンドリング、再入力機能を組み合わせた完全版のコードを実装する必要があります。
Function GetValidatedInput(prompt As String, title As String) As String
Dim userInput As String
Dim isValid As Boolean
Do
userInput = InputBox(prompt, title)
' キャンセル判定
If StrPtr(userInput) = 0 Then
GetValidatedInput = ""
Exit Function
End If
' 空文字列チェック
If Len(Trim(userInput)) = 0 Then
MsgBox "入力値が空です。再度入力してください。"
isValid = False
' 長さチェック
ElseIf Len(userInput) > 50 Then
MsgBox "入力値が長すぎます(50文字以内)。"
isValid = False
Else
isValid = True
End If
Loop Until isValid
GetValidatedInput = userInput
End Function
上記のコードは、
キャンセル判定、空文字列チェック、文字数制限を組み合わせた実用的なInputBox処理を関数として使用する
という内容です。
戻り値が空文字列の場合はキャンセルされたことを示し、有効な入力値の場合はその値を返します。
関連記事「Functionプロシージャの使い方とは?」では、自分で複雑な処理をする関数を作れるFunctionプロシージャの使い方が紹介されています。
[blogcard url="https://mamemametochan.com/excel-16/"]
よくあるエラーとその対処法
InputBoxのキャンセル処理で最も多く発生するエラーが、
型の不一致エラーとNull値の処理エラー
です。
これらのエラーは、適切な型宣言と事前チェックにより防ぐことができます。
エラーハンドリングを実装したInputBoxのサンプルコードがこちら
Sub ErrorHandlingExample()
On Error GoTo ErrorHandler
Dim numericInput As Variant
numericInput = Application.InputBox("数値を入力してください", Type:=1)
If numericInput = False Then
MsgBox "キャンセルされました"
Exit Sub
End If
' 数値範囲チェック
If numericInput < 0 Or numericInput > 100 Then
Err.Raise vbObjectError + 1, , "数値は0から100の間で入力してください"
End If
MsgBox "入力された数値: " & numericInput
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
上記のコードは、
On Error文を使って、予期しないエラーが発生した場合でもプログラムの実行を継続。エラー発生をメッセージボックスで表示する
という内容です。
関連記事「On Error Resume Nextの使い方」では、エラーを無視する方法が詳しく紹介されています。
[blogcard url="https://mamemametochan.com/excel-125/"]
デバッグ時に役立つ確認ポイント
InputBoxのキャンセル処理をデバッグする際は、変数の値と型を正確に確認することが重要です。
イミディエイトウィンドウを活用すれば、リアルタイムで値を監視しながらデバッグを行うことができます。
デバックのしやすいサンプルコードがこちら
Sub DebugExample()
Dim testInput As String
testInput = InputBox("テスト入力してください")
' デバッグ用の確認コード
Debug.Print "入力値: [" & testInput & "]"
Debug.Print "文字列長: " & Len(testInput)
Debug.Print "StrPtr値: " & StrPtr(testInput)
Debug.Print "型: " & VarType(testInput)
' ブレークポイントを設定してステップ実行
Stop
End Sub
Debug.Print文を使用することで、変数の状態をイミディエイトウィンドウで確認できます。
Stop文でブレークポイントを設定し、F8キーでステップ実行を行うことで、処理の流れを詳細に追跡することが可能です。
関連記事「デバックの方法」では、ブレークポイントを設定方法などが紹介されています。
[blogcard url="https://mamemametochan.com/excel-19/"]
VBA初心者が『InputBoxを活用したVBA』を導入する方法
VBAなんて扱ったことないけど、InputBoxで使いやすいエクセルVBAを導入したい!
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、
今では自分で効率化マクロをサクッと導入しちゃいます。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。
いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。
あなたに合った方法で導入しちゃいましょう。
マクロ開発を外注に依頼する
マクロ開発を外注に依頼する方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなデータ抽出作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。
ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。
疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』することで、
すぐに使っているエクセルにマクロを導入することができます。
VBA初心者でも形になっているマクロをゲットできる、費用が安い、
というメリットがあります。
しかし、
想定するマクロを見つけることが難しい、業務内容に合わせるためのアレンジが必要
というデメリットもあります。
ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『InputBoxを導入したマクロ』『InputBoxで入力作業の効率をアップするマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。
ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい内容のコードを書くだけ
です。
【VBA InputBox 使い方】【VBA テキストボックスで入力】でネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。