質問
2021年2月2日火曜日 7:25
MyPC:Windows 8.1 Pro(64bit),Excel2016(32bit)
下記VBA実行時、セルを選択しないで「OK」ボタンをクリックすると、「この数式には問題があります」とメッセージが表示されます。これの回避策が何か無いかと方法が解らず悪戦苦闘しています。
願わくば「MsgBox"セルが選択されていません"」とかの処理ができれば良いのですが、ご教授宜しくお願いいてします。
Sub セル選択()
On Error GoTo ErrHandl
Dim rng As Range
Set rng = Application.InputBox(Prompt:="セルを選択して下さい。", Type:=8)
On Error GoTo 0
Exit Sub
ErrHandl:
Err.Clear
End Sub
u793nabe
すべての返信 (7)
2021年2月8日月曜日 16:21 ✅回答済み
KokemomoYamamomoさん、重ね重ね回答をいただいてありがとうございました。
願いに叶った対処方法がないかWebを繰返しググっていて、
幸いにも次のサイトで願いに叶った対処方法を見つけることが出来ましたので紹介します。
https://teratail.com/questions/200242
件名: InputBoxメソッドでセルを指定させる際のキャンセル対策
≪対処方法≫
空でOKしたときの的外れなメッセージの表示を抑制するには、
「Application.DisplayAlerts」を追加する事で不愉快な現象を回避(解消)できました…問題解決
Sub セル選択2()
On Error GoTo ErrHandl
Dim rng As Range
Application.DisplayAlerts = False '←☆追記1
Set rng = Application.InputBox(Prompt:="セルを選択して下さい。", Type:=8)
Application.DisplayAlerts = True '←☆追記2
On Error GoTo 0
Exit Sub
ErrHandl:
Err.Clear
End Sub
u793nabe
2021年2月7日日曜日 3:03
このメッセージは、組み込まれているものなので、回避できないと思います。
このメッセージが表示されても、元の入力ダイアログは表示されたままで「セルを選択してください。」というメッセージは読めますので、問題ないように思いますが。
2021年2月7日日曜日 17:41
なお、どうしても組み込まれているメッセージではなくオリジナルのメッセージを表示したい、という場合には、 Application.InputBox ではなくて、これに;たオリジナルのユーザーフォームを作って、これをvbModelessで表示したところでプログラムを終わらせ、残りのプログラムを別のプログラムにして、セルを選択して又は選択しないで表示されているユーザーフォームのOKボタンをクリックすると、続きの当該別のプログラムが起動するようにすれば、実現できるでしょう。
ご参考まで。
2021年2月7日日曜日 19:01
念のため、簡単なサンプルを記しておきます。
’▼標準モジュールのコード
Sub MainPart1()
Load UserForm1
UserForm1.Show vbModeless
End Sub
Sub MainPart2()
Dim strAns As String
strAns = UserForm1.TextBox1.Value
Unload UserForm1
MsgBox strAns
End Sub
’▼UserForm1のコード(TextBox1、OKButton、CancelBottunを配置)
Private Sub OKButton_Click()
Dim RE As Object
Dim strPattern As String
If Me.TextBox1.Value = "" Then
MsgBox "セルを選択してください。"
Else
strPattern = "^\?[a-zA-Z];\?\d;(:\?[a-zA-Z];\?\d;)?$"
Set RE = CreateObject("VBScript.RegExp")
With RE
.Global = True
.ignorecase = True
.Pattern = strPattern
If .test(Me.TextBox1.Value) Then
Me.Hide
Call MainPart2
Else
MsgBox "セルを選択してください。"
End If
End With
End If
End Sub
Private Sub CancelButton_Click()
Me.Hide
MsgBox "キャンセルされました。"
Unload Me
End Sub
'▼Sheet1のコード
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If UserForm1.Visible = True Then
UserForm1.TextBox1.Value = Target.Address
End If
End Sub
以上のコードでSheet1のセルを選択するとそれらしく動くと思います。
2021年2月8日月曜日 11:50
なお、アドレスのテキストデータではなく、Rangeオブジェクトで取得したい場合は、次のように修正すれば可能です。
1. Public変数として、標準モジュールのSubプロシージャの外側上方に次の1行を記す。
Public objRange As Range
2.MainPart2()を次のように修正する。
Sub MainPart2()
Unload UserForm1
MsgBox objRange.Address
End Sub
3. Sheet1のコードに次のように1行加える。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If UserForm1.Visible = True Then
Set objRange = Target
UserForm1.TextBox1.Value = Target.Address
End If
End Sub
以上です。
泥臭いやり方のように思います。Classを使うともう少しエレガントにコードが書けるような気もしますが、どうも未熟なのでここまでです。
2021年2月8日月曜日 23:49
u793nabeさん、ご教示、ありがとうございます。
Application.DisplayAlerts = False はよく使っているのですが、所定のメッセージを表示しないでオリジナルのエラーメッセージを表示する方法というセットで考え始めてしまったので、その思い込みで、「回避できない」と記してしまいましたが、確かに最初のご質問をよく読んでみると「メッセージが表示されます。これの回避策が何か無いかと」と記されていますね。的外れな回答で申し訳ありませんでした。思い込みで良く失敗します。反省です。
2021年2月9日火曜日 0:31
KokemomoYamamomoさん、お世話になっております。
どのような返信であろうと困っている人の力になって支援する心意気に感謝しています。
これからもよろしく
u793nabe