データベースシートから、名前で検索して個人カードシートに表示する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を組みたいと考えおります。
どうかよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
再び#1です。
見た限りコードのほうでは問題はなさそうに見えるんですがね。
となると。
可能性があるとすれば
>データベース(データ)のA:BBには”データ”と名前の定義
ここの定義を消してしまったか。
私の手元ダミーで、この定義を消して、実行すると、
「Rangeメソッドは失敗しました。_Globalオブジェクト」となり、
その行が黄色くなり止まりました。
エクセル上、Alt+I、N、D から名前の定義を再確認してみてはどうでしょうか。
ありがとうございます!!
定義が消えいていました。というか、いろいろやっているときに私が消してしまっていたんだと思います。
いろいろ試していたので、もはや何をしたかも覚えていない状態です(;^ω^)
でも、本当にありがとうございます。
長い間、お付き合いいただき、丁寧な回答、本当にありがとうございました。
できました。
感動です。
No.5
- 回答日時:
最後に。
#1です。とりあえず良かったですね。
今後はいろいろ知識を蓄積していかれるとよいと思います。
便利ですよ、知っとくと。
>初心者向けの本、本当の基礎からの本とか、ネットでとか見たり調べたり
わたしも本当に最初のころは、初心者向けの本から入りました。
で、最初から順番に、その本に書いてあることを、そのまんま自分でやってみました。
コードを書き写して実行して、どんなふうに動くのか、自分で体感してみる。
とりあえず、よくわかんないところがあっても、書いてある通りに、まず真似てやってみました。
で、その本をサッと一周終えてみました。
なんとなくおぼろげにしか分かりませんでしたが、でもずいぶん基礎知識の構築には
役に立ちました。
あとは、今回のご質問のような、実際に使うものにいろいろ当てはめてみて。
けっこう、エラーは出ますよね。今回みたいに。そんなのをググりながらあれこれ調べて
知識を蓄積していきました。だんだん理解が深まっていったというか。
それと、マクロの自動記録なんかも使って、「どうやって書くのか」ってことも調べたり。
今でもまだまだ知らないことは一杯あるので、さらに蓄積は要るなあと思っています。
なお、今回のコードを色々研究されるなら、以下のパーツで成り立っています。
ご参照ください。学習済みならすみません。
・変数の宣言と型・・・冒頭のDim のところ。Integer、String なんかのところ
・配列 ・・・ motohani のところ。
・配列の要素 ・・・ i=0 To Ubound(motohani) のところ。
・ループ ・・・ For Next の部分
・条件分岐 ・・・ If End If のところ
・検索 ・・・ Findメソッド
・指定分ずらした位置の処理 ・・・ Offsetプロパティ
ありがとうございます。
変数の宣言の所は勉強しました。宣言するんだ~ぐらいにしか頭に入りませんでした。
そのあとの、プロパティやメソッドがまだ頭に入っていません(;^ω^)
本で読んでやってみたのですが、関係性がつかめないというか、順番がつかめないというか・・・
配列はちょろっと読んでみましたが、これもまだちゃんと頭に入っていません。
結局のところ、どう組み立てたらいいのかが分かっていません。
次は上書きの部分をやってみましたが、上書きは問題なくできましたが(ネットからコピーで(-_-;))
次のやりたいことをどうすれば解決できるか検索中です。また、調べてみてどうにもならなくなったらこちらのほうで質問させていただくかもしれません。最後の説明ありがとうございます。今回のVBAと一緒にノートに書いておきます。本当に丁寧にありがとうございます。
No.3
- 回答日時:
再び#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」キーを一回ずつ押していきましょう。
一行ずつコードが実行されていきます。
各変数に何が入っているかが、ローカルウィンドウに示されますので、エラーの要因が分かることがあります。
直接の回答でなくて申し訳ないです。
No.2
- 回答日時:
#1です。
補足拝見しました。そのエラーはどのようなメッセージですか。
「型が一致しません」とか。
ひょっとして、さっきの時に、i まで String 型に変更していませんか。
i はループカウンタだから、ここは Integerでなくてはだめです。
>ネットで検索したりしながら、基本となる意味を分からないままで作成
このあたりのミスというのであれば、がっつりでなくてよいから、さらっと一周、
きちんと基本からやったほうがいいですよ。それだけでもだいぶ変わると思います。
意味も分からずネットからのコピペを繰り返して微修正だけしてても身に付きませんし、
現にエラー発生時の保守もできない状態になってしまっています。
No.1
- 回答日時:
>個人カード 検索値(名前入力セル)はJ6
>Dim tmpInt As Integer
>tmpInt = Sheets("個人カード").Range("J6").Value・・・←エラーになる
J6セルって名前が入るんですよね?
変数 tmpInt を整数型で宣言してるからエラー、ということでは?
あとは全く見ていませんがお知らせまで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
VBAでのエラー
-
なぜこんな初歩的なVBAのIf文で...
-
マクロについて教えてください...
-
VBAがブレークモードになっ...
-
ExcelVBA Range クラスの Page...
-
excel vbaでvlooupの変数がわか...
-
プロシージャ名の取得
-
Outlook.ApplicationをCreateOb...
-
VBS実行時エラー オブジェクト...
-
実行時エラー3001「引数が間違...
-
【Excel VBA】マクロをボタンに...
-
VBA リボンののリカバリーでオ...
-
EXCEL/VBAで、自分のPCだけエラ...
-
excel2016では問題ないのがexce...
-
VBSで変数の宣言はできないので...
-
「コンパイルエラー:プロシー...
-
VBAでWorkbook.addの使い方
-
クラシックASPでのエラー処理に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
マクロについて教えてください...
-
VBAでのエラー
-
実行時エラー3001「引数が間違...
-
ExcelVBA Range クラスの Page...
-
VBAがブレークモードになっ...
-
実行時エラー -'-2147417848
-
なぜこんな初歩的なVBAのIf文で...
-
VBSで変数の宣言はできないので...
-
VBS実行時エラー オブジェクト...
-
EXCEL VBAマクロ中断でデバッグ...
-
Application.ActiveInspectorで...
-
ADODB.Streamを使用してUTF-8を...
-
Outlook.ApplicationをCreateOb...
-
VBAのコードがエラーになっ...
-
EXCEL/VBAで、自分のPCだけエラ...
-
VBAのエラー発生場所をメッセー...
-
ASP.NET OleDbConnectionが定義...
おすすめ情報
ありがとうございます。調べて、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
何度も質問してしまい、申し訳ありません。
ありがとうございます。
今度は Set myRng = Range("データ").Columns(1).Find(tmpInt, LookAt:=xlWhole)が黄色くなっています。
エラーは
Rangeメソッドは失敗しました。_Globalオブジェクト
となっております。
初心者向けの本、本当の基礎からの本とか、ネットでとか見たり調べたりノートに書いたりしながら勉強してみましたが、さっぱり頭に入ってきませんでした(-_-;)
自分の理解能力が低いせいだというのは分かっていますが・・・(-_-;)
今回は取り急ぎ仕事で使用できるようにしたいのでこのような形になってしまいました。
一つ一つの構文をどういう意味か調べたりしながらやってはいるのですが、なかなか難しいです・・・。
何度も、ありがとうございます。
とんでもないです。いろいろありがとうございます。
何度も質問してしまい、すみません。本当にありがとうございました。
やはり、画像のようになってしまい、できませんでした。
基礎ができていない私には何が何だかさっぱりです(;^ω^)
もう一度勉強しながら作り直していきたいと思います。