こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAの勉強初歩のものです。

エクセルVBAの勉強初歩のものです。

今A列に社名、B列に住所、C列に業務内容と記載されています。データは今のところ十数行です。フォームのテキストボックスでキーワードを入れて、検索ボタンを押して、A列の社名で検索してヒットすれば、社名、そのセルの右隣(B列)、その又右隣(C列)のセルの内容をフォームのテキストボックスに表示しようというものです。以下はソースの一部です。

'検索範囲設定
With Worksheets("sheet1").Range("A2:A" & Rows.Count)
If (flag = False) Or (firstRange Is Nothing) Then

   '初めての検索処理
'初めての検索処理
Set c = .Find(What:=myKey, After:=.Cells(.Count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns)

'最初の検索で見つからなければ、
If c Is Nothing Then
MsgBox "データは見つかりません", vbExclamation
Exit Sub

'最初の検索で見つかれば
Else
(1) d = c.Address

(2) Set e = d

(3) Debug.Print d.Value

(1)でヒットしたセルのアドレスをD(stringで定義)してそのまま、offset(0,1).valueとしようとしたのですが、offsetはオブジェクトでないと使用できないとの事。
だったら、eをオブジェクトで定義(dim d as object)として実行したら、= dで型が一致しませんとエラーがでました。

やりたいことは、A列で検索したセルのアドレスの把握はできているので、その右隣、そのまた右隣のセルのアドレスを取得する方法です。

もう一つやりたいことはその把握したセルのアドレスに記載されている情報を取得する方法です。(3)でも型が一致しませんとエラーが出ました。てっきり、
textbox1 = d.valueなんて感じでできるのだと思っていましたが。

おそらく方向としては間違っていないのでしょうけど、どなたか間違いと改善方法をよろしくお願いたします。

投稿日時 - 2010-02-28 23:27:31

QNo.5714440

すぐに回答ほしいです

質問者が選んだベストアンサー

Private Sub CommandButton1_Click()

Dim r As Range
Dim rin As Range

Set r = Sheet1.Range(Cells(2, 1), Cells(2, 1).End(xlDown))

Set rin = r.Find(Trim(TextBox1.Text))

TextBox2.Text = rin.Offset(, 1)
TextBox3.Text = rin.Offset(, 2)

End Sub

サンプルをアップします。テキストボックス1に社名を入れて
検索図を、アップします。

後は、自分で、応用してください。

投稿日時 - 2010-03-01 14:17:09

お礼

画面まで用意してくださったtom11さん、ありがとうございました。理解できました。私のは、rin.Offset(, 1)を代入するオブジェクト、この場合はテキストボックスが無く、本来なら、textbox1 = rin.Offset(, 1)とするところを、私のでは、1、textbox1というオブジェクトを用意していなかったので、エラーとひょうじされたこと、2、cがすでにrangeobjectということをマッタク知識としてなかったことです。この2点を吸収できて理解できました。

投稿日時 - 2010-03-01 20:51:54

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>おそらく方向としては間違っていないのでしょうけど・・・・
方向とは何を指しているのかは分りませんが
それよりも基本的なところの問題です
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
これも、文字列に要素、値は存在しないので
オブジェクトが無いと怒られます

この辺を理解できれば、御自分で修正できると思いますよ

参考まで

投稿日時 - 2010-03-01 14:21:33

お礼

silverfdさん、オブジェクト、range、型に関して詳細にご説明いただきありがとうございました。理解できました。もっと注意深くステップを踏んでゆきます。変更したソースではtom11さんの例とrange(d)・・・の両方を使わせていただきました。ありがとうございます。

投稿日時 - 2010-03-01 20:52:45

ANo.1

>(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なんてもっと慣れてから使えばいいと思います。型については、ほとんど理解できていないレベルです。変に(無理に)変数を使う前に、極力そのまま理解しやすい形でコーディングをして、もっと慣れてから変数を利用した方が、上達すると思いますよ。

投稿日時 - 2010-03-01 00:19:51

お礼

hige_082さん、silverfd同様、オブジェクトに関して詳細にご説明いただきありがとうございます。私のこれまでのオブジェクトの知識は浅かったので、更に深くなりました、ありがとうございました。

ご解答いただいたみなさま、お忙しい中、ホントウにありがとうございました。

投稿日時 - 2010-03-01 20:53:27

あなたにオススメの質問