エクセルで1文字入力する度に自動で検索結果を表示する方法

このQ&Aのポイント
  • エクセルでA1に1文字入力する度に自動で検索結果が表示される方法について教えてください。
  • 現在、エクセルのVBAプログラムを使用してA列の文字列を検索し、該当した行を表示させていますが、エンターを押さなくても1文字入力するたびに検索結果を表示するようにしたいです。
  • 具体的な要件としては、A1に「あ」と入力した場合、該当する行が表示され、さらに「あい」と入力した場合にはさらに該当する行が表示されるようにしたいです。
回答を見る
  • ベストアンサー

(セルに)1文字入力される度に検索したい(エクセル

Private Sub Worksheet_Change(ByVal Target As Range) 'A1が変化したら If Target.Row = 1 And Target.Column = 1 Then Call Samplex End If End Sub 今は、上記プログラムで、A1に変化があったとき(文字を入力してエンターを押したとき)に、A列の各行の文字列を検索し、該当した行を表示させています。 これを、エンターを押さなくても、1文字入力するたびに、自動で検索結果が表示されるようにしたいです。 例 A1に「あ」と入力 あ あい あいう という文字列のある行が表示され さらに「あい」と入力すると、 あい あいう という行が表示される。 どなたかよろしくお願いします。

noname#257017
noname#257017

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

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

#2です。#2では半角の文字入力限定で考えました。 その後、全角入力の場合を考えてみました。 参考に。 この場合のEventsは、TextBox1_Changeイベント、が良いようです(これしかない?)。 しかし1字を入力するごとに際して、カナ漢字変換のために、Enterキーを押さざるを得ないことは、辛抱して。 ーー 例データ Sheet1のA1:B7 大 1 大阪 大阪城 大阪市 市長 山田一郎 大阪市北区 区長 永田哲郎 大阪市北区区議 区議 大野 健 大阪市北区北小学校 校長 北野 滋 大阪市北区北小学校教頭 教頭 浅野 美幸 ーー  標準モジュールに Public keyword1 Sub macro1(keyword) Dim myRange As Range Dim myObj As Range Set myRange = Range("A1:A15") Set myObj = myRange.Find(keyword, LookAt:=xlWhole) If myObj Is Nothing Then Worksheets(1).Label1.Caption = "見つからず" Else Worksheets(1).Label1.Caption = "'" & keyword & " 'は" & myObj.Offset(0, 1) End If End Sub Sub test01() keyword1 = "" End Sub ーーー Sheet1のTextBox1_Changeイベントに Private Sub TextBox1_Change() txt = TextBox1.Value Label1.Caption = txt keyword1 = txt macro1 (keyword1) End Sub == 全般的に使いみち(目的)や,データ例を質問に説明しておらず、当方は一人相撲をやっているかも。 質問者は、#2回答すぐやって見て、その結果の確認さえも、すぐには、出来ないようで、本件は質問者には荷が重いようだ。 テーマも奇抜で、初心者向けではない。小生以外の回答もない。本件はあきらめてはどうか。

noname#257017
質問者

お礼

追加のソースコードありがとうございます まったくの素人ですが、なんとかやってみます

その他の回答 (2)

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

#1です。 エクセルで、開発ーVisualbasic シートSheet1に下記コントロールを張り付ける。 VBEの画面で、挿入ーテキストボックス(1つ)、ラベル(1つ)(Activexの方) 普通は小生は、確認用には、Msgboxを使うのだが、「判りました」の「OK」部をマウスでクリックするのを省くため、ラベルに表示することにした。 ラベルは結果確認用で、確認(OKなど)のクリックを省くために使う。 加えて、1語句の最終文字が終わり、次の語句を処理するために、コマンドボタンを1つ貼り付け。 今までの語句の続きをやめ、コマンドボタンは次の語句に進むために設けたもの。 コマンドボタンのCaptionは、「次の語句」などが良いかも。 ーーー シートデータとして A列、B列に下記データを作成 A1:B14 a エイ ab エイビー ac エイシー ad エーディ abc エービーシー abd エービーディー abe エービーイー abf エービーエフ abcd エービーシディー abce エービーシイー abcf エービーシイーエフ abcg エービーシイージー acd エーシーディー adc エーデーシー ーーー 標準モジュールに Public keyword1 Sub macro1(keyword) Dim myRange As Range Dim myObj As Range Set myRange = Range("A1:A15") Set myObj = myRange.Find(keyword, LookAt:=xlWhole) If myObj Is Nothing Then Worksheets(1).Labels(1).Caption = "見つからず" Else Worksheets(1).Labels(1).Caption = "'" & keyword & " 'は" & myObj.Offset(0, 1) End If End Sub Sub test01() keyword1 = "" End Sub ==== Sheet1のシートモジュールに Private Sub CommandButton1_Click() test01 keyword1 = "" TextBox1.Text = "" End Sub Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) keyword1 = keyword1 & Chr(KeyAscii) MsgBox keyword1 'テスト後この行削除 macro1 (keyword1) End Sub === テキストボックスに1字入力するごとに、その状態の語句でA列を検索し、見つかれば、B列のデータ・検索結果をラベルに表示。 凝った話で、質問者の発想に余り賛成しないですが。  考えて、テストするのに、相当時間が掛かり、上記も全角文字を入れたときのテストができてない。 まあ参考程度に見てください。

noname#257017
質問者

お礼

ソースコードありがとうございます トライしてみます

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

小生の経験では、エクセルVBAで、TEXTBOXのイベントで、1文字入力するごとに、反応してくれるイベントがあることを思い出した。 本日は遅い時刻なので、明日、簡単な例とコードを挙げますので、考えてみてください。 ただ英文字の文字列なら、考えた例の範囲だが、日本語の全角文字で、上手く行くかどうかテストできてない。 文字コードも最近では、シフトJISのほかに、UTF-8なども使われていて、そこまで知識・経験が及ばない。

noname#257017
質問者

お礼

ちょっと考えて(調べて)みます、ありがとうございました

関連するQ&A

  • エクセル マクロを利用して繰り返して入力する方法

    マクロでA1B1C1D1E1F1セルに入力しF1入力後A2B2C2D2E2F2と 下方向へ繰り返し800行くらいまで入力し、それとB列はスキップしたいのですが下記の方法で別々のシートでは うまくいくのですが同じシ-ト内ではエラ-になってしまいます 次の行への移動 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 7 Then Cells(Target.Row + 1, 1).Select End If End Sub B列のスキップ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("G1") <> "" Then If Target.Column = 2 Then Target.Offset(0, 1).Select End If End If End Sub どなたかご存じの方教えて下さい

  • Excelで入力したセルの隣のセルに累計の表示を

    無理難題を押し付けられて困っています。 画像のように、セルB3に入力し、その累計を隣のセルC3に表示させたいのです。 以下、B4~B6も同じです。 同様のことをD⇔E、F⇔G、H⇔I、J⇔K・・・・でも行いたいのです。 ここの質問欄を検索し、以下のVBAを見つけました Const inpColumn = "C" '入力する列名が『A』列の場合 Private Sub Worksheet_Change(ByVal Target As Excel.Range) With Target '単一セルに入力した場合 If .Count = 1 Then '入力する列名に入力した場合 If .Column = Range(inpColumn & "1").Column Then '入力が数値の場合 If IsNumeric(.Value) Then '隣の列『B列』の値に入力した値を加える '(Offsetの2番目の1が1つ右のB列を示す) .Offset(0, 1) = .Offset(0, 1) + .Value End If End If End If End With End Sub これを実行したところ、B⇔Cだけが実行され、他の列では駄目でした。 VBAに無知なもので、どこを直せばよいのか全く分かりません。 また、他の方法があるのかも分かりません。 説明不足かも知れませんが、よろしくお願いいたします。

  • 再質問:エクセルであるセルに数字を入力すると他のセルのデーターから文字が入力 

    すいません、nish6さんの回答で解決し締め切った後で、また分からなくなりもう一度質問しました。分からないところは最初と少し例が増えています。 例 sheet1   A B C  1 1   A1→A1を入力するとsheet2に入力されている        データーC列から、該当する番号を判断  ↑     して、ああとセル内に表示する   1を入力するとsheet2に入力されているデーターA列   から、該当する番号を判断して、東京とセル内に   表示する sheet2   A B  C D 1 1 東京 A1 ああ 2 2 千葉 A2 いい 3 3 埼玉 A3 うう 行はまだ下に続く 最初のnish6さんの回答をこの下に貼り付けましたが 分からないのは、sheet1にC列が増えたときマクロをどう変えればいいか分からないことです ご教授をお願いします ここから ↓ Private Sub Worksheet_Change(ByVal Target As Excel.Range)   Dim rg As Range 'セル   Dim rgfnd As Range '見つけたセル   On Error GoTo ErrorHandler   Application.EnableEvents = False   For Each rg In Target     'Sheet1のA列なら     If rg.Column = 1 Then       'Sheet2を検索       Set rgfnd = Worksheets("Sheet2").Range("A:A").Find(rg.Text)       If Not rgfnd Is Nothing Then         '見つかったら書き換える         rg = rgfnd.Offset(0, 1).Text         Set rgfnd = Nothing       Else         rg = rg.Text & ":nothing"       End If     End If   Next   Application.EnableEvents = True   Exit Sub ErrorHandler:   'エラー対応   Application.EnableEvents = True End Sub

  • セルに文字を入力したら今日の日付が

    いつもお世話になります。 Windows XP EXCELL2003 下記のようなマクロを設定しています。 この場合は C2(顧客ID 例:001) に文字が入力されると B2 に今日の日付が入ります。 この場合、 2行目の1行しか適用できません。 C3 B3に C4 B4に C5 B5に という具合に最終行に適用してゆくにはマクロをどうすればいいかご指導いただけませんか。 宜しく御願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$2" Then Target.Offset(0, -1).Value = Date End If End Sub

  • エクセル:セルの検索

    Sheet1のC~G列を検索し、 [AAA]が見つかれば「成功」、見つからなければ「失敗」と表示するコードを作りました。 (実際のコードでは、AAAが見つかったセルBBBの.Addressや.Valueを使いたいので「Set BBB」などという書き方をしています)   Dim AAA As String Dim BBB As Range Set BBB = Worksheets("Sheet1").Range("C:G").CurrentRegion.Find(What:=AAA, LookAt:=xlWhole) If BBB Is Nothing Then MsgBox "検索に失敗" Else MsgBox "検索に成功" End If このコードで、C~D列にAAAがある場合は見つかるのですが、 E~G列にAAAがある場合は見つからず「検索に失敗」とメッセージが出ます。 また、 別のシートでも全く同じコードを使っているのですが、こちらは正常に動作します。 上に挙げたコードと違うところは検索範囲がE~I列だというだけです。 上記コードでとあるシートにおいてのみE~G列にある値が検索に引っかからない理由として、 どのようなことが考えられるでしょうか。 保護はかかっていません。 値が微妙に違うということもありません。 大文字小文字、半角全角の指定はしておりませんが、 C列で検索に引っかかった値をそのままG列に移動しただけで見つからなくなります。 なお、AAAに入れているデータは、 Private Sub Worksheet_Change(ByVal Target As Range) End Sub のTarget.Addressで、「$A$20」のような形で入っています。 Sheet1のC~G列に用意している値も「$A$20」のような形で直接書き込んでいます。

  • エクセルでセルに文字が入力されたらマクロを実行

    前回どなたかが質問されて回答を見せてもらったら私のやりたいことと同じだったので実行してみましたが出来なかったのでもう一度質問をさせてください。 1.実行したのですが、なにも実行されません。 2.実行したらメッセジBOXだけは実行するのですが、後のコマンドが実行されずにエラーになります。 もう一度詳しく教えてください。 マクロ初心者ですよろしくお願いします。 1.【シートモジュールで条件判定し、マクロを起動する】 通常はこちらの方法が使われます。 Private Sub Worksheet_Change(ByVal Target As Range)   '変化のあったセルがA1セルか?   If Target.Address = "$A$1" Then      '条件判定:A1セルの値は 1 か?     If Target.Value = 1 Then       MsgBox "A1セルは条件を満たしました"     End If   End If End Sub 2.【ワークシート上で条件判定し、マクロを起動する】 処理内容にもよっては不向きな場合もありますが、こんな方法も あります。 マクロを Sub ではなく、Function 、、つまり関数にしてしまいます。 Function TestMacro() '<-- Sub を Function に替える   MsgBox "A1セルは条件を満たしました"   TestMacro = "" '戻り値はなし End Function そして、ワークシートの B1 セルに次の式を入力します。()は必須 です。  =IF(A1=1,TestMacro(),"")

  • ExcelでEnterを押したあとの移動先について

    A5:H(仮に)500の表があります。 現在、(例)A6→B6→C…と横方向に入力し、H6を入力したあとEnterの押打でA7にもどり、次行のA7→B7→C…の順に入力しています。 もどる操作はAlt+F11で貼り付けた下記のVBAがやっています。 これまでは、表A5:H500の空行(データが入ってない最下行)をアクティブにしたあと、例の順にデータを入れていくだけだったのですが、形式を変えたため入力箇所が増え、A2とA3を入力してから空行に入力する手順になりました。 希望は、A3を入力してEnterを押打したあと、次に入力するセル=表の最下行のA列のセルに移動していたいのですが、それにはどうのようなVBAがよいのでしょうか。 (以下は、考えるヒントになればと思い書き加えます。) この表はVLOOKUPで使われるデータが入っており、A5以下のA列はひとつだけ"あ"が入り、残りは空欄です。 検索値は都合で"あ"という文字にしました。 1行(1レコード)入力して印刷、また1行入力して印刷、また…の繰りかえしで、たいてい入力済みの最下行のA列が"あ"になっています。 この"あ"が新規で入れる行(データが入ってない最下行)のひとつ前にあることが多いので、A3を入力してEnterを押打したら"あ"の下に移動することを希望しますが、無理なら"あ"に移動したあと手動の矢印キーで↓を押しますので、よいお知恵をよろしくお願いします。 (下記の「H列からA列にもどるVBA」もこのサイト内を検索して見つけてきたものです。) ------‐H列からA列にもどるVBA------‐ Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 9 Then Cells(Target.Row + 1, 1).Select End If End Sub

  • 数字「0」の入力を文字数としてカウント

    入力した文字数が7桁でないとエラーメッセージを表示する処理(下記)を作成しました。 入力した文字の先頭が「0」の場合、または「00」の場合に、「0」「00」を含む文字数をカウントし、 エラーメッセージを表示させ、更に表示書式を”000-0000”(郵便番号)としたい。 ご教示をお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim wCellVal As String With Worksheets("Sheet1") wCellVal = .Cells(Target.Row, Target.Column).Value End With If Target.Address(False, False) = "A1" Then If Len(wCellVal) <> 7 Then '文字数チェック MsgBox "7桁で入力してください。", vbOKOnly + vbExclamation, "入力エラー" Exit Sub End If End If End Sub よろしくお願い致します。

  • エクセルマクロ 特定の文字入力の際の処理(2)

    お世話になります。 以前、下記質問をし、締め切ったのですが、もう一点、教えていただきたい点がありました。 質問 エクセルマクロで、sheet1のE列の6~30行に指定する文字が入力された際、 B列のその同じ行にある文字を取得し、その取得した文字をsheet3のC6から K6まで書き出していきたいのですが、どのようにしたらよいでしょうか? ご回答 Private Sub Worksheet_Change(ByVal Target As Range)   Dim i As Long   Dim r As Range   Const 指定文字 As String = "X"   Set r = Range("E6:E30")   If Target.Count > 1 Then Exit Sub   If Intersect(r, Target) Is Nothing Then     Exit Sub   End If   If Target.Value <> 指定文字 Then     Exit Sub   Else     '大文字小文字を区別する場合     i = ActiveSheet.Evaluate( _       "SumProduct(EXACT(" & r.Address & ",""" & 指定文字 & """)*1)")     '大文字小文字を区別しない場合     i = WorksheetFunction.CountIf(r, 指定文字)          Application.EnableEvents = False     Worksheets("Sheet3").Cells(6, i + 2) = _       Target.Offset(, -3)     Application.EnableEvents = True   End If End Sub このご回答を、 取得した文字をsheet3のC6からK6までに4列毎に書き出して いく場合にはコードをどのようにしていけば良いのでしょうか。 C6→H6→M6→・・・ すみません、再度お願い致します。

  • エクセルで入力した文字を別シートで検索して・・・

    エクセル初心者です。既にご質問、ご回答がありましたらすみませんがご教授願います。 シート1のA1に入力した文字を シート2の1行目から検索 検索された文字の同列の2行目の数値を シート1のB1に表示させるにはどのようにしたらよろしいでしょうか? また、シート1のA1に入力した文字を シート2のA列から検索 検索された文字の同行のB列の数値を シート1のB1に表示させる場合はどのようにしたらよろしいでしょうか? 説明がヘタでわかりづらいかもしれませんが、2通りのご教授を宜しくお願い致します。