- ベストアンサー
結合セルの中身を検索する
お世話になっております Excel2003でFindメソッドを使って結合したセルの中身を検索したところ、Nothingが返ってきます 結合を解くと検索できるので、コードが悪いわけではないと思います 以前教えていただいた、VBAマイグレーションには引数SearchOrderにxlByColumnsを指定すると結合セルの中身を検索できないとありますが、SearchOrderにはxlByRowsを指定しています 結合したセルの中身ってFindで検索できないんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。KenKen_SP です。 Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext) このコードと補足いただいた状況を試しましたが、Excel2002でも Nothing に なりますね。 どうもA列とB列の結合セルが ColNo 1 にあるのか 2 なのかうまく VBA が判断 できてないみたいです。これが規定の動作かもしれません。 回避策としては、Find での検索範囲を Cells に広げて、見つかった rng を Intersect(rng, Columns(ColNo)) で Nothing とならなければ良し、とする方法 を考えてみました。 サンプルをアップしますが、動作するコードということで余計な部分を付け足し てありますが、ご参考下さい。 それから蛇足ですが、Find メソッドは LookIn も明示的に指定した方が良いで しょう。詳しくはヘルプをみて下さい。 Sub Sample() Dim rng As Range Dim WS As Worksheet Dim ColNo As Long Dim DATA As String Dim strFIRST As String Dim flag As Boolean Set WS = Sheet1 ColNo = 1 DATA = "検索文字列" 'ここから--------------------------------- '一度セル全体で検索する Set rng = WS.Cells.Find( _ What:=DATA, _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext) '見つかったらそれが Intersect で ColNo の列と交差するか調べ '交差するばOK、、しなければ見つからなくなるまで再検索 If Not rng Is Nothing Then strFIRST = rng.Address Do If Not Intersect(rng, Columns(ColNo)) Is Nothing Then flag = True Exit Do Else Set rng = WS.Cells.FindNext(rng) End If Loop While Not rng Is Nothing And rng.Address <> strFIRST If flag Then MsgBox "Found Row Number:=" & rng.Row End If End If End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02です。 昨日から、様子を見ていました。 Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext) 基本的な疑問なのですが、結合セルを探すのに、なぜ、ColNo を1つの列にしなければならないのでしょうか?二列にすれば、ヒットしますね。 それと、それ以前の問題ですが、結合セルとそうでないセルの混在のデータ領域を検索すること自体に、設計的な問題があるような気がします。ここの板では、あまり指摘しないようですが、一般的には、VBAでは、結合セルを含んだ処理は専用のオプションコードが必要とされるので、避けられますね。 一応、1列だけの検索でしたら、こういうものでもよいかと思うのですが。 On Error Resume Next RowNo = 0 RowNo = WorksheetFunction.Match(Data & "*", Columns(ColNo), 0) 'LookAt:=xlPartの代わりにワイルドカードを使いました。 On Error GoTo 0 If RowNo > 0 Then Set rng = Cells(RowNo, ColNo) End If
補足
こんばんは、blue_001です 先日はお世話になりました 前まで使っていたシートを変更することができないので(見た目の変更が絶対禁止なんです…)、結合セルとそうでないセルが混在している領域を検索する必要があるんです 検索のコードも記述していただき、前回同様色々と勉強になります 本当にありがとうございます
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは、KenKen_SP です。 VBAマイグレーション について記された PDF の技術資料をみてみましたが、 確かに SearchOrder について、 > SearchOrder に 列方向を表す xlByColumns を指定した場合、対象の文字列 > が結合セルにあると、Excel 2003 では無視されます。 > この現象を回避するには、SearchOrder に 行方向を表す xlByRows を指定し、 > 次のように記述します。 とありますね、、でも逆に言えば、これさえ設定すればちゃんと動作するはず なのでは? 原因はどこか他にある気がします。コードの主要部分を前後を含めて提示し、 どのような状況、例えば、どのセルを選択した状態でコードを実行しているの かを補足してみてはどうですか?
補足
KenKen_SPさん、回答ありがとうございます 質問した後にコード記述忘れに気づいたんですが、補足だけの投稿ができず、ありゃ~と思っておりました… 言われたとおり、コードだけでなく状況も説明させていただいたほうがよさそうなので、以下に記述させていただきます 例えば、ワークシート名がシート1で、A・B列を結合したセルの中身に"検索文字列"を含んだものがあり、それを検索し、行番号を返そうと思っています 下にコードを記述させていただきます Set Rng = WS.Columns(ColNo).Find(what:=Data, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext) WSがワークシート名(例でいうとシート1)、ColNoが列番号(例でいうと1(A列))、Dataが検索文字列(例でいうと"検索文字列")となっております 以上、宜しくお願いいたします
お礼
こんばんは、blue_001です ご教授いただいた方法で無事行番号を取得することができました LookInも前回の設定をそのまま引き継ぐとは知らず省略していましたが、指定しておいたほうがよさそうですね 本当に助かりました ありがとうございました