• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【至急】VBAについて)

VBAについてのエクセル作成方法

このQ&Aのポイント
  • エクセル2003を使用している会社で、Ctrl+Fとオートフィルタの機能を足したエクセル作成方法を教えてください。
  • 質問者は現在、入力内容に対して検索機能を組み込もうとしていますが、エラーが発生しています。
  • エラーメッセージ「オブジェクト変数または With ブロック変数が設定されていません」が表示され、問題の箇所を見つけることができません。助けてください。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。 検索する範囲の指定がうまく行ってないようですね。 検索する範囲は固定のようですから、 指定を一カ所に纏めておくと、スッキリして後から修正し易いです。 せっかく変数を使っているのですから、 .FindNextメソッドのオブジェクト指定もtargetを使うようにしましょう。   Set target = Range("A6:L" & Rows.Count)   txt = InputBox("検索する内容を記述して下さい。")   If txt = "" Then Exit Sub   Set rng = target.Find(txt, After:=target(target.Count), LookAt:=xlPart)   If rng Is Nothing Then     MsgBox "ありません"     Exit Sub   End If   adr = rng.Address   Do     rng.Activate     Set rng = target.FindNext(rng)     If rng.Address = adr Then MsgBox "終わりに達しました"     If MsgBox("続けて調べますか?", vbYesNo) = vbNo Then Exit Do   Loop もうひとつRange型変数 target を省略して、With フレーズを使った例。   With Range("A6:L" & Rows.Count)     txt = InputBox("検索する内容を記述して下さい。")     If txt = "" Then Exit Sub     Set rng = .Find(txt, After:=.Cells(.Count), LookAt:=xlPart)     If rng Is Nothing Then       MsgBox "ありません"       Exit Sub     End If     adr = rng.Address     Do       rng.Activate       Set rng = .FindNext(rng)       If rng.Address = adr Then MsgBox "終わりに達しました"       If MsgBox("続けて調べますか?", vbYesNo) = vbNo Then Exit Do     Loop   End With それから、   Range("A6:L" & Rows.Count) 検索する範囲は、なるべく限定的に指定した方が良いです。 VBAでもExcelの検索機能でも、必ずしも最終行まで探す訳ではありませんけれど、 シートの構成に因っては処理に大きな時間が掛かる場合もありますので、 例えば、どこかひとつの列(仮にA列)を基準に最下行を決める、   Range("A6:L" & Cells(Rows.Count, "A").End(xlUp).Row) とか、場合によっては.CurrentRegion プロパティを使うなどして、 範囲を限定するようにしておいた方がトラブルを減らせますし、 他人が読んでも理解しやすいものになります。 以上です。

lisa3876
質問者

補足

まだまだ素人なので、変な組み方をしてしまった様です。 ご丁寧に有難う御座います。 お陰様で一旦解決出来ました! 因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか?? Ctrl+Fの検索の機能とオートフィルタのような抽出機能を併せ持ったものってマクロで組めるのでしょうか??

その他の回答 (3)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#2、3、cjです。#3補足欄へのレスです。 > Ctrl+Fの機能とオートフィルタの機能を足したものを作成しようとしています。 というお望みだということまでは理解できますが、 具体的にどのように抽出したいのか、情報が不足しているので、 答えるのが難しいのです。 今こちらで解っているのは、 <元の質問> > 項目はA6からL6までに記入されていきます。 > 一部内容は空白の部分もでますが、A6・B6は必須入力です。 > 下方向に内容が無限に増えて行きます。 <#2補足> > 因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか?? > Ctrl+Fの検索の機能とオートフィルタのような抽出機能を併せ持ったものってマクロで組めるのでしょうか?? 足りない情報は、 「どの列を基準に」 「どんな条件(文字列であれば完全一致なのか部分一致なのか)で」 フィルタを掛けたいのか、 また、「検索機能とどのように関連付けるのか」 などです。 "オートフィルタの場合自分で選択をするとデータが抽出されます" ということですので、 実際、手作業では、どこかの列を指定して抽出をされている筈です。 特定の列を基準にしているのであれば、 例えば仮に「B列を基準に」「部分一致で」抽出するなら Sub Sample8335126()   Dim txt As String   txt = InputBox("抽出する内容を記述して下さい。")   If txt = "" Then Exit Sub   Range("A5:L" & Cells(Rows.Count, "A").End(xlUp).Row).AutoFilter Field:=2, Criteria1:="*" & txt & "*" End Sub 骨格としては以上のようになりますが、これではお求めの答えになっていないのでしょう。 後は、これを検索機能とどのように組み合わせたいのか、 もう少し、ご自身でオーダーを整理しないと、こちらも手を付けられません。 "オートフィルタの場合自分で選択をするとデータが抽出されます" ということを無視するならば、 実際には手作業で出来ていないことをマクロで実現したい、という解釈も成り立つ訳で、 例えば、   「A:L列の範囲に6行めから(タイトル含まず)始まる表があり、   その表の中で指定の文字列が含まれるセルすべてについて   その行を抽出したい」 というようなことでしたらば、それはオートフィルタではなくて、 フィルタオプションを使って実現することになります。 その場合は列に固有の項目行が必要になりますから、 5列めがどうなっているのか解れば、何とかできるかも知れません。 これならば、 「検索して見つかればフィルタオプションで抽出する」 といった具合に、検索と抽出を組み合わせたい、というのも理解できます。 この他にも想像できるオーダーの解釈は数十通りありますけれど、 「これだ!」と言い当てるには根拠が少な過ぎます。 何をしたいのかハッキリと言葉にして、 改めて質問した方が早く解決できるのではないですか、 ということを書いていたつもりだったのですけれど。 ご検討なさってみてください。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#2、cjです。#2補足欄へのレスです。 > 因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか?? こちらを参考になさってください。 『オートフィルタを使い倒す』 http://officetanaka.net/excel/vba/tips/tips155.htm 抽出条件の指定方法として、ご提示のコードの流れを汲んで変数txtを使えば   ...Criteria1:=txt のようにすればよろしいかと。 部分一致を抽出するなら   ...Criteria1:="=*" & txt & "*" のようにワイルドカードを挿入します。 最新のバージョンでは、他のアプローチもあるようですが、 VBAからはAutoFilterを扱うのが簡単ですし、 今の所、情報も多いので安心だと思います。 質問者さんなら応用できると思いますが、 もしうまく行かないようでしたら、改めてお訊ねください。

lisa3876
質問者

補足

今貴殿に教えて頂いたものを使用しています。 Sub ボタン24_Click() With Range("A6:L" & Rows.Count) txt = InputBox("検索する内容を入力して下さい。") If txt = "" Then Exit Sub Set rng = .Find(txt, After:=.Cells(.Count), LookAt:=xlPart) If rng Is Nothing Then MsgBox "ありません" Exit Sub End If adr = rng.Address Do rng.Activate Set rng = .FindNext(rng) If rng.Address = adr Then MsgBox "終わりに達しました" If MsgBox("続けて調べますか?", vbYesNo) = vbNo Then Exit Do Loop End With End Sub となっております。 お陰様でこれは快適に動いてくれています。 ですが!これに教えて頂いたコードを入力しても 何故か動きません… お手数でなければ、これのどこにコードを入力しているか教えて頂けますか。 申訳ありません…

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.1

変数targetに何も設定されていないようです。 Set target=の行が 'でコメント行になっているようですが・・・ ついでに、Rangeの中も変な感じです。 Set target = Range("A6:L" & Rows.Count) でしょうか。

lisa3876
質問者

お礼

ご丁寧にご指摘有難う御座います。 また質問する際には懲りずに宜しくお願い致します!

lisa3876
質問者

補足

まだはじめたばかりで分からない事ばかりで 本当にご丁寧に有難う御座います。 上記の方と同じく、もしよければもう少し質問をさせて下さい。 ----以下引用---- 因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか?? Ctrl+Fの検索の機能とオートフィルタのような抽出機能を併せ持ったものってマクロで組めるのでしょうか??

関連するQ&A