
ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、1つ目だけ該当して、2件目以降を検索する結果セルには該当があってもなくてもNothingが返ってきてしまいます。
Workbooks.Open Filename:="000" & intNendo & strHanki,UpdateLinks:=0
Range("A1").Select
With Range("A1:A37")
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not 結果セル Is Nothing Then
最初アドレス = 結果セル.Address
Do
strIdousyaName = Cells(結果セル.Row, 5).Value
For intteamName2 = 2 To LastTeam
Windows(strBookname).Activate
Sheets("名簿").Select
TeamName2 = Cells(intteamName2, 2).Value
'異動先チーム名簿は飛ばす
If TeamName2 <> TeamName1 Then
Workbooks.Open Filename:=mypath & "チーム名簿\" & TeamName2 & "000" & intNendo & strHanki, UpdateLinks:=0
With Worksheets(1).Range("A6:A37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
'異動者の名前があればoooをセットする
If Not Status Is Nothing Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
Else
With Worksheets(1).Range("E6:E37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False)
'異動者の名前がある&Dataがゼロの時 oooをセットする
If Not Status Is Nothing Then
If Cells(strStatusRow, 35).Value = 0 Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
End If
End If
End With
End If
End With
'該当があったら ループから抜ける
If strFileCloseFLG = "1" Then
ActiveWindow.Close
Windows(TeamName1 & "000" & intNendo & strHanki & ".xls").Activate
Cells(結果セル.Row, 44) = Dataooo1
Exit For
End If
Else
End If
Next intteamName2
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
Loop While Not 結果セル Is Nothing And 結果セル.Address <> 最初アドレス ←(2)ここでエラーがでます
End If
End With
(1)次の該当があってもなくても結果セルはnothingです。以前テストしていたときは、該当セルがある場合のみ正常に値が返ってきていたのですが。。(特にコードをかえた記憶もありません)
(2)では「オブジェクト変数または With ブロック変数が設定されていません(Error 91)」とでます。
<質問>
・次の検索がうまくヒットするにはどうすればよいでしょうか?
・もし(1)で該当セルがある場合のみ値がかえるようになれば
(2)を『Loop While Not 結果セル Is Nothing』にしかえてエラーを回避しても問題ないでしょうか?
見よう見真似のコーディングで
とてもみにくいかと思いますが、期限が迫っていてとても困っています。どうかよろしくお願いします。
No.1ベストアンサー
- 回答日時:
はずしてるかもしれませんが・・・
最初の
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
以後に、別の.Findしてるので、最後の
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
の検索条件が変わってしまっているのだと思います。
という訳で、最初に範囲を取得してしまうか、.Find以外の方法でチェックするといいと思います。
一番簡単な回避方法は(あまりお勧めではありませんが)、
Set 結果セル = .FindNext(結果セル)
の前に、最初の検索と同じ条件のダミーの検索を入れる方法です。
Set dmy = .Find("異動者", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
を入れると、たぶん回避できると思います。
p.s.
このプログラムが最初の"異動者"を探したシートのモジュール部にあるならいいのですが、標準モジュールにある場合は・・・
ダミーの検索の前にActiveSheetを設定する必要があるかもしれません
findを複数回行うのはだめなんですね。
find以外の方法だとループ処理しか思いつかず
データが大量で非効率になってしまう為、
fumufmu_2006さんにアドバイスいただいた
『一番簡単な回避方法』で処理することにしました。
あまりお勧めでない・・・のはなぜでしょうか。。。
でも、うまくいったのでこれで期限に間に合いそうです!
みづらいコードを解読&アドバイスいただき
本当にありがとうございます。
相談してみてよかったです(^^)
No.3
- 回答日時:
ちょっとANo.2に補足です。
>findを複数回行うのはだめなんですね。
FindNextを使わないか、FindからFindNextの間に検索条件を変更するような別のFindを使わなければいいと思います。
ただし、意図的に複数の検索条件があるので複数のFindを行って、FindNextは1つという場合もあるかもしれません。
とてもわかりやすい説明ありがとうございます。
勉強になりました。
とりあえず、いまは複数のFindとFindNext1つで
ダミーを追加し結果も正常でした♪
本当に感謝です。
また機会があればご教授よろしくお願いします。
No.2
- 回答日時:
>findを複数回行うのはだめなんですね。
FindNext使わなければいいんです。
>あまりお勧めでない・・・のはなぜでしょうか。。。
FindNextのためにダミーのFind入れるなら、最初から検索範囲のRange("A1:A37")を変数にして、最初はRange("A1:A37")、次はRange("A" & 前に見つかった行+1 &":A37")・・・とした方がいいかなと思ったんです。
それより、Find使わない方法もあります。
でも、あせって変更して動かなくなるより、ANo.1が原因なら、てっとり早い対処なのでと思ったんです。
まずは納期ですよね、やっぱり。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
【VBA】写真の貼り付けコードが...
-
特定の色のついたセルを削除
-
Excel UserForm の表示位置
-
エクセルVBAで、セル内のテキス...
-
EXCEL VBA 文中の書式ごと複写...
-
エクセルVBA 配列からセルに「...
-
【Excel VBA】一番右端セルまで...
-
VBA:日付を配列に入れ別セルに...
-
Excelで空白セル直前のセルデー...
-
データグリッドビューの結合セ...
-
マウスオーバーでセル内の背景...
-
【VBA】【ユーザーフォーム_Lis...
-
C# DataGridViewで複数選択した...
-
複数指定セルの可視セルのみを...
-
DataGridViewのフォーカス遷移...
-
EXCEL VBA Rangeについて
-
EXCELのフォーム上でリアルタイ...
-
VBA 並べ替え方
-
Rangeの範囲指定限界
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
複数指定セルの可視セルのみを...
-
C# DataGridViewで複数選択した...
-
【Excel VBA】マクロで書き込ん...
-
データグリッドビューの結合セ...
-
DataGridViewのフォーカス遷移...
-
Excel 範囲指定スクショについ...
-
【Excel VBA】一番右端セルまで...
-
EXCEL VBA 文中の書式ごと複写...
-
【VBA】写真の貼り付けコードが...
-
QRコード作成マクロについて
-
入力規則のリスト選択
-
CellEnterイベント仕様について
-
エクセル、マクロで番号を読込...
おすすめ情報