• ベストアンサー

エクセルで非表示にした行を、あるキーワードを元に再表示させる方法はありますでしょうか?

エクセル(97)で、例えば、1~50行まで 必要なくなって、非表示させたとします。 でも、ある時、23行目「だけ」再表示させたくなった場合、 何かのキーワード(例えば、「チワワ、 アメリカンショートヘアー、ブルドック」とかの 日本語のキーワード)を手がかりにその行だけ 再表示させる方法はありませんでしょうか?

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

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.11

A1に入力したキーワードがC欄に存在しなかった為に、A2はN/A(ノットアンサー)となりました。 コードの中でこのA2を参照していますが、N/Aの場合今回のようなエラーが発生します。 そこで、 B1に=ISNA(A2) を追加し Rows(Range("A2").value).Select より前に(もともとあるIF文の前でもかまいません) If Range("B1").value = True Then    msgbox"該当するものがありませんでした。" Exit Sub End If をいれてエラーを回避してください。 ISNA()関数がコード中で利用しようとするとうちの環境では未定義扱いになり利用できなかったので、シート側に埋め込みました。あまりスマートでないですがご了承を^^;;

noitigo
質問者

お礼

keikanさん!度々すみません!!!! エラーは出なくなりましたし、検索キーワードにも引っかかり、非表示状態から特定の一行を表示させれるようになりました! 本当にありがとうございましたm(_ _)m

その他の回答 (10)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.10

失礼しました。 =match(A1,C:C,0) に訂正してください。 また、場合によっては コピーして貼り付けたコードの中に何かゴミが入っているかもしれませんの よく見ておいてください。

noitigo
質問者

お礼

keikanさん!早速のアドバイスありがとうございます!!! >=match(A1,C:C,0) >に訂正してください。 さっそく訂正してみましたが、セル「A2」には、 「#N/A」という表示が出まして、セル「A1」に値を 入力したまいたら、「実行時エラー '13':」 「型が一致しません。」と出てしまいます。。。 私には分からないコードも多くて、もう何がなんだか・・ 何が原因だと思われますか? すみません、いつでもかまいませんので、 何か気づいた点ありましたら、またお力お貸し 頂けないでしょうか?すみません(ーー;)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.9

'がんばっておられますか?^^ 'コメント等舌足らずで申し訳内です^^;; '一番最初のコード類は無視してください。 'で、すいません行と列を勘違いしていたみたいです。 'また、検索関数として セルA2に =MATCH(A1,C,0) これで、A2にC列からA1の値を検索してそのセルの位置が帰ってきます。 'このコードを検索表示非表示させるシートのモジュールの貼り付けてください。 'このサブルーチンはシートの変更が行われたというイベントに対して呼び出されます。 Private Sub Worksheet_Change(ByVal Target As Range) ’呼び出された場合にどこのセルが変更されたか確認するためのIF文ですので、この"$A$1"部分(要絶対表記)を変更されれば、 キーワード位置が変更されます。 If Target.Address = "$A$1" Then 'あらかじめ隠す部分を選択し非表示しています。 Rows("3:50").Select Selection.EntireRow.Hidden = True '表示させる部分をA2から行番号拾ってきて選択肢表示させます。 Rows(Range("A2").Value).Select Selection.EntireRow.Hidden = False End If End Sub で、補足のところですが、一度に複数行表示させようとされてますか? 今のところこのルーチンでは1行しか表示できません。

noitigo
質問者

お礼

keikanさん!再びのアドバイスありがとうございます!! あと、返事遅れましてすみません。。 ちょっと風邪とヘルニアによる腰痛のダブルショックで へにょへにょでした。。。 とりあえず、 >セルA2に =MATCH(A1,C,0) をしてみたのですが、「入力した数式にはエラーが あります」が出てしまいます。。。 それと、下の部分は、 >'あらかじめ隠す部分を選択し非表示しています。 >Rows("3:50").Select 非表示にする部分は、だいたい18行~80行なので、 「Rows("18:80").Select」にしました(←18行から なのは私がファイルを使わせてもらったのが最近で、 17行目までは以前から非表示にしてあったからです) やはり「セルA2に =MATCH(A1,C,0)」所が解決して ないからでしょうか(?)、「A1」に何かを 入力すると「実行時エラー '1004':」 「アプリケーション定義またはオブジェクト定義の エラーです」が出てしまいます。 どうしたらいいでしょう?(T_T) 気長に待ちますので、またこのページを振り返られ ましたら、すみません、よろしくお願いしますm(_ _)m

  • keikan
  • ベストアンサー率42% (75/176)
回答No.8

非表示範囲ですが Columns("A:BZ").Select Selection.EntireColumn.Hidden = True のところでAかBZまで隠してますので、ここの範囲を変更して頂ければ、非表示の範囲を変更できます。 また、ご指摘のとおりこのルーチンでは表示するキーワード毎にCase文を埋めなくてはいけません^^;; そこで、キーワードとの対応がとれるように隠されているセルの中か、別のシートでどのキーワードがどの列を表示するのかということが関連付けされたものが必要になります。 各列の先頭(A1,B1,C1・・・)にキーワードが埋め込まれていたとします。 この条件であれば セルCB1に =MATCH(CA1,A1:BZ1,0) を埋め込んでここで検索させます。 で、表示ルーチンを下記のようにしてみてください。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$CA$1" Then Columns("A:BZ").Select Selection.EntireColumn.Hidden = True Columns(Application.ConvertFormula("C" & Range("CB1").Value, xlR1C1, xlA1)).Select Selection.EntireColumn.Hidden = False End If End Sub これでCA1のキーワードが変更されればうまくいくはずです。

noitigo
質問者

お礼

keikanさんも、またお手を貸して下さいましてありがとうございます!!! 月曜以降にまた、検証できますので、すみません、確認後にまた報告に参ります。。 すいません、御アドバイス本当に助かりますm(__)m

noitigo
質問者

補足

keikanさん、色々やってみたのですがどうもうまくいかなくて・・・(ーー;) まず、下のコードをVBEの使用するシートの中に コピーしました。。 Private Sub Worksheet_Change(ByVal Target As Range) Columns("A:BZ").Select Selection.EntireColumn.Hidden = True Columns(Application.ConvertFormula("C" & Range("CB1").Value, xlR1C1, xlA1)).Select Selection.EntireColumn.Hidden = False End If End Sub そして、私のファイル用に下のように少し変更しました。 >If Target.Address = "$A$1" Then(←とりあえず、検索するセルはA列にと思いまして…) >Columns("C").Select(←C列の件名をキーワードに検索をかけるので…) やってること。。。なんかちんぷんかんぷんです??? 最初に教えて頂いたご回答の、記事の上の方にある コードもどっちかにはったり張り替えたりしましたが、 それも何も起こらずで・・・(ーー;) その(最初の)コードはもう無視していいのでしょうか? 世話のやける私ですが、また近々ここを覗く事が ありましたら、すいません、よろしくお願い致します(T_T)

noname#29107
noname#29107
回答No.7

#5です。 >実行すると、表示させたい一行だけ表示されるのじゃなくて、 >複数非表示させてる行が全て表示されてしまいます。 検索実行前に、列の選択や範囲の選択をしていませんか? 列や範囲は選択しないで、検索してみてください。

noitigo
質問者

お礼

rebellionさんも再度のご回答ありがとうございます!!! 次に動作確認が出来るのが月曜以降になってしまうので、また動作確認後、報告致します<(_ _)> 来週、パソコンに触れる時間が限られてくるかもしれないので、報告の返事遅れてしまったらすみません(ーー;)

noitigo
質問者

補足

rebellionさん!謎は解けました! >全て表示されてしまいます。 の原因の一つは、 「行を非表示にしてみた直後にすぐまた (キーワード検索&)再表示を実行」 してしまってたのと、もう一つは「行を範囲選択して 右クリックで再表示させてた」からみたいです。。。 メニューの中の「再表示」コマンドも マクロ登録できましたし、ボタンに登録して 実行する事も出来ましたので、あとは、 エクセルのシート内を検索する方法を他の皆さんが 受け入れてくれるかが課題です^^; でも、とてもいいアイデアで助かりました! とりあえず、こういう解決策はあるというふうに、 皆様に伝える事ができます! 改めて、お礼申し上げますm(_ _)m

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

ワークシートにボタンを1つ貼りつけます。 (例データ) A1:B30(50行を少し端折った) ショート 千葉 秋田 国分寺 ウエルシュ 横浜 チワワ 大阪 レトリバ 川口 ブルドッグ 大宮 ショート 松戸 レトリバ 池袋 ブルドッグ 浦和 秋田 武蔵野 ダックス 川口 チワワ 東京 レトリバ 新宿 ショート 浦安 ブルドッグ 柏 秋田 八王子 ブルドッグ 横浜 ダックス 池袋 ポインタ 渋谷 チワワ 神奈川 シェパード 大船 ミニダックス 品川 シープ 町田 セッター 相模原 ブルドッグ 名古屋 ダックス 品川 ポインタ 大船 シェパード 川崎 ミニダックス 小田原 ハスキー 渋谷 A1:B30は非表示にしてもしなくても検索に関係なし を確認済み。 ボタンのクリックイベントに Private Sub CommandButton1_Click() w = InputBox("検索=") Range("A1:A30").Select Set x = Selection.Find(What:=w, after:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False) If x Is Nothing Then Exit Sub If Not x Is Nothing Then x.Activate f1 = x.Row MsgBox Cells(f1, "A") & Cells(f1, "B") & f1 Do c = c + 1 Set x = Range("A1:A30").FindNext(after:=x) f = x.Row If x Is Nothing Or f = f1 Then Exit Sub MsgBox Cells(f, "A") & Cells(f, "B") & f x.Activate Loop End If End Sub を貼りつけます。 ボタンをクリックすると、犬の種類を聞いてきますから カナで入力してください。 今その犬が在庫のある店名がメッセージボックスに店名回 表示されます。上記はA、B列と第何行を表示してます。 (本番では検索列は、上記A列は、C列らしい) ニーズに近いところまで行っていると思うが、本番に合わせて、質問者の方でコードを変えられるでしょうか。

noitigo
質問者

お礼

imogasiさん!再びありがとうございます!!! あと、返事が遅れてしまってすみません。 次に動作検証が出来るのが月曜以降になってしまうので、また動作確認後報告いたします。 ファイルを自宅に持ち帰って検証するのはダメみたいなので本当にすみません(ーー;)

noitigo
質問者

補足

imogasiさん、遅れましてすみません とりあえず、一度やってみました! まず、「コントロールツールボックス」から ボタンを貼り付けて、コードを貼り付けてみました。 そして、下記の4行だけ >Range("A1:A30").Select >MsgBox Cells(f1, "A") & Cells(f1, "B") & f1 >Set x = Range("A1:A30").FindNext(after:=x) >MsgBox Cells(f, "A") & Cells(f, "B") & f このように↓、私の扱ってるファイル用に、 Range("C5:C250").Select MsgBox Cells(f1, "C") & f1 Set x = Range("C5:C250").FindNext(after:=x) MsgBox Cells(f, "C") & f おそるおそる変更してみました。。^^; そしてボタンをクリックしてみましたら、 C列の私の範囲した行が反転しまして、 検索キーワードに引っかかった行が選択されて、 出てきた「OKダイアログ」ボタンの中に 「名前+行番号」が表示されました!! ですが、非表示した行の項目が再表示されたりは しなかったのですが、また私の動作にどこか問題がありですか?(T_T) 私も結構近いところまできてるように感じるのですが、 まだまだ私のVBAの修正能力がおっついてないみたいです(T_T) 私は午後から仕事で外に出ますので、本日はレスポンス悪いかもしれません、すみません。。 また、ご指摘ありましたら、お手すきの時に よろしくお願い致しますm(_ _)m

noname#29107
noname#29107
回答No.5

すでにVBAによる回答がついているところなのですが・・・ コマンドで出来るのではないかと思います。 ただ、私の環境はExcel2002なので、質問者さんの環境で動作するかどうか。 行が非表示の状態で、メニューから編集=>検索(またはCtrl+F)で検索ダイアログを表示、検索する文字列に例えば「チワワ」と入力、次を検索ボタンを押します。閉じるを押して検索ダイアログを閉じます。 メニューから書式=>行=>再表示を選びます。 Excel97ですと、メニュー項目が違うかもしれません。

noitigo
質問者

お礼

rebellionさん!ご回答ありがとうございます!! >行が非表示の状態で、メニューから編集=>検索 >(または>Ctrl+F)で検索ダイアログを表示、 >検索する文字列に例えば「チワワ」と入力、 >次を検索ボタンを押します。閉じるを押して >検索ダイアログを閉じます。 >メニューから書式=>行=>再表示を選びます。 メミュー項目は同じで問題なかったのですが、 実行すると、表示させたい一行だけ表示されるの じゃなくて、複数非表示させてる行が全て表示されてしまいます。。バージョン97だから無理なのでしょうか?

  • keikan
  • ベストアンサー率42% (75/176)
回答No.4

こんな感じではどうでしょう^^ 下記モジュールを埋め込んでみてください。 一応うまくいくはずなんですが^^;; で、キーワードの入力を$CA$1に固定してありますが IF文を省くとシート全体に対してキーワードにが変更されたかどうか見に行きます。 '表示非表示したいSheetモジュールに Private Sub Worksheet_Change(ByVal Target As Range) ' ' Dogs: 2004 7 9 ユーザー名 : keikan ' If Target.Address = "$CA$1" Then Dogs (Target) End If End Sub 'この関数を複数のシートで利用されるなら新規モジュールなどに Sub Dogs(Dog_Name As String) ' ' Dogs: 2004 7 9 ユーザー名 : keikan ' Columns("A:BZ").Select Selection.EntireColumn.Hidden = True Select Case Dog_Name Case "チワワ" Columns("A").Select Case "ブルドッグ" Columns("B").Select Case "ゴールデンレトリバー" Columns("C").Select Case Else Columns("A:BZ").Select End Select Selection.EntireColumn.Hidden = False End Sub

noitigo
質問者

お礼

keikanさん!御アドバイスありがとうございます!! >キーワードの入力を$CA$1に とりあえず、各モジュールを埋め込んでやってみました! ですが、「B列~BZ列」までがごっそり非表示になってしまいました! 私のやり方が悪いのでしょうか?(T_T) もしくはこれもエクセルバージョン97のなせる技ですかね^^; あと、私はまだVBA超初心者なので詳しくは わからないのですが、下のコードですと、 >Select Case Dog_Name >Case "チワワ" >Columns("A").Select >Case "ブルドッグ" >Columns("B").Select >Case "ゴールデンレトリバー" >Columns("C").Select 「チワワ」「ブルドック」「ゴールデンレトリバー」の文字列の時しか作用しないのでしょうか? 検索して再表示するかもしれないキーワードは何百件も あるので、その場合、全部 >Case "***" >Columns("D").Select >Case "***" >Columns("E").Select のようにコードを記述していかなければなりませんか? いたらなくてすみません(ーー;) また、ここを覗かれましたら、お時間とれましたら御アドバイスして頂けますと助かります。よろしくお願いしますm(_ _)m

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

操作では難しいでしょう。 しかしVBAで組めば、出来そうです。よければ考えますが。 普通は1~50行までは、参照用と言うことで別シートに 置くのがよいのではと思いました。 キーワードを検索する範囲はA列とか単一行ではないのでしょうか。 検索語は1回1語ではだめでしょうか。

noitigo
質問者

お礼

imogasiさん!アドバイスありがとうございます!!! また、度々のお力添えありがとうございます!!!! >普通は1~50行までは、参照用と言うことで 別シートに置くのがよいのではと思いました。 私も他の課のかたのお手伝いという形として そのファイルを管理・改良しているので、 よくわからないのですが、何やら、いじれる部分と いじれない部分があるらしく、とにかくデータは 削除せずに(でも、非表示はいいらしく)一つの シートに残しておきたいような事を言ってました・・・ なので、とりあえずそのシート内で非表示の方法を 考えてるのですが、「その非表示した行から一行だけ 表示したい時に、またその行だけ再表示できるか?」と 尋ねられたので、ちょっと困ってしまいました。。。 一番下の行なら手動ですぐに引っ張り出して 表示できるでしょうが、真ん中の行とかだと、 とりあえず全部再表示するしかないですよね?! そうなると、あとで再表示させときたい行だけを 残して、また他の非表示にしてあった行を改めて 全て非表示にし直さなければなりません・・・ なので、キーワードを元に一部を再表示できるような 機能があればいいなぁって思って模索していました! >キーワードを検索する範囲はA列とか単一行ではないのでしょうか。 検索する範囲はC列に件名が入ってますので、C列で出来たらと考えています。 他の列だと一行一行に同じ文字列が入ってる場合も多いので、複数が引っかかってしまうので・・・ >検索語は1回1語ではだめでしょうか。 検索語は一回につき1語(一単語)でいいです。 何かいい解決策ありますでしょうか? すみません、また、お手が空いた時でいいので、 よろしくお願い致しますm(_ _)m

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.2

「データ」「フィルタ」にある「オートフィルタ」か「フィルタオプションの設定」を使われたら如何ですか? オートフィルタの場合は、選択した内容で行の表示/非表示を設定できます。 ただ、1項目に2つしか設定できません。 「フィルタオプションの設定」の場合は 別途、項目名と表示したい内容を作成する必要がありますが こちらは条件が3件以上でも対応できます。

noitigo
質問者

お礼

mshr1962さん!御回答ありがとうございました!+いつもお世話になっております!!! 私が今管理しているファイルは、わりとおっきい エクセルの表(列はAR列まで、行は200行以上)が 入ってるのですが、オートフィルタはなぜかうまく 作用しないのです・・・。 表の外の一番上の行にプルダウンのマークが出てきたり、 そのマークじたいが出てこなかったり…^^; そのことじたいも問題なのですが、 イメージとしては「ボタン一つであるキーワードや 日付が入った沢山の行をいっぺんに非表示に出来て、 でもその非表示した行の中から見たい一行が出てきたら すばやくその行だけ再表示するような…」そんな機能みたいです。 私の職場でエクセルの操作をする人は、 慣れてる人から慣れてない人まで様々ですので、 ある程度誰でも感覚的に操作できるようにマクロを 組んでみたいのですが(ボタンに登録する形の)、私では力及ばず質問させて頂きました・・・ また、何かありましたらお手すきの時でかまいませんので、すみません、よろしくお願い致しますm(_ _)m

  • snoopy64
  • ベストアンサー率42% (337/793)
回答No.1

マクロになりますね。 1.キーワードを1~50行の中から探す。 2.見つかったセルの行を再表示する。 これを実行する処理をVBAに記述します。 後はこの処理を実行させるトリガー(きかっけ)ですが、 1.キーワードを入力するセルと、検索ボタンを用意して、ボタンを押すと実行する。 または 2.51行目以降のどのセルでも、値が入力されたら実行する。 極端な例としてこんな感じでしょうか。 言いたかったのは、方法はある、ということです。 頑張ってくださいヽ(^。^)ノ

noitigo
質問者

お礼

snoopy64さん!御回答ありがとうございます! 「方法はある」とのことで少しホッとしました! VBAは今勉強中で、簡単なコードは読めるようになりましたし、少しの修正や、書込みも出来るようになってきました! よりステップアップを目指して少しずつ勉強がんばってみます^^ 励ましありがとうですm(_ _)m

関連するQ&A

専門家に質問してみよう