Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7全般 : Excel 2010)
検索方法
投稿日時: 19/02/15 21:09:32
投稿者: chokobanana

お世話になります。
 
シート間の一致を検索する方法はFindで大丈夫でしょうか?
 
(やりたいこと)
 sheet1のA列の品名とC列の金額がsheet2のA列の品名とB列の金額が一致を検索
 
文字を検索とか数値を検索する方法は見つけられたのですが
文字と数値をセットで検索するには何を用いたらよいかわかりません。
 
教えていただけないでしょうか。
お願いいたします。
 

回答
投稿日時: 19/02/15 21:59:37
投稿者: simple

品名と金額を連結した作業列を作成したうえで、
Findで検索してみてはどうでしょうか?

回答
投稿日時: 19/02/15 22:30:01
投稿者: WinArrow
投稿者のウェブサイトに移動

simpleさん、レスをお勧めします。
 
蛇足ですが
文字列と数値を結合すると「文字列」になります。
数値と数値を結合しても「文字列」になります。

回答
投稿日時: 19/02/17 10:04:14
投稿者: simple

返事が無いので、こちらのコメントをどう受け止められたのか不明です。
放置せずに、違うなら違うと発言をしてください。
 
 
>sheet1のA列の品名とC列の金額がsheet2のA列の品名とB列の金額が一致を検索
ここがよく見ると、別の受け止め方もありそうですね。
 
私は、「検索」という言葉を、マッチした箇所、行を知る、
という意味で受け止めましたが、
>sheet2のA列の品名とB列の金額が一致を検索
と言う言い方からすると、
品名と金額が一致しているかどうかを調べたい、
という意味で使ったのかもしれない。
(普通、"一致を検索"とは言わないですけどね。)
 
sheet1の全行について、Sheet2にあるかどうかを調べたい、
一致した個数を調べたい、
ということであれば、
COUNTIFSワークシート関数で得られると思います。
 
また、
重複のリスト化
https://www.moug.net/faq/viewtopic.php?t=77903
で回答にあったDictionaryの使い方を理解されたのであれば、
これを使って、一致の有無を得ることもできるでしょう。
 
予め、sheet2のA列の品名とB列の金額を連結した文字列をキーとした
dictionaryを作製しておき、
sheet1のA列の品名とB列の金額を連結した文字列が、
キーにあるかどうかを Existsメソッドで調べればよいでしょう。
 
====
なお、あなたの建てたスレッドで、放置されているものがあります。
https://www.moug.net/faq/viewtopic.php?t=77704
https://www.moug.net/faq/viewtopic.php?t=77783
せっかく回答されたかたに対して、応えるようにしてください。

投稿日時: 19/02/18 12:54:43
投稿者: chokobanana

申し訳ございません。
本日までPC見れませんでした。
 
>品名と金額が一致しているかどうかを調べたい、
という意味で使ったのかもしれない。
 
そのとおりです。
但し、個数ではなく一致しているかを調べたいのです。
後々、作りこむ予定なので関数ではなくマクロで作成するように指示されているのです。
 
>なお、あなたの建てたスレッドで、放置されているものがあります。
 
こちらまだ解決していないので未解決としていましたが、期間が長いと未解決でも解決とした方が
よろしいのでしょうか?
そのような仕様でしたら、私の理解ができておりませんでした。
申し訳ございません。
 
>予め、sheet2のA列の品名とB列の金額を連結した文字列をキーとした
dictionaryを作製しておき、
sheet1のA列の品名とB列の金額を連結した文字列が、
キーにあるかどうかを Existsメソッドで調べればよいでしょう。
 
ありがとうございます。
確かめてみます。
 

回答
投稿日時: 19/02/18 22:04:56
投稿者: simple

>但し、個数ではなく一致しているかを調べたいのです。
個数はCOUNTIFSワークシート関数で得られますよね。
個数 > 0 なら一致しているものがあるということだし、
個数 = 0 なら一致していないということです。
簡単に目的が果たせますよ。分かりますか?
 
>関数ではなくマクロで作成するように指示されているのです。
マクロ内でワークシート関数を使えます。
WorksheetFunctionを頭に付ければよいのです。
この辺は知っていますか?
マクロと関数は対立するものではありません。
 

>シート間の一致を検索する方法はFindで大丈夫でしょうか?
ということで、あなたの最初の構想はFindの利用だったのでしょう?
 
でしたら、
> 品名と金額を連結した作業列を作成したうえで、
> Findで検索してみてはどうでしょうか?

とコメントしているわけですから、これについて貴方の意見は?
きちんと受け止めを書いてください。
もちろん、手作業でやると言っているのではなく、
マクロでRangeオブジェクトのFindメソッドを使うということです。
マクロで別シートに作業列を作り、マクロで一致を確認するのです。
 

単一の品目と金額とをバラバラでは、検索できないんですよ。
要は、2つの情報をどういう方法で組み合わせるか、という話です。
 
(1)連結した文字列をワークシート上に作るというのが、一番直接的です。
  (1-a)その上でFindを使って、Nothingが返る(マッチせず)か、Rangeが返る(マッチ)かで判定。
  または、
  (1-b)Application.Matchを使って、Errorが返る(マッチせず)か、
       Index値(整数値)が返る(マッチ)かで判定。
 
(2)ワークシート関数を使う方法。
   WorksheetFunction.COUNTIFS(・略・・)> 0 で判定する。
   関数の引数に、品目と金額を与えることで情報を組み合わせることになります。
 
(3)品目と金額を連結したものをDictionaryのキーに持って、Existsメソッドで有無を判定する。
   (作業列を作って、作業後それを消すのと基本は変わらない。
     それをdictionaryオブジェクト内に持つだけの話です。)
 
(4)フィルタオプションの利用。
   条件式にどちらか一方のSheetにある品目と金額の組みすべてを指定することで、
   他のシートのマッチするものを抽出し、マッチしたものの一覧を作れます。
   それ以外は、マッチせずとするのは簡単でしょう。
   もちろんマクロでできます。
 
などが思いつきます。このほか、SQLの使用などもあるでしょう。
これでなければならない、ということはありません。
それぞれのスキルに応じたものを利用することになるでしょう。
 
ここは、コード作成を依頼する場所ではないので、
トライしたうえで、具体的な質問をお願いします。
 
-----------------------
なお、過去のスレッドですが、期間の長さの問題ではありません。
回答者から回答があったのに放置しているのはよろしくないです。(Wordスレッド)
hatenaさんの助言は無視なんですか?あなたのために時間を使っています。
返事をしたほうがよろしいのでは?
もう一つのスレッドは今後、書込される予定なんですね。
もうすっかり興味を失っていたかと思いました。了解です。

投稿日時: 19/02/19 09:39:50
投稿者: chokobanana

説明が分かりにくかったのでしょうか。
 
「文字と数値をセットで検索するには何を用いたらよいかわかりません。」
 
Findを何か応用して使うのかはたまた違うものを用いほうがいいのか分からず
相談させていただいだけです。
 
コード作成では無く何を用いたらよいのかだけです!!
そこから先は自分で調べようと思っておりました。
 
なので正直そのようなとらえ方をする人がいるとは驚きです。
誤解させてしまってましたのでしたら申し訳ございません。
 
simpleさん 私は言い合いをするのは好きではありませんので
これ以上の問合せには申し訳ございませんが失礼いたします。
 
 
 
 
 
 
 
 
 
 
 
 

回答
投稿日時: 19/02/19 14:50:12
投稿者: Suzu

こんにちは。
 
COUNTIFSは 数を返す関数ですが、ある/なし の判断を行うときにも使用される事があります。
条件等によってでですが。
 
FINDは、VBA。
COUNTFSは、Excel関数
 
FINDは、RANGオブジェクトを返しますが COUNTIFS は、数を返します。
EXCEL関数の方が高速に動作する事もありまので、COUNTIFS が使用される事も多いです。
 
 
方法については
質問者の方のスキルを文面を見ながら推測し回答をする事になります。
 
たとえるなら、
「となりにあるコンビニに何で行ったらいい?」と聞かれ
「徒歩でも、自転車でも、フ○ラーリでも、なんなら 匍匐前進でも」と回答者は答えるかもしれません。
 
目的によっては、特殊な方法を用いた方がベターな事もあるかもしれません。
 

引用:
Findを何か応用して使うのかはたまた違うものを用いほうがいいのか分からず
相談させていただいだけです。

よく言うのですが、ここでおっしゃる「いい」とはどんな状態なのでしょうね。
 
コーディングが少なくて済む
メンテナンスが楽
コーディングスキルが低くて良い
   :
   etc
 
それが回答者では判断できないので選択肢を広げる話をして、その中から選んでもらえればよいです。

回答
投稿日時: 19/02/19 22:19:20
投稿者: simple

色々とコメントしたが、
控えめに言っても、私やWinArrowさんの最初のコメントに結局のところ、
何も反応されていませんね。
  
まるで、店員さんが薦める洋服を、
「それは気に入らない」と無言で無視するお客様のようですね。
質問に対するコメントに対して、返事をするべきじゃないんですか?
 
Wordのスレッドでも気に入らない回答は、全くの無視です。
回答者は時間を使っているのですよ。
質問掲示板での礼儀を理解されていない方のようで、とても残念です。

投稿日時: 19/02/26 15:32:07
投稿者: chokobanana

Suzuさん
 
詳しい説明ありがとうございます。
 
処理時間が早い方法を探しておりました。
色々と調べまして今回は動的配列で行いたいと思います。
 
 
とても勉強になりました。
深く感謝いたします。