[[20190810104349]] 『逆方向でのfindの課題』(skyblue) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『逆方向でのfindの課題』(skyblue)

 以前、エクセルシートの縦方向に対象文字が複数存在するケースで(例えば下の 1.)、正方向で find で検索すると、最初の対象が無視されることについて解決策を質問しました。これに関して「???」さんから素晴らしい解決方法を示して頂きました《v.Cells(v.Count)の部分 》。

 今回は、同じシートの条件で、反対方向から検索した場合には(下の 2.)、???さんから教えて頂いた方法を単純に適用してもうまくいきません。そもそも、なぜ解決したかが分かっていません。良い方法が有れば、ご指導願いたいと思います。

1.シートのデータ例

a
a
f
s
a
a

2.サンプルソフト

Sub t20190810()
Set aa = ThisWorkbook.Sheets("test")
With aa

    Set v = Range(.Cells(1, 1), .Cells(6, 1))
    Set q = v.Find("a", v.Cells(v.Count), SearchDirection:=xlPrevious)
    If Not q Is Nothing Then
        g = q.Row
    End If
End With
Stop
End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


v.Cells(1)

でしょうか。

(マナ) 2019/08/10(土) 11:14


マナさん有難うございます。出かける直前なので帰宅して試します。
何故か下記で成功しました。
 Set q = v.Find("a", SearchDirection:=xlPrevious)

(skyblue) 2019/08/10(土) 11:22


横から失礼。
何をもって成功と言っているのか不明ですが、
少なくともAfter引数を指定すべきでしょう。

前の質問とは、 [[20190415095938]] のことでしょうか? (回答者が違う気もしますが)

 >Findメソッドは範囲の左上端(今回の場合、一番上)の次のセルから検索を始めます。
 >なので、第二引数に範囲の右最下のセルを指定やると次のセル、すなわち左上端から検索します。
 と解説されています。
 ここを良く考えてみてはどうですか?

 a       (1)
 a       (2)
 f       (3)
 s       (4)
 a       (5)
 a       (6)

 After:=(1)のセル  として、SearchDirection:=xlNext とすると
 (2)から検索して、(1)はマッチしないということに困っていたのですね。

 そこで、
 After:=(6)のセル  として、SearchDirection:=xlNext とすると
 (1)から検索しますよ、というコメントがあったのです。

 逆の話も、根っこはまったく同じです。
 After:=(6)のセル  として、SearchDirection:=xlPrevious とすると
 (6)はスキップされるが、

 After:=(1)のセル  として、SearchDirection:=xlPrevious とすると
 (6)から検索するということです。

(γ) 2019/08/10(土) 12:07


 マナさん、γさん有難うございました。マナさんの方法でうまくいきました。

 γさんご指摘の通り、前回、v.Cells(v.Count),を教えて頂いたのはseiyaさんでした。seiyaさんにはお詫び申し上げます。

 γさんの丁寧なご説明がありましたが、十分な知識が無く内容を理解できませんでした。

 いつもこの掲示板では様々な人の好意的なご協力で、解決ができており、改めてお礼申し上げます。

 自分が理解した範囲でfinfdについてまとめますと次のようになります。

1.検索対象が複数ある場合、findを使った正方向での検索では、例えば今回のケースでは

 Set q = v.Find("a", v.Cells(v.Count))

2.逆方向から検索する場合は

   Set q = v.Find("a", SearchDirection:=xlPrevious)

 や
   Set q = v.Find("a", v.Cells(1), SearchDirection:=xlPrevious)

  がある ということになりました。。

(skyblue) 2019/08/11(日) 09:58


>1.検索対象が複数ある場合、findを使った正方向での検索では、例えば今回のケースでは
>Set q = v.Find("a", v.Cells(v.Count))

Findの引数は、省略すると、直前に行った動作が引き継がれます。
ですから、上記の記述は、探索方向は状況によって、
xlPreviousになったり、xlNextになったりします。
うまくいったとしてもたまたまです。保証はされていません。

探索開始基準位置 After についても指定していないので、
直前の動作に引きずられます。
 
ですから、Findを使用するときには、引数を省略しないことです。
特に探索方向、探索開始基準位置がポイントになっているケースですから、
たまたまうまくいっただけで、その動作は保証されません。
まずはそのことを頭に入れていただきたいと思います。
# やや、くどいかな。
 
次に、私の説明で理解が難しいところを具体的に説明していただけますか?

(γ) 2019/08/11(日) 12:02


あわわ、間違いを堂々と書いてしまいました。

After引数を省略したときは、対象セル範囲の左上端のセル が指定されたことになります。
訂正します。

ヘルプからの引用:

 引数 LookIn、LookAt、SearchOrder、および MatchByte の設定は、
 このメソッドを使用するたびに保存されます。
 次にこのメソッドを使用するときにこれらの引数の指定を省略すると、
 保存された設定が使用されます。
 これらの引数の設定を変更すると、[検索と置換] ダイアログ ボックスに
 表示される設定が変わります。
 また、[検索と置換] ダイアログ ボックスで設定を変更すると、
 保存されている値、つまり引数を省略した場合に使用される値が変わります。
 このような設定の変更によって生じる問題を避けるには、
 メソッドを使用するたびに、これらの引数を明示的に指定します。
(γ) 2019/08/11(日) 12:14

 γさん 何度も丁寧に書いて頂いて恐縮です。

 理解が難しいところを具体的に説明して欲しいとのお話です。

・わがままに申し上げれば、文章では、まず単語からつまずきます。従って、全体が分かりません。
・できれば、
1.具体的なソフトのコード
2.データ、
3.アウトプット 
 を示して頂ければ、コピーして走らせて、理解できます。

 find についてはネットの解説も十分ではなく、分からないまま利用されている方も多いようで、恥をかくのを承知の上で、稚拙なコードも書きました。

具体的なコードを示して頂ければ、それが教科書になると思います。
(skyblue) 2019/08/12(月) 13:10


 こんにちは!

 横?下からお邪魔します。

 毎日暑いですねぇ(そなんはどうでもええから早よ回答せんかぇ、、はい!わかりました。m(__)m)

 Findは、一般機能の検索のことですからコードを書くときは記録してそれを直すのがいいです。

 Cells.Find(What:="*", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , MatchByte:=False, SearchFormat:=False).Activate

 それとγさんも既にご指摘ですがFindの引数は省略してはいけません。というのが鉄則です。

 Find以外でも書き手の思い意志、意図を明示することが大切だと私は思います。(偉そうにすみません。)

 後、FindのHelpのLoopのところのミスというのも有名なお話ですが、基本的にHelpを参照することがお勧め一番です。

 もう、直っているのかな???直っていたらすみません。m(__)m

 ということで、、まとめますと。。

 1.先ずは記録する
 2.引数は省略しない
 3.Helpを参照する

 で、、どうでしょうか????
(SoulMan) 2019/08/12(月) 14:48

Oh my God !!!
SearchDirectionも引き継ぐ対象の引数ではなかったですね。
(引用しておきながら、何と言うことや)

訂正しておきます。
どうも失礼しました。
(γ) 2019/08/12(月) 15:28


 SoulManさん ありがとうございました。

暑さにうたれて帰宅し、さっそく開いて、親切な方がたくさんおられるのだなと、驚いている次第です。

ちょっとわからないことがあり、質問させて頂きます。

1.の「先ずは記録する」の意味は、引数を含めて全部書けということですか?

2.「引数は省略しない」とありますが、省略できる引数は無いのでしょうか?

3.find を選択して f1を押しましたが、素人には内容が理解できません。何を参考にするのでしょうか?

 何しろ分からないことだらけで申し訳ありません。

(skyblue) 2019/08/12(月) 17:50


 こんばんは!

 私もあまり詳しくないので余計に混乱させちゃいましたね。。ごめんなさいね。。で、私の場合ですけど、、

 >1.の「先ずは記録する」の意味は、引数を含めて全部書けということですか? 
 は、

 Helpより
 >引数 LookIn、LookAt、SearchOrder、および MatchByte の設定は、このメソッドを使用するたびに保存されます。
 >次にこのメソッドを使用するときにこれらの引数の指定を省略すると、保存された設定が使用されます。
 >これらの引数の設定を変更すると、[検索と置換] ダイアログ ボックスに表示される設定が変わります。
 >また、[検索と置換] ダイアログ ボックスで設定を変更すると、保存されている値、つまり引数を省略した場合に使用される値が変わります。
 >このような設定の変更によって生じる問題を避けるには、メソッドを使用するたびに、これらの引数を明示的に指定します。

 ですけど、、私は、全部書いてます。

 >2.「引数は省略しない」とありますが、省略できる引数は無いのでしょうか? 

 あるのでしょうけど、、これも、、全部書いてます。

 >3.find を選択して f1を押しましたが、素人には内容が理解できません。何を参考にするのでしょうか? 

 うぅぅん、、これは難しいですね。。。Help以上のものはないという認識です。私は、、、

 でも。。Helpを参考にする習慣を身に着けることは決してマイナスではないと思いますよ??

 コードを書く人の独特の考え方に徐々になってきます、、慣れ?です。

 先ほども書きましたが、、私は、書き手の意図、意志、、を明示することが大切だと考えているので基本、、省略 はしない派です。

 後で見返した時とか、、他の人がそのコードに手を加える時に可読性が落ちるからです。

 まぁ、、これも経験からなので個人差はあっていいと思いますし、、押し付けるつもりは毛頭ありません。

 こんなもんでいいでしょうか???
(SoulMan) 2019/08/12(月) 18:31

 SoulManさん お忙しい中、大変ありがとうございました。

これからまた外出するので、改めて、ご指導の内容を検討した上で、またわからないことがありましたら、質問させて頂きます。
(skyblue) 2019/08/12(月) 18:51


 私も最近登校出来ていないので
 検索で SoulMan FIND としてもらえると
拙いコードがありますです(^^;;
 良かったらどうぞ
(SoulMan) 2019/08/12(月) 19:17

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.