[[20200623174954]] 『Findメソッド』(眠神) ページの最後に飛ぶ

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

 

『Findメソッド』(眠神)

 大量の住所データから検索したい名前の人を入力して住所や郵便番号を抽出したく、コードを書いてるのですが、どうしても"該当部分がありませんでした"と表示されてしまいます。どなたか御教授頂けると本当に嬉しいです 
ちなみにこんな感じで書いてます 
 sub データの検索()
 Dim fndRng As Range , srcRng As Range

 '検索結果を書き出す"住所Findメソッド"シートのセル範囲"B5:N5"の値をクリア 
 worksheets("住所Findメソッド").Range("B5:N5").clearcontests 
'変数srcRngにワークシート"住所支払"のB3列目(「西暦」)を含む
 Set srcRng = worksheets("住所支払").Range("B3").CurrentRegion.Columns(3)  
 
'検索キーワードはセルF2の値で完全一致検索を行う 
'変数srcRngの範囲を検索し、最初に見つかったセルを変数fndRngに代入  
 Set fndRng = srcRng.Find(what:=Range("F2").value , lookat:=xlwhole) 
 
'検索値が見つかった場合(fndRngがNothingでない場合) 
 If Not fndRng Is Nothing Then 

'見つかったセルとワークシート"住所支払"のB3:N3の値をワークシート"住所Findメソッド" シートのB5:N5に代入 

 cells(5,"B").value = fndRng.value

   cells(5,"C").value = fndRng.Offset(0,1).value 
 cells(5,"D").value = fndRng.Offset(0,2).value  
 cells(5,"E") .value = fndRng.Offset(0,3).value 
 cells(5,"F").value = fndRng.Offset(0,4).value
 cells(5,"G").value = fndRng.Offset(0,5)value 
 cells(5,"H").value = fndRng.Offset(0,6)value    
    cells(5,"I").value = fndRng.Offset(0,7).value 
 cells(5,"J").value = fndRng.Offset(0,8).value  
 cells(5,"K").value = fndRng.Offset(0,9).value  
 cells(5,"L").value = fndRng.Offset(0,10).value  
    cells(5,"M").value = fndRng.Offset(0,11).value  
 cells(5,"N").value =  fndRng.Offset(0,12).value  
 
 '検索値が見つからなかった場合 
Else 
           Msgbox "該当部分がありませんでした" 
End If 
  'セルの参照を削除 
  Set fndRng = Nothing 
       Set srcRng = Nothing 
 End sub  

 なんかごちゃごちゃしててごめんなさい  💦
 
 

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


 >どうしても"該当部分がありませんでした"と表示されてしまいます。

 「どうしても」と言うくらいですから、一致すべきものが存在していると確信しているんですよね?

 でも回答側からすると、思い違いでしょ、と勘ぐるのが捜査の第一歩です。

 一致すべきと思う根拠を示してください。
 ※「目で見て確信している」と言うのは無し。もっとロジカルに説明してください。
   ○○の数式で両者が同じであることは確認している、とか。

(半平太) 2020/06/23(火) 19:44


 半平太さんアドバイスありがとうございます。 
 例えで言いますと、ワークシート"住所Findメソッド"srcRngの範囲の中に、眠神という名前の人がいて、 
"住所支払"シートのF2セルに、眠神と入力すると、"住所支払"シートの"B5:N5"の表に、眠神に関する 
住所や、郵便番号、前住所など、情報が出力されるといった内容です。 
  

(眠神) 2020/06/23(火) 19:54


>ちなみにこんな感じで書いてます 
回答のまえに、VBEが使えない環境から投稿されているのでしょうか?
投稿されたコードを拝見すると、頑張って手打ちしたような感じがします。
もし、エディタが使えるならそのまま貼付されたほうが、どうでもよいタイプミスを防ぐことができるとおもいます。

質問のほうは、ステップ実行して検証したうえでの質問でしょうか?
スマホなので、コード自体の検証はしてませんが、lookinを省略しているのが気になります。

(もこな2) 2020/06/23(火) 20:05


 いや、眠神さんのコードの意味をお聞きしている訳じゃないです。
 それは、おいおい手を付けて行きます。

 今は、もっと取っ掛かりの部分です。

 「srcRngの範囲の中に、眠神という名前」と「F2セルに、眠神」と入力したデータが
  同じであることの証明です。

 1.普通は、=左のセル=F2 と言う数式を入れてTrueと出ますよ。と言う確認が欲しいです。

 2.あと、左のセルは生データですか? 
   それとも数式で出しているデータですか?

 3.取り敢えず、lookinのパラメタに xlValues を指定してみた結果も報告してください。

(半平太) 2020/06/23(火) 20:29


 
 もこな2さんへ 
 おっしゃる通り、VBEの環境も改めて確認して、再度入力していきたいと思います。 
 lookinを省略しているならば、何処にlookinを入力すれば宜しいのでしょうか?
(眠神) 2020/06/23(火) 20:41

 
半平太さんへ 
 誤った受け答えで申し訳ございません。 
 「srcRngの範囲の中に、眠神という名前」と「F2セルに眠神」と入力したデータが同じであるという証明としては、 
"住所Findメソッド"シートのF2セルに名前が入力されていて、その名前が "住所支払"シートの範囲内の"B3:N3"に入力されている名前と一致すれば、瞬時に"住所支払"シートの"B5:N5"の範囲に、その名前の人に関する住所データが抽出されるという事です。

なので、Trueを使っての操作はしておりません。 
 
lookinのパラメーターにxlvaluesを入れるというのは、どういった事になるのでしょうか?
(眠神) 2020/06/23(火) 20:56


 >lookinのパラメーターにxlvaluesを入れるというのは、どういった事になるのでしょうか?

                                    例
                                    ↓
 Set fndRng = srcRng.Find(what:=Range("F2").Value, lookat:=xlWhole, LookIn:=xlValues)

 >Trueを使っての操作はしておりません。 
 上述の変更で旨く行かなかった場合の後でもいいですが、

 「操作」を入れるのではなく、トラブルシューティングの一環としての確認作業です。

 問題を一つ一つつぶして行かないと原因が究明できません。

 下手な鉄砲を数撃って原因を探りあてるのは(旨く行けばいいですが)
 遠回りになることも多々あります。

 あと、これはどうですか?
     ↓
 > 2.あと、左のセルは生データですか? 
 >   それとも数式で出しているデータですか?

(半平太) 2020/06/23(火) 21:06


横から失礼します。

ぶつかりましたが、そのままで失礼します。

こういった検索系の質問でよくあるのが、
セル表示が同じに見えても、どちらかの値に空白やcr、lfとか
目に見えないものがあると一致しないため、
まず、確実に一致するデータがあることから始めないと、
なにがなんだかわからなくなるので、確認されてはいかがでしょうか。

半平太さんが提示している通り、
例えば、F2セルとB5セルが一致していれば
同じシートのどこかのセルに
=F2=B5
と数式を入力してTRUEが表示されれば、
一致していますので。
(tkit) 2020/06/23(火) 21:14


■1
>lookinを省略しているならば、何処にlookinを入力すれば宜しいのでしょうか?
その質問が返ってくるということはFindメソッドの理解ができてないのだと思います。
↓を読んでみてください。
https://www.moug.net/tech/exvba/0150111.html

■2
PCの前に戻ったので見てみましたが、やっぱりタイプミスしてますよ。

    Sub データの検索_整理()
        Dim fndRng As Range

        Worksheets("住所Findメソッド").Range("B5:N5").ClearContents '←★スペルミスを修正
        Set fndRng = Worksheets("住所支払").Range("B3").CurrentRegion.Columns(3).Find(what:=Range("F2").Value, lookat:=xlWhole)

        If Not fndRng Is Nothing Then
            Cells(5, "B").Value = fndRng.Value
            Cells(5, "C").Value = fndRng.Offset(0, 1).Value
            Cells(5, "D").Value = fndRng.Offset(0, 2).Value
            Cells(5, "E").Value = fndRng.Offset(0, 3).Value '←★いらないスペースを削除
            Cells(5, "F").Value = fndRng.Offset(0, 4).Value
            Cells(5, "G").Value = fndRng.Offset(0, 5).Value '←★ピリオドわすれを修正
            Cells(5, "H").Value = fndRng.Offset(0, 6).Value '←★ピリオドわすれを修正
            Cells(5, "I").Value = fndRng.Offset(0, 7).Value
            Cells(5, "J").Value = fndRng.Offset(0, 8).Value
            Cells(5, "K").Value = fndRng.Offset(0, 9).Value
            Cells(5, "L").Value = fndRng.Offset(0, 10).Value
            Cells(5, "M").Value = fndRng.Offset(0, 11).Value
            Cells(5, "N").Value = fndRng.Offset(0, 12).Value
        Else
            MsgBox "該当部分がありませんでした"
        End If

    End Sub

次投稿へ続く

(もこな2 ) 2020/06/23(火) 21:15


 半平太さんへ 
 何度も申し訳ございません💦  
 2,の左のセルとは何処の事を指しているのでしょうか? 
 無知な自分で申し訳ないです💦
(眠神) 2020/06/23(火) 21:29

tkitさんへ 
 F2セルとB5セルが同じと確認出来るように、Trueを用いて確認が出来ると言う事を
 知ることが出来ました。 
 コードを書きながら、かつ確認作業も行っていきたいと思っています。
 わざわざありがとうございました🙇♂
(眠神) 2020/06/23(火) 21:33

もこな2さんへ 
 わざわざ丁寧なコードとFindメソッドに関する参考文献をご提供頂きまして、誠にありがとうございます。 
 確かにおっしゃる通り、Findメソッドに対する理解がないなと感じております。 
 ご提供頂いた、コードと参考文献、しっかり読ませて頂き、再度投稿させて頂きます。 
 誠にありがとうございました。
(眠神) 2020/06/23(火) 21:43

■3
1セルずつ参照しなくても、コピーして値貼り付けすれば同じ結果になるとおもいます。
    Sub 修正案()
        Stop '←ブレークポイントの代わり
        Dim MyRNG As Range

        'どうせ上書きするから不要  かつ
        '見つからないのにクリアされたら迷惑な気がするのでClearContents 自体を削除

        With Worksheets("住所Findメソッド")
            Set MyRNG = Worksheets("住所支払").Range("B3").CurrentRegion.Columns(3).Find(what:=.Range("F2").Value, LookIn:=xlValues, lookat:=xlWhole)

            If MyRNG Is Nothing Then
                MsgBox "該当部分がありませんでした"
            Else
                MyRNG.Resize(, 13).Copy
                .Range("B5").PasteSpecial Paste:=xlPasteValues
            End If
        End With
    End If

■4
質問とは関係ありませんが、同じ方ではないかもしれませんが、ニックネームで過去ログをみたら話がおわってないように思われるものが見当たります。
(中には、私がコメントしたものもあります。)
いろんな考え方の方がいらっしゃるので無理強いをするつもりはありませんが、同じ方であれば、解決したらならその報告を、どうでもよくなったならその旨書いておいたほうがいいんじゃないですかね・・・・

 ヒットしたトピック
[[20200421213150]] 『worksheetfunctionのMax関数について』(眠神)
[[20200425230304]] 『パス名とブックのシート名全部を出力させたい』(眠神)
[[20200506185620]] 『cnt = .Rows.Count - 1』(眠神)

(もこな2 ) 2020/06/23(火) 21:45


 もこな2さんへ 
 別のコードまで御提示頂きまして、誠にありがとうございます
 また、VBAとはまた少し違う内容になりますが、確かにもこな2さんのおっしゃった通り 
 過去の3つの質問内容も間違いなく、自分が質問させて、頂きました。 
 私としては、御礼も投稿させて頂いたのですが、反映されていなかったようです。 
 なので、改めて、今一度もこな2さん含め、私にアドバイスを頂いた方々に本当に感謝の気持ちを 
 述べたいと思っております。 
 私の端末からはExcelの学校のサイトを操作すると、何らかの投稿が反映されないといった 
事がたまにあるようです。
 申し訳ありませんでした。 
もこな2さんが御提示頂いた、コード改めて見直してみます。 

(眠神) 2020/06/23(火) 22:01


こんにちは。私も少しばかり関係者なので書き込ませていただきます。

> なので、改めて、今一度もこな2さん含め、私にアドバイスを頂いた方々に本当に感謝の気持ちを 
> 述べたいと思っております。 

まとめてじゃなく、それぞれのスレッドに返事(回答への評価等です。挨拶だけでなく)を
してもらえますか?
各スレッドで完結しているべきだと思いますので。

> 私の端末からはExcelの学校のサイトを操作すると、何らかの投稿が反映されないといった 
> 事がたまにあるようです。
プレビューしたまま、更新をし忘れているんじゃないですか?
サイト側の問題じゃないと思います。
反映されているか確認をきちんとしていただきたいと思います。

「遠足は、帰宅するまでが遠足です。」とか聞きませんか?
小学生向けだからお子さんがいないと聞かないかもしれませんが。
(γ) 2020/06/24(水) 06:27


■4
このトピックでの質問は解決しましたか?
私も含めて皆さんが指摘しているのは、Findメソッドで検索しているのが、"値"じゃないのではないか?というところだとおもいますが、理解したうえでご自身のコードを修正して検証してみましたか?

私が2番目に提示したものはあくまで別案ですから、そちらを研究されようとしているのであれば、それより先にご自身のコードで何がまずかったのかをキチンと究明すべきです。

■5
ほかのトピックについては、どのトピックも回答者さんとのキャッチボールが1回で済むような内容じゃないと思うのですよね・・・・(なので、あえて"どうでもよくなったなら〜"と書きました。)
結局どうなったんですか?

(もこな2 ) 2020/06/24(水) 08:03


追加で。
スマホからなので詳細は省きますが、他にも気になる点があるので挙げておきます。

・(シートの記述を省略しているので)標準モジュールならActivesheetを指定したことになってますが、問題ないですか?

・Worksheets("住所支払").Range("B3").CurrentRegion.Columns(3)とされてますが、正しい列(セル範囲)が取得されていますか?

(もこな2) 2020/06/24(水) 08:39


もこな2さんありがとうございます。 
今確認いたします。
(眠神) 2020/06/24(水) 11:21

(γ)さんのおっしゃる通りですね 
ページ更新を押下してなかったです💦
(眠神) 2020/06/24(水) 11:24

もこな2さんへ  
B3なので、正しい列範囲はきちんと取得されています。 
Bは2列目なので、間違ってはないと思うのですが.,.
(眠神) 2020/06/24(水) 11:25

もこな2さんへ 
ごめんなさい 💦 
さっきの発言間違っているみたいです。 
もう一回見てみます
(眠神) 2020/06/24(水) 12:01

■6
>B3なので、正しい列範囲はきちんと取得されています。
CurrentRegionの3行目を指定しているので、
取得される表範囲が【A】列から始まっているのであればC列になるし、
取得される表範囲が【B】列から始まっているのであればD列になるので、
そこを気にしています。

(もこな2) 2020/06/24(水) 12:02


もこな2さん 
申し訳ないです。 
取得される表範囲が住所支払シートではB3なのですが、CurrentRegionではなぜD列から始まるのかが不明でした。 
CurrentRegionは、途中で空白セルが無ければ全ての範囲を取得出来るんですよね?
(眠神) 2020/06/24(水) 17:28

>Range("B3").CurrentRegion.Columns(3)
これの .Columns(3)の意味を無視していませんか?
CurrentRegionの3列目ですから、
・普通はC列が対象になりますし、
・場合によっては(A列を全然使っていなければ。無いと思うが。)、
 D列が検索対象になりますよ。
それでいいんですか?

(γ) 2020/06/24(水) 17:47


■7
>CurrentRegionは、途中で空白セルが無ければ全ての範囲を取得出来るんですよね?
仰っている意味というかどのように勘違いしてるのかよく分かりませんが、マクロではなく【実際の操作で】↓をやってみてください。
 (1) 「住所支払」シートをアクティブにする
 (2) B3セルを選択する
 (3) [Ctrl]と[*]を同時に押す
 (4) 選択されている範囲を確認する

 ※文言訂正を反映 2020/06/24(水) 20:28

(もこな2) 2020/06/24(水) 18:56


 γさん、自分、コードの一部分を無視していた箇所があったようです。御教授頂いた通り、シートのVBEを随時比較しながら CurrentRegionが何処の列や、セルを参照するのか、しっかり確認します。 また、結果を必ず報告させて頂きます。
(眠神) 2020/06/24(水) 19:26

もこな2さん、操作の手順まで、分かりやすく教えて頂いてありがとうございます。 
翌日、再度トライしてみますので、また必ず結果を報告させて頂きます。
(眠神) 2020/06/24(水) 19:31

■号外1
特定の人に呼び掛けるようにしてしまうと、ほかの方が参加しづらくなることもあるかもしれませんからわざわざ誰宛のメッセージとしないほうが良いかもしれません
また、見づらくなるだけなので返答の相手ごとに別投稿にしなくてもまとめて書いちゃえばよいとおもいます。

 ※ いずれも私見です

■号外2
>シートのVBEを随時比較
言いたいことがよくわかりませんが、さしあたって「■1」「■4」で示したようにFindメソッドの引数を省略しないほうがよいことは理解されたのでしょうか?
さらに、当該部分についてコードは修正してみたのでしょうか?

■号外3
ちなみに、このトピックでのやり取りは↓みたいな感じですよね?

 (1) 提示したコードに記述ミスがあった(投稿時にまちがっただけかもしれないが)
 (2) Findメソッドで値以外を検索している可能性があった
 (3) CurrentRegionを勘違いしていて、検索対象範囲がそもそも違っていたかもしれない 【←今ココ】

「■5」で言いたかったのは、このトピックでさえこれだけやり取りしてるのですから、ほかのトピックも「お礼が遅くなりましたが、アドバイスで解決できました〜」なんて言える状態になっているとは正直思えないわけです。
にもかかわらず放置されているので、どうでもよくなったならその旨書いておくべきだと言っています。
このトピックにまとめて感謝の意を述べるべきとは言ってません。

(もこな2 ) 2020/06/24(水) 21:08


すいません 
もう一日待ってもらえますか?
(眠神) 2020/06/25(木) 20:04

コメント返信:

[ 一覧(最新更新順) ]


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