プロが教える店舗&オフィスのセキュリティ対策術

今会社でエクセルを作成しています。
使用しているエクセルは2003です。

Ctrl+Fの機能とオートフィルタの機能を足したものを作成しようとしています。 

現在 入力している内容は下記になります。

Dim txt As String
Dim target As Range
Dim rng As Range
Dim adr As String

'Set target = Range("A6:L6 & 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 = Range("A6:L" & Rows.Count).FindNext(rng)
If rng.Address = adr Then MsgBox "終わりに達しました"
If MsgBox("続けて調べますか?", vbYesNo) = vbNo Then Exit Do
Loop

End Sub

項目はA6からL6までに記入されていきます。
一部内容は空白の部分もでますが、A6・B6は必須入力です。
下方向に内容が無限に増えて行きます。

現在エラーで
“オブジェクト変数または With ブロック変数が設定されていません”と出てしまっています。

Set rng = target.Find(txt, After:=target(target.Count), LookAt:=xlPart)
ここの部分がおかしいように思われます。
ですが、どう直せばいいのか分からず先に進めません…

皆様の知識をお借りできればと思い投稿致しました。
何卒宜しくお願い致します。

A 回答 (4件)

こんにちは。



検索する範囲の指定がうまく行ってないようですね。
検索する範囲は固定のようですから、
指定を一カ所に纏めておくと、スッキリして後から修正し易いです。
せっかく変数を使っているのですから、
.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 プロパティを使うなどして、
範囲を限定するようにしておいた方がトラブルを減らせますし、
他人が読んでも理解しやすいものになります。

以上です。

この回答への補足

まだまだ素人なので、変な組み方をしてしまった様です。
ご丁寧に有難う御座います。

お陰様で一旦解決出来ました!

因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか??

Ctrl+Fの検索の機能とオートフィルタのような抽出機能を併せ持ったものってマクロで組めるのでしょうか??

補足日時:2013/11/05 17:08
    • good
    • 0

#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列めがどうなっているのか解れば、何とかできるかも知れません。
これならば、
「検索して見つかればフィルタオプションで抽出する」
といった具合に、検索と抽出を組み合わせたい、というのも理解できます。

この他にも想像できるオーダーの解釈は数十通りありますけれど、
「これだ!」と言い当てるには根拠が少な過ぎます。
何をしたいのかハッキリと言葉にして、
改めて質問した方が早く解決できるのではないですか、
ということを書いていたつもりだったのですけれど。

ご検討なさってみてください。
    • good
    • 0

#2、cjです。

#2補足欄へのレスです。

> 因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか??

こちらを参考になさってください。
『オートフィルタを使い倒す』
http://officetanaka.net/excel/vba/tips/tips155.htm

抽出条件の指定方法として、ご提示のコードの流れを汲んで変数txtを使えば
  ...Criteria1:=txt
のようにすればよろしいかと。
部分一致を抽出するなら
  ...Criteria1:="=*" & txt & "*"
のようにワイルドカードを挿入します。

最新のバージョンでは、他のアプローチもあるようですが、
VBAからはAutoFilterを扱うのが簡単ですし、
今の所、情報も多いので安心だと思います。

質問者さんなら応用できると思いますが、
もしうまく行かないようでしたら、改めてお訊ねください。

この回答への補足

今貴殿に教えて頂いたものを使用しています。


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

となっております。
お陰様でこれは快適に動いてくれています。

ですが!これに教えて頂いたコードを入力しても
何故か動きません…

お手数でなければ、これのどこにコードを入力しているか教えて頂けますか。

申訳ありません…

補足日時:2013/11/06 08:59
    • good
    • 0

変数targetに何も設定されていないようです。


Set target=の行が 'でコメント行になっているようですが・・・

ついでに、Rangeの中も変な感じです。
Set target = Range("A6:L" & Rows.Count)
でしょうか。

この回答への補足

まだはじめたばかりで分からない事ばかりで
本当にご丁寧に有難う御座います。

上記の方と同じく、もしよければもう少し質問をさせて下さい。

----以下引用----

因みにオートフィルタの場合自分で選択をするとデータが抽出されますが、それをこの様な検索窓を使って抽出する事は出来ますか??

Ctrl+Fの検索の機能とオートフィルタのような抽出機能を併せ持ったものってマクロで組めるのでしょうか??

補足日時:2013/11/05 17:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/06 08:54

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