- ベストアンサー
VBAのEXITでのエラー
- エクセルのフォームで入力したデータをシートに保存しようとしています。
- ID番号でシートからvlookupで検索を行い、データがあれば自動で個人情報を入力します。
- Private Sub TextBoxID_Exit(ByVal Cancel As MSForms.ReturnBoolean)にコマンドを記入しているのですが、終了する際にテキストボックスに値がないためエラーが発生します。どうすればエラー回避できるでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
> セルの書式設定で今まで登録していたIDは全て数値に変換したんですが・・・(/_;)。 文字列として認識されている数字は形式を数値にしてもデータは文字列(テキスト形式)のままなので、同じ値を再入力するか、空白のセルをコピーして数字のセルをすべて選択し、「形式を選択して貼り付け」で「演算」の「加算」をすることにより数値にすることができます。
その他の回答 (7)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No5の回答は、No4の補足コメントを見る前に書いたものなので、補足コメントからしたら一部ちぐはぐなものになっています。 それと、No5のコードの一部を変更します。 Set FRange = .Range("b2:E65536").Find(ID, LookIn:=xlValues, LookAt:=xlWhole) は Set FRange = .Range("b2:B65536").Find(ID, LookIn:=xlValues, LookAt:=xlWhole, MatchByte:=False) に変更してください。 半角と全角を区別しない設定で検索します。 範囲をコピペしたのでそのままになってしまったE65536はB65536でした。 何度も検査して追記されていったデータからID検索して名前とかを読み込むのですね。登録の方はあまり見てなかったので気が付きませんでした。 現状では最古のものを読み込むことになりますが、引数にSearchDirection:=xlPreviousを追加すれば最後から探す(本当はB1から探すけどB1はヒットせず逆順検索なので最後からになる)ので最新のものが読みだせます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 以前登録されたIDと同じIDで新規登録すると、新規登録したIDはヒットしますが、過去のものはヒットしません。 Vlookupは一個だけ見つけて古いもの(行番号が小さいもの)がヒットしそうなものですが、IDが数値と数字なのかもしれません。 ワークシートの検索は数値・数字関係なく全て見つけます。 実際は同じIDで登録するものなのでしょうか?としたらVlookupは使えませんし、Findを利用してもFIndNextで最後のデータを取るということになると思います。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> これまで入力していたデータのIDが検索できません ふと思ったのですが、これは今まで入力していたものが検索でみつからないということでしょうか。 IDが数値の場合、Vlookupだと数値と数字は別物として扱いますので、その影響かもしれません。 ErrHdl: 'IDがなかった場合の処理 If TextBoxシメイ.Value = "" Then MsgBox "新規です" Exit Sub End If を ErrHdl: MsgBox "エラー" & Err.Number & Chr(13) & Err.Description Exit Sub End If としてエラーを確認してください。あるのに見つからなくて、IDが数値でVlookupがエラーなら数値と数字の関係だと思います。 VlookupをやめてFindにしてみたらいかがでしょう。 Private ID As String にしておいてください。 Private Sub TextBoxID_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim FRange As Range If TextBoxID.Text = "" Then Exit Sub End If ID = TextBoxID.Text On Error GoTo ErrHdl Worksheets("data").Activate 'dataシートをアクティブにする With ActiveSheet Set FRange = .Range("b2:E65536").Find(ID, LookIn:=xlValues, LookAt:=xlWhole) If FRange Is Nothing Then MsgBox "新規です" Exit Sub End If TextBoxシメイ.Value = FRange.Offset(0, 1).Value TextBox誕生日.Value = FRange.Offset(0, 2).Value sex = FRange.Offset(0, 3).Value If sex = "M" Then OptionButton男.Value = True Else OptionButton女.Value = True End If TextBox体重.SetFocus End With Exit Sub ErrHdl: MsgBox "エラー" & Err.Number & Chr(13) & Err.Description End Sub
補足
ありがとうございます。ワークシート検索で数値と文字列関係なく検索しているというのは初耳でした。しかし、ワークシートはセルの書式設定で今まで登録していたIDは全て数値に変換したんですが・・・(/_;)。ワークシート上で登録できないIDの書式を再確認してもやはり数値になっていました。もう一度ワークシートをコピーしてやってみます。FIND関数にも変更してみます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> これまで検索できていたIDでの検索機能がすべて新規になってしまいます。 新規というのは MsgBox "新規です" が出るという事でしょうか。 でしたら、その後の処理(Vlookupとは限らない)でエラーになっているという事ですからそこを調べないと何とも言えません。 > これまで入力していたデータのIDが検索できません どこに入力していたデータでしょうか。TextBoxIDの履歴を取るようにはできていないと思いますが…。 IDはグローバル変数だと思いますから、前回の値を保持していると思いますが ID = TextBoxID.Text で上書きしていますし、履歴にはならないですよね。 Private Sub TextBoxID_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBoxID.Text="" Then Exit Sub End if は、TextBoxIDにデータがなければ_Exitの処理をしないというだけですし… 上記がない時にTextBoxIDにデータがない状態で、他のテキストボックスを選択した場合エラーになっていなかったでしょうか。
補足
ありがとうございます。dataワークシートから Worksheets("data").Activate With ActiveSheet TextBoxシメイ.Value = Application.WorksheetFunction.VLookup(ID, Range("b2:E65536"), 2, False) TextBox誕生日.Value = Application.WorksheetFunction.VLookup(ID, Range("b2:E65536"), 3, False) sex = Application.WorksheetFunction.VLookup(ID, Range("b2:E65536"), 4, False) で、これまでに登録したデータがあれば、氏名などのデータは入力の手間を省く為にvlookupでテキストボックスに値を入れています。 コマンド追記する前まではできていました。(フォーム入力する前の過去のデータを500件くらい) おかしなことに、以前登録されたIDと同じIDで新規登録すると、新規登録したIDはヒットしますが、過去のものはヒットしません。 しかし、ワークシートで検索をかけると過去のものも新規登録したものもヒットします。 何かバグでしょうか?
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 終了ボタンのプロシージャに記入しましたが、同じでした。 Private Sub TextBoxID_Exit(ByVal Cancel As MSForms.ReturnBoolean) ここに入れてください。↓でエラーですよね。 ID = TextBoxID.Text 'テキストボックスIDの値を取得
補足
ありがとうございます。さきほどやってみました。空白のままでの終了はうまくいきました。 しかし、これまで検索できていたIDでの検索機能がすべて新規になってしまいます。 このコマンドを入力してから登録した番号は検索できるのですが、これまで入力していたデータのIDが検索できません。原因が全くわからないです。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 終了する際にテキストボックスに値がないためエラーが発生します でしたら If TextBoxID.Text="" Then Exit Sub End if で抜ければいいと思います。
補足
ありがとうございます。終了ボタンのプロシージャに記入しましたが、同じでした。
- kon555
- ベストアンサー率51% (1842/3559)
想定されている挙動と現状との差がいまいち把握できないのですが、要は『処理自体は正常に行われるが、終了時にエラーを吐く』という形ですか? もしそうであれば、一番てっとり早いのは終了ボタンを作るなり、特定のフォームのデータが空白なりの条件付けで、On Error Resume Next を入れてから終了させる事です。 処理自体が正常に行われているなら、ですけど。
補足
ありがとうございます。添付画像に映ってなかったですが、下に終了ボタンと登録ボタンが作ってあります。IDにフォーカスがある状態で終了ボタンを押すとエラーになります。
お礼
毎回ありがとうございます。 次回もよろしくお願いいたします。
補足
ありがとうございました。 うまくいきました。 If TextBoxID.Text = "" Then Exit Sub End If を記入してから検索ができなくなったのではなく、数値と数字(文字)が混在していたようです。kkkkmさんの指摘からワークシートを検証したら判明しました。私だけが登録していたのではなく数人で登録していたので混在していたようです。また、0から始まるIDもあったので、一部文字入力していたようです。全て文字に変換してFINDを利用して解決しました。 ありがとうございました。 また、別問題ができましたので、またお知恵を拝借できればと思います。 TextBox誕生日.Value = Application.WorksheetFunction.VLookup(ID, Range("b2:E65536"), 3, False) での値を日付形式でTEXTBOXに引っ張りたいのです。 別スレッド立てますのでまたよろしくお願いいたします。