プロが教えるわが家の防犯対策術!

データベースシートから、名前で検索して個人カードシートに表示するVBAを組みたいと考えています。VBAに関しては全くの素人で、最近始めたばかりです。個人シートから新規登録、検索、修正上書きがしたいと考えております。本を読んだり、ネットで検索したりしながら、基本となる意味を分からないままで作成してしまっています。新規登録はできるようになりました。が、検索のVBAを下記のようにするとエラーが出てしまいます。お恥ずかしい話ですが、基本が分かっていないのでなぜエラーになるのかも分かりません。
どうすれば、ちゃんとできるのか、ご教授いただけませんでしょうか。

個人カード 検索値(名前入力セル)はJ6
表示させたいセルは横一列になっていません。
表示範囲セルには”個人カード”と名前の定義がしてあります。
データベース(データ)のA:BBには”データ”と名前の定義がしてあります。

名前を入力するとデータより該当するレコードを検索して個人カードに表示させるというものです。

Sub 名前検索()

Dim tmpInt As Integer, motoHani(), myRng As Range, i As Integer

tmpInt = Sheets("個人カード").Range("J6").Value・・・←エラーになる

motoHani = Array("J5", "Y6", "I12", "M12", "Q12", "U12", "Y12", "G11", "N11", "Y8", "S6", _
"W6", "J7", "S8", "J9", "S10", "S11", "Z11", "Y10", "E12", "C13", "C14", _
"C15", "C16", "C17", "K13", "K14", "K15", "K16", "K17", "T13", "T14", _
"T15", "T16", "T17", "AB13", "AB14", "AB15", "AB16", "AB17", "C18", _
"N18", "Y18", "AB6", "AF6", "AB8")

Set myRng = Range("データ").Columns(1).Find(tmpInt, LookAt:=xlWhole)・・・←エラーになる

If myRng Is Nothing Then
MsgBox "該当するレコードはありませんでした"
Exit Sub
End If

For i = 0 To UBound(motoHani)
Range(motoHani(i)).Value = myRng.Offset(0, i + 1)
Next

End Sub

上記はネットで見つけたものをコピーして来たものです。ここはこうなのかな?といった感じで自分の状況に合うようにしてみましたが、間違っているようです。
申し訳ありませんが、説明もつけて教えていただけると、ありがたいです。

これができたら、次は修正したのち同じレコードの場所に上書きするというVBAを組みたいと考えおります。

どうかよろしくお願いいたします。

質問者からの補足コメント

  • ありがとうございます。調べて、Stringにしてみましたが、合っていますでしょうか?
    そうすると、今度は For i = 0 To UBound(motoHani)・・・この部分が青くなり、subが黄色くなってしまいます。
    Sub 名前検索() ・・・黄色くなる
        ・
        ・
        ・
    For i = 0 To UBound(motoHani) ・・・ここの i が青くなる
    Range(motoHani(i)).Value = myRng.Offset(0, i + 1)
    Next
    End Sub

    何度も質問してしまい、申し訳ありません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/05/03 11:55
  • ありがとうございます。
    今度は Set myRng = Range("データ").Columns(1).Find(tmpInt, LookAt:=xlWhole)が黄色くなっています。
    エラーは
    Rangeメソッドは失敗しました。_Globalオブジェクト
    となっております。
    初心者向けの本、本当の基礎からの本とか、ネットでとか見たり調べたりノートに書いたりしながら勉強してみましたが、さっぱり頭に入ってきませんでした(-_-;)
    自分の理解能力が低いせいだというのは分かっていますが・・・(-_-;)
    今回は取り急ぎ仕事で使用できるようにしたいのでこのような形になってしまいました。
    一つ一つの構文をどういう意味か調べたりしながらやってはいるのですが、なかなか難しいです・・・。
    何度も、ありがとうございます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/05/03 13:26
  • とんでもないです。いろいろありがとうございます。
    何度も質問してしまい、すみません。本当にありがとうございました。
    やはり、画像のようになってしまい、できませんでした。
    基礎ができていない私には何が何だかさっぱりです(;^ω^)
    もう一度勉強しながら作り直していきたいと思います。

    「Excel VBA 検索について」の補足画像3
    No.3の回答に寄せられた補足コメントです。 補足日時:2015/05/03 19:03

A 回答 (5件)

再び#1です。



見た限りコードのほうでは問題はなさそうに見えるんですがね。
となると。
可能性があるとすれば

>データベース(データ)のA:BBには”データ”と名前の定義

ここの定義を消してしまったか。

私の手元ダミーで、この定義を消して、実行すると、
「Rangeメソッドは失敗しました。_Globalオブジェクト」となり、
その行が黄色くなり止まりました。

エクセル上、Alt+I、N、D から名前の定義を再確認してみてはどうでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
定義が消えいていました。というか、いろいろやっているときに私が消してしまっていたんだと思います。
いろいろ試していたので、もはや何をしたかも覚えていない状態です(;^ω^)

でも、本当にありがとうございます。
長い間、お付き合いいただき、丁寧な回答、本当にありがとうございました。
できました。
感動です。

お礼日時:2015/05/03 21:46

最後に。

#1です。
とりあえず良かったですね。
今後はいろいろ知識を蓄積していかれるとよいと思います。
便利ですよ、知っとくと。

>初心者向けの本、本当の基礎からの本とか、ネットでとか見たり調べたり

わたしも本当に最初のころは、初心者向けの本から入りました。
で、最初から順番に、その本に書いてあることを、そのまんま自分でやってみました。
コードを書き写して実行して、どんなふうに動くのか、自分で体感してみる。
とりあえず、よくわかんないところがあっても、書いてある通りに、まず真似てやってみました。
で、その本をサッと一周終えてみました。
なんとなくおぼろげにしか分かりませんでしたが、でもずいぶん基礎知識の構築には
役に立ちました。

あとは、今回のご質問のような、実際に使うものにいろいろ当てはめてみて。
けっこう、エラーは出ますよね。今回みたいに。そんなのをググりながらあれこれ調べて
知識を蓄積していきました。だんだん理解が深まっていったというか。
それと、マクロの自動記録なんかも使って、「どうやって書くのか」ってことも調べたり。
今でもまだまだ知らないことは一杯あるので、さらに蓄積は要るなあと思っています。


なお、今回のコードを色々研究されるなら、以下のパーツで成り立っています。
ご参照ください。学習済みならすみません。

・変数の宣言と型・・・冒頭のDim のところ。Integer、String なんかのところ
・配列 ・・・ motohani のところ。
・配列の要素 ・・・ i=0 To Ubound(motohani) のところ。
・ループ ・・・ For Next の部分
・条件分岐 ・・・ If End If のところ
・検索 ・・・ Findメソッド
・指定分ずらした位置の処理 ・・・ Offsetプロパティ
    • good
    • 1
この回答へのお礼

ありがとうございます。
変数の宣言の所は勉強しました。宣言するんだ~ぐらいにしか頭に入りませんでした。
そのあとの、プロパティやメソッドがまだ頭に入っていません(;^ω^)
本で読んでやってみたのですが、関係性がつかめないというか、順番がつかめないというか・・・
配列はちょろっと読んでみましたが、これもまだちゃんと頭に入っていません。
結局のところ、どう組み立てたらいいのかが分かっていません。
次は上書きの部分をやってみましたが、上書きは問題なくできましたが(ネットからコピーで(-_-;))
次のやりたいことをどうすれば解決できるか検索中です。また、調べてみてどうにもならなくなったらこちらのほうで質問させていただくかもしれません。最後の説明ありがとうございます。今回のVBAと一緒にノートに書いておきます。本当に丁寧にありがとうございます。

お礼日時:2015/05/03 22:50

再び#1です。



>今度は Set myRng = Range("データ").Columns(1).Find(tmpInt, LookAt:=xlWhole)が黄色くなっています。

うーん、なんでしょうね、わたしもダミーデータでやってみましたが普通に動くのですが。
申し訳ないですがこれだけだとわたしは分かりません。
ひょっとしてですが、変数宣言の箇所で、myRng の型を変えてしまったりしましたか?
myRng は当初の通り、Range型でよいですよ。

エラーが出た時ですが、それぞれの変数に何が入っているのかを調べてみるのが一策です。
手っ取り早いのは、黄色くなっている時に各変数のところにポインタを近づけてみましょう。
近づけると何が入っているかが浮かび上がってきます。
黄色の行じゃないところでもいろいろな変数を見てみる。
今回でいうと、「tmpInt」とか、「myRng」とかです。

あるいは、VBE画面で、
表示(V) > ローカルウィンドウ(S) と進みましょう。
で、黄色い状態になっているならば、一旦クリアします。Alt+R、R で。
カーソルが「Sub 名前検索」~「End Sub」の間のどこかにある状態から、
「F8」キーを一回ずつ押していきましょう。
一行ずつコードが実行されていきます。
各変数に何が入っているかが、ローカルウィンドウに示されますので、エラーの要因が分かることがあります。

直接の回答でなくて申し訳ないです。
この回答への補足あり
    • good
    • 0

#1です。

補足拝見しました。

そのエラーはどのようなメッセージですか。
「型が一致しません」とか。

ひょっとして、さっきの時に、i まで String 型に変更していませんか。
i はループカウンタだから、ここは Integerでなくてはだめです。



>ネットで検索したりしながら、基本となる意味を分からないままで作成

このあたりのミスというのであれば、がっつりでなくてよいから、さらっと一周、
きちんと基本からやったほうがいいですよ。それだけでもだいぶ変わると思います。

意味も分からずネットからのコピペを繰り返して微修正だけしてても身に付きませんし、
現にエラー発生時の保守もできない状態になってしまっています。
この回答への補足あり
    • good
    • 1

>個人カード 検索値(名前入力セル)はJ6



>Dim tmpInt As Integer

>tmpInt = Sheets("個人カード").Range("J6").Value・・・←エラーになる


J6セルって名前が入るんですよね?
変数 tmpInt を整数型で宣言してるからエラー、ということでは?

あとは全く見ていませんがお知らせまで。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!