- ベストアンサー
エクセルVBAでのセル情報検索方法と取得方法
- エクセルVBAを利用して、特定のキーワードを使ってセルに情報を検索する方法について解説します。
- また、検索したセルの隣のセルの情報を取得する方法も説明します。
- 具体的なコードの一部を示しながら、オブジェクトの取り扱いやエラーの解決方法についても詳しく説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- hige_082
- ベストアンサー率50% (379/747)
>おそらく方向としては間違っていないのでしょうけど・・・・ 方向とは何を指しているのかは分りませんが それよりも基本的なところの問題です objectの意味が理解出来ていません ヘルプから、findの検索結果はRangeObjectで返されるとあります では、RangrObjectとは セルの場所、値、色、文字のフォント、文字の色、文字の大きさ 書式・・・・・など、セルを構成している要素の集まりです セルの各要素の取出す方法として RangeObjectの後に要素名(プロパティ)で取出すことが出来ます 場所=Range("A1").Addres 値=Range("A1").Value 文字の色=Range("A1").Font.Color などなど 要素も取出されてしまうと、ただのデータ(文字列、数値など)です 質問に有る下記の一部分はエラーになることが分ると思います >(1) d = c.Address cと言うRangeObujectからAddress要素を取出して dへ代入されているので、dはRangeObujectでは無く文字列です >(2) Set e = d SetはObjectを変数に代入するためのコマンドです Object変数eへ文字列を代入しようとしているので 型が一致しないと怒られます >(3) Debug.Print d.Value これも、文字列に要素、値は存在しないので オブジェクトが無いと怒られます この辺を理解できれば、御自分で修正できると思いますよ 参考まで
お礼
silverfdさん、オブジェクト、range、型に関して詳細にご説明いただきありがとうございました。理解できました。もっと注意深くステップを踏んでゆきます。変更したソースではtom11さんの例とrange(d)・・・の両方を使わせていただきました。ありがとうございます。
- silverfd
- ベストアンサー率57% (204/356)
>(1)でヒットしたセルのアドレスをD(stringで定義)してそのまま、offset(0,1).valueとしようとしたのですが、offsetはオブジェクトでないと使用できないとの事。 だったら、eをオブジェクトで定義(dim d as object)として実行したら、= dで型が一致しませんとエラーがでました。 cは最初からRangeObjectなわけですよ、c.offset(0,1).value(CはObject)で読めるものを、何でわざわざdを使ってd=c.address(adressはString型)に変換して読めなくしているの?しかも、それ(d=string型=ただの文字列)をただ”=”(イコール)で何もしないでeオブジェクトにきるわけがないでしょう。dは、ただの文字列(例えば、"$A$5"という文字)ですよ。dをaddressとしてcのアドレスを取得してそれを使うなら、range(d)でこれがRangeObjectですから、dを使いたいならrange(d).offset(0,1).value。あと、別途eを使いたいなら、set e=Range(d) もうひとつやりたいこと、の方ですが、「 dで型が一致しませんとエラーが」がパスしない以上、通るわけがないんですが。で、上記で通るようになれば、textbox1=range(d).valueとかでできるはずです。無論d.valueなんていう表現をシステムは理解できませんので(何度も言いますが上記ではdはただの文字列であり、セルの取得なんてそのままでは絶対にできない)TextBoxに表示できるものはなく、エラーになります。 全体的に、文法のレベルと理解のレベルが合っていません。withなんてもっと慣れてから使えばいいと思います。型については、ほとんど理解できていないレベルです。変に(無理に)変数を使う前に、極力そのまま理解しやすい形でコーディングをして、もっと慣れてから変数を利用した方が、上達すると思いますよ。
お礼
hige_082さん、silverfd同様、オブジェクトに関して詳細にご説明いただきありがとうございます。私のこれまでのオブジェクトの知識は浅かったので、更に深くなりました、ありがとうございました。 ご解答いただいたみなさま、お忙しい中、ホントウにありがとうございました。
お礼
画面まで用意してくださったtom11さん、ありがとうございました。理解できました。私のは、rin.Offset(, 1)を代入するオブジェクト、この場合はテキストボックスが無く、本来なら、textbox1 = rin.Offset(, 1)とするところを、私のでは、1、textbox1というオブジェクトを用意していなかったので、エラーとひょうじされたこと、2、cがすでにrangeobjectということをマッタク知識としてなかったことです。この2点を吸収できて理解できました。