アプリ版:「スタンプのみでお礼する」機能のリリースについて

ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、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』にしかえてエラーを回避しても問題ないでしょうか?

見よう見真似のコーディングで
とてもみにくいかと思いますが、期限が迫っていてとても困っています。どうかよろしくお願いします。

A 回答 (3件)

はずしてるかもしれませんが・・・



最初の
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を設定する必要があるかもしれません
    • good
    • 0
この回答へのお礼

findを複数回行うのはだめなんですね。
find以外の方法だとループ処理しか思いつかず
データが大量で非効率になってしまう為、
fumufmu_2006さんにアドバイスいただいた
『一番簡単な回避方法』で処理することにしました。
あまりお勧めでない・・・のはなぜでしょうか。。。
でも、うまくいったのでこれで期限に間に合いそうです!
みづらいコードを解読&アドバイスいただき
本当にありがとうございます。
相談してみてよかったです(^^)

お礼日時:2008/04/20 23:22

ちょっとANo.2に補足です。


>findを複数回行うのはだめなんですね。
FindNextを使わないか、FindからFindNextの間に検索条件を変更するような別のFindを使わなければいいと思います。
ただし、意図的に複数の検索条件があるので複数のFindを行って、FindNextは1つという場合もあるかもしれません。
    • good
    • 0
この回答へのお礼

とてもわかりやすい説明ありがとうございます。
勉強になりました。
とりあえず、いまは複数のFindとFindNext1つで
ダミーを追加し結果も正常でした♪
本当に感謝です。
また機会があればご教授よろしくお願いします。

お礼日時:2008/04/21 13:11

>findを複数回行うのはだめなんですね。


FindNext使わなければいいんです。

>あまりお勧めでない・・・のはなぜでしょうか。。。
FindNextのためにダミーのFind入れるなら、最初から検索範囲のRange("A1:A37")を変数にして、最初はRange("A1:A37")、次はRange("A" & 前に見つかった行+1 &":A37")・・・とした方がいいかなと思ったんです。
それより、Find使わない方法もあります。
でも、あせって変更して動かなくなるより、ANo.1が原因なら、てっとり早い対処なのでと思ったんです。
まずは納期ですよね、やっぱり。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!