[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA Find関数 A1セルを含む結合セル検索できない?』(no_name)
セルA1を含む結合されたセルをFind関数で検索しようとすると,
検索されません。これは仕様でしょうか?
また,A1単体のセルとそれ以外のいずれかのセルに同じ検索値が入っている場合,A1単体セルではないセルの値が返ってくることも確認しました。これも仕様でしょうか?
A1単体のセルやA1を含まない結合セルに対しては検索できることは確認しました。
テストに使用したプログラムは下記に記します。
Sub FindTest()
Dim sCell As Range
Set sCell = ActiveWorkbook.ActiveSheet.Cells.Find(What:="AAA", _ LookIn:=xlFormulas, _ LookAt:=xlWhole)
If sCell Is Nothing Then
Debug.Print "見つかりませんでした"
Else
Debug.Print "見つかりました"; sCell.Row; " "; sCell.Column
End If
End Sub
< 使用 Excel:Excel2019、使用 OS:Windows10 >
こちらでのテスト結果だけ。 EXCEL2016+Windows10で。 横の結合セル >Set sCell = ActiveWorkbook.ActiveSheet.Cells.Find(What:="AAA", _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ LookAt:=xlWhole) で検索可能。 (ねむねむ) 2021/06/30(水) 14:05
縦、および縦横(A:B2等)の結合セル 上記及び SearchOrder:=xlByColumns, _ でも検索できず。 (ねむねむ) 2021/06/30(水) 14:07
>また,A1単体のセルとそれ以外のいずれかのセルに同じ検索値が入っている場合, >A1単体セルではないセルの値が返ってくることも確認しました。これも仕様でしょうか?
(ねむねむ) 2021/06/30(水) 14:12
こちらについてはAfterを省略した場合検索範囲の一番左上のセルの次から検索すると なっているので仕様ということになる。 (ねむねむ) 2021/06/30(水) 14:13
テストありがとうございます。
こちらでも横の結合セルの検索は可能でした。
しかし,それ以外は検索できないみたいですね。
自作の汎用モジュールにFind関数を組み込んでいるのですが,
今回のこともあるのでFindは使わない方がよさそうかな・・・
>Afterを省略した場合検索範囲の一番左上のセルの次から検索すると
>なっているので仕様ということになる。
仕様なのですね勉強になりました。
(no_name) 2021/06/30(水) 14:21
>『ユーザーフォームでリストボックス検索から更新ま』(けんとくん)
>(β) 2017/04/18(火) 09:57
以前、上のトピックで、βさんが「テーマと関係のないけども・・」、 結合セルがあるシート内でFindメソッドを使う上での注意点(バグ)を話されていました。
今回は、それ以外にもバグがあったんだなぁと認識させられた気分です。
しかし、何か根源は一緒のバグではないかと言う気がします。 共通点は「After」と「ヒットすべきセルの位置」が何か関係していそう。
そこで飛んでもない位置にあるセルをAfterに設定したらどうなるかと思いました。
つまり、これ ↓ After:=Cells.SpecialCells(xlCellTypeLastCell).Offset(1,1))
結果はいい線いってました。 (XL2010) 私だけ?
(半平太) 2021/06/30(水) 17:40
情報ありがとうございます。勉強になりました。
Find関数は便利ですが,今回のことや過去ログのなどのこともありますし,
そのほかも日付検索や引数の設定で気を使うことが多いですよね。
必要になれば別トピックでFindに代わるプログラムを相談しようと思います。
(no_name) 2021/07/01(木) 08:32
Find、FindNextを使う時、従来から知られているバグは↓
【検索文字列がシート上に1か所だけで、かつ、それが結合セルだった場合、 最初に発見したセルをFindNextで再発見できない】
今回、実在しているにも拘わらず、第一回目の発見すらできないケースがある、 と言うことで、追加対応が必要と私は認識した、と言うことです。
Sub test() Dim c As Range Dim f As Range
Set c = ActiveSheet.Cells.Find(What:="aa", LookAt:=xlWhole, _ After:=Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 1)) '初回の発見を確実にするため
If c Is Nothing Then MsgBox "見つかりません" Exit Sub End If
Set f = c
Do MsgBox c.Address & "に見つかりました" 'c を使ってなにがしかの処理 Set c = ActiveSheet.Cells.FindNext(c) If c Is Nothing Then '(従来の対策)1つ見つかったケースでもこのチェックが必要 Exit Do End If Loop While c.Address <> f.Address End Sub
(半平太) 2021/07/01(木) 10:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.