[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オブジェクト変数またはWithブロック変数が設定されていません。を回避したい』(BABA)
銀行別の支店名を入力し、別シートを参照して支店コード.txtへ下記コードで表示しています。
Private Sub 支店名_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim r As Range, rTmp As Range, searchRng As Range
If 支店名.Value = "" Then Exit Sub
Set searchRng = Worksheets("銀行別支店コード").Columns("C:C")
Set r = searchRng.Find(支店名.Value, LookIn:=xlValues, lookat:=xlWhole)
Set rTmp = r
Do While Cells(r.Row, "A").Value <> 金融機関名.Value
Set r = searchRng.FindNext(r)
If r.Address = rTmp.Address Then
Exit Do
End If
Loop
If Not r Is Nothing Then
支店コード.Value = r.Offset(0, 1).Value
Else
支店コード.Value = ""
End If
End Sub
しかし該当支店がない場合「オブジェクト変数またはWithブロック変数が設定されていません。」とエラーになり、デバックすると「Do While Cells(r.Row, "A").Value <> 金融機関名.Value」が反転しています。
該当支店が無ければ、Msgで「登録がありません」と表示し、手入力できるようにしたいのですが何処でMsgを出し、どのようなコードで回避したらよいか教えていただけませんでしょうか?
ご指南のほど、よろしくお願いいたします。
< 使用 Excel:Office365、使用 OS:Windows10 >
【参考】 [[20220728164132]] 『ユーザーフォームで銀行に対応した支店コードの入力ができません』(ケイコ)
(もこな2) 2022/08/01(月) 15:56
質問内容とは関係ないですが、 Do ループからExit Do するときは、支店名は一致するけど、金融機関名で一致するのがない場合です Exit Do する直前に Set r = Nothing いれとかないとヤバくないですか? (´・ω・`) 2022/08/01(月) 16:29
__A___ _____B____ ___C__ ___D__
1 銀行名 銀行コード 支店名 支店コード
2 A銀行 0001 本店 000
3 A銀行 0001 支店1 001
4 A銀行 0001 支店2 002
5 B銀行 0002 本店 001
6 B銀行 0002 支店1 002
おそらく↑のようなレイアウトだとおもうのですが、[[20220728164132]]でも述べたように、Findメソッドで複数の条件をキーにするという発想自体がイマイチだとおもうんですよね。
ただ、まぁFind(FindNext)メソッドでは無理なのかと言われれば、↓のような感じであればできるかもしません。
興味があれば、ステップ実行して研究してみてください
※ユーザーフォームを用意するのが面倒なのでテストはしてません。ミスっていたらごめんなさい。
Private Sub 支店名_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim r As Range
Dim 最初のセル番地 As String
Dim フラグ As Boolean
Set r = Worksheets("銀行別支店コード").Columns("C:C").Find(支店名.Value, LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
MsgBox "どの金融機関にも「" & 支店名.Value & "」はありません"
Exit Sub
End If
If r.Offset(, -2).Value = 金融機関名.Value Then
'▼1発目で見つかった場合
支店コード.Value = r.Offset(, 1).Value
フラグ = True
Else
最初のセル番地 = r.Address
Do While 最初のセル番地 <> r.Address
r = Worksheets("銀行別支店コード").Columns("C:C").FindNext(r)
If r.Offset(, -2).Value = 金融機関名.Value Then
'▼2発目でみつかった場合
支店コード.Value = r.Offset(, 1).Value
フラグ = True
Exit Do
End If
Loop
End If
If フラグ = False Then
'▼最後まで見つからなかった場合
支店コード.Value = "該当金融機関なし"
End If
End Sub
(もこな2) 2022/08/01(月) 17:44
(BABA) 2022/08/01(月) 18:38
■2
>助かりました。
こちらの意図としては、完成品のプレゼントではなく研究用のコードを提供したつもりですので、きちんと理解したうえで必要な部分だけご自身のコードに取り込んでください。
■3
やんわりと書いたつもりですが、[[20220728164132]]と同じ方ですよね。
掲示板のルール上ダメとはなっていないと思いますが、ニックネームをコロコロ変えることにメリットはないと思いますので、何れかに統一することをお勧めします。
※あまりに状況が似通っているので同じ方だとおもいますが、万が一ちがっていらごめんなさい。
===以下、[[20220728164132]]と同じ方と仮定してのコメントです。===
■4
指摘を受けてChangeイベントからExitイベントに変更されたようですが、やはりどうしても「テキストボックス」を使うことにはこだわりたいのでしょうか?
テキストボックスを使うからこそ、コードが割り当てられていないものを"入力"する可能性が出てくるわけですよね。
>該当支店が無ければ、Msgで「登録がありません」と表示し、手入力できるようにしたい
↑のようなことをおっしゃっていますが、本来はそれは【マスタメンテナンス】の分野であって入力時(コード検索時)にやるようなことではないとおもいます。
よってコード検索についてVBA的に解決を図るならばこういうアプローチになっていくように思います。
【ユーザーフォームモジュールに記述】
Option Explicit
Dim 銀行dic As Object
Dim 支店Dic As Object
'====================================================================================
Private Sub UserForm_Initialize()
Dim i As Long
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
With Worksheets("銀行別支店コード")
On Error Resume Next
For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
myDic.Add .Cells(i, "A").Value, .Cells(i, "B").Value
Next i
On Error GoTo 0
End With
Set 銀行dic = myDic
Me.ComboBox1.List = myDic.keys
End Sub
'====================================================================================
Private Sub ComboBox1_Change()
Dim i As Long
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
Me.Label1 = 銀行dic.Item(ComboBox1.Value)
With Worksheets("銀行別支店コード")
On Error Resume Next
For i = 2 To .Cells(.Rows.Count, "C").End(xlUp).Row
If .Cells(i, "A").Value = Me.ComboBox1.Value Then myDic.Add .Cells(i, "C").Value, .Cells(i, "D").Value
Next i
On Error GoTo 0
End With
Set 支店Dic = myDic
Me.ComboBox2.List = myDic.keys
Me.ComboBox2.Value = ""
End Sub
'====================================================================================
Private Sub ComboBox2_Change()
If Me.ComboBox2.Value = "" Then
Me.Label2 = ""
Else
Me.Label2 = 支店Dic(ComboBox2.Value)
End If
End Sub
※1 各オブジェクトについて細かい説明は省きます(オブジェクト名からわかりますよね) ※2 filter関数とか多段配列使えばいいのかもしれませんが、そこまで詳しくないので、より効率の良いアプローチは諸兄姉にお任せします。
(もこな2) 2022/08/02(火) 13:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.