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

エクセルシートの上部に入力欄と検索ボタン、リセットボタンを設置して、
同じシート内の一覧からヒットする場所に飛ぶようにしたいです。
ctri+Fの検索を常時表示しておくイメージです。
初心者なりにマクロを試行錯誤で試してみましたが、
どうもうまく機能しません。
どなたかご教授いただけませんでしょうか。

希望は以下のとおりです。
・検索ボックスと一覧は同じシート
(ボックスではなくセルに入力でも可)
・部分一致
・検索結果が複数ある場合は次の候補へ飛ぶようにしたい
・データがあるのはC40〜C400のセル

どうぞよろしくお願いいたします。

質問者からの補足コメント

  • コメントありがとうございます。
    パソコンに疎い方も使う資料のため、だれでも検索できるように検索ボックスを設置したいと考えています。
    できなければ検索機能を使うようにします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/08/24 11:17
  • ご丁寧にご教示いただき、ありがとうございます!
    試してみましたが、2行目のSetと3行目のActiveCellについて、
    プロシージャの外では無効とのコンパイルエラーが出てしまい、解決できそうもありませんでした。
    自分でもう少し勉強してみます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2021/08/25 15:47
  • 補足コメントを入れた後に自分でも初歩的なミスだと気付き、無事検索できるようになりました!
    ありがとうございます!

    ただ、複数の該当セルがある場合、
    次のセルを見るためには毎回コマンドボタンを押さなければいけないのですね…。
    行数が膨大なため、都度一番上の行まで戻ってコマンドボタンを押すのが現実的ではありませんでした(><)
    エンターで次の候補へ進むには、やっぱり元々の検索機能を使うしかないのでしょうか。

    たびたび大変恐れ入ります。

    No.5の回答に寄せられた補足コメントです。 補足日時:2021/08/25 18:08

A 回答 (6件)

#5です


>コマンドボタンを押すのが
ショートカットキーを登録するとかもありますよ
簡単な方法、マクロの記録でショートカットキーを決め記録終了、そのプロシージャにコードを書けば良いはず。

通常、VBAで検索するコードを書く場合、その後の処理まで書くのが普通かな?ただ選択するだけでは、わざわざ、、と言う感じですね。

もしすべてを選択するのであれば、FindNextでセルをunionメソッドで合体させSelectすれば良いと思いますが、この辺りはイメージ出来ますでしょうか?(キーワードを上げましたので調べてみてください。)

マクロと言う事で進めて参りましたが、私的にはExcelの機能である検索を使うかな、
>パソコンに疎い方も使う資料のため、だれでも検索できるように検索ボックスを設置したいと考えています。

これを持ち出すときりがないですね。
PCやExcelの使い方を覚えるのと同じで覚えてしまえば簡単です。
むしろ、スキルが上がり他の場面でも使いこなす事が出来れば、万事良しと思いますがどうでしょう。

ちなみに、検索機能ですべてを検索で結果が出る下の表示部分にカーソルを当てCtrl+Aキーで検索されたすべてのセルが選択できます。
なので、入力など(選択を変えない)をしてEnterで次の選択セルに移動できるかと思います。
    • good
    • 0

No4です



>エンターで次の候補へ進むには~~
想像するところ、「通常のエクセルの機能を使いながら、特定のマクロの機能もを行したい」ってことだと思いますけれど、(No4でも触れましたが)お決まりの手順通りではないUIを実現しようとすると結構面倒です。
やりたいことだけを思い付きのように記述すれば済むわけではなく、起こり得るケース全体を想定してそれに対する処理全体を記述しておく必要があるからです。

以下は、「エンターキーで次の検索セルに進む」という内容のマクロです。
最低限なので、あまり実用的ではありませんけれど、ご参考までに・・・
新規の標準モジュールにコピペしてください。
(以下の例でも、「次のセルを選択」する処理は2行で済んでいます。残りの行数は、ほとんどが「最低限のUI」のための処理です)

※ 対象範囲内でだけ、Enterキー入力で次の検索セルへ進みます。
 (範囲外では通常の動作になります)
※ ユーザーにはマクロ実行中か否かがわからないので、実行中はステータスバーに「検索モード」の表示をしています。(注意しないとわからないですけれど…)
お使いのシートで背景色などを用いていなければ、実行中のみ対象範囲に背景色を付けるなどとした方がわかり易くなるでしょう。
※ 「検索モード」(=マクロ実行中)から抜け出すには、ESCキーを押すなどしてください。
※ キーへの反応が敏感すぎるので、感度を落とすためにタイマーで遅延させています。
感度が悪すぎるようなら時間を短くし、良すぎる場合は長くと変更してください。
※ 最初に実行する場合は、「findWord」をそのまま実行します。

Private Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer

Private Sub findWord()
Dim sht As Worksheet, rng As Range, words As String
Dim c As Range, t As Single
Const message1 = "検索ワードは見つかりません"

words = InputBox("検索語句を入力")
If words = "" Then Exit Sub
Set sht = ActiveSheet
Set rng = Range("C40:C400")
Set c = rng.Find(what:=words, after:=Range("C400"), _
LookIn:=xlValues, lookat:=xlPart)

If c Is Nothing Then
MsgBox message1
Else
c.Activate
t = Timer
Application.StatusBar = "***** 検索モード *****"

Do Until GetAsyncKeyState(vbKeyEscape) <> 0
DoEvents

If GetAsyncKeyState(vbKeyReturn) <> 0 Then
If Not ActiveSheet Is sht Then Exit Do
If Not Intersect(ActiveCell, rng) Is Nothing Then
DoEvents

If Timer - t > 0.2 Then
Set c = rng.FindNext(ActiveCell)
If c Is Nothing Then
MsgBox message1
Exit Do
Else
c.Activate
End If
t = Timer
End If

End If
End If
Loop
End If
Application.StatusBar = False
End Sub
    • good
    • 0
この回答へのお礼

ご親切にご教示くださり、ありがとうございます。
教えていただいたマクロで試してみようと思います!
全くの初心者が無謀な挑戦をしてしまいましたが、
非常に勉強になりました。
引き続き基礎の部分から学んでいこうと思います。
本当にありがとうございました。

お礼日時:2021/08/26 13:05

こんにちは


#3の補足コメントについて

#3のコードはプロシージャになっていませんのでコンパイルエラーは
当然かと思います。

Sub test()
ここに#3のコードすべてを入れてください
End Sub
testをボタンなどに登録してボタンを押して実行します。
プロシージャ名testは暫定です。

A1セルに入力されている文字が検索文字になります。
この回答への補足あり
    • good
    • 0

こんにちは



>マクロを試行錯誤で試してみましたが、
>どうもうまく機能しません
何をどう試したのかもわかりませんし、UIをどうしたいのかもわかりませんが、基本的には対象範囲に対してFINDメソッドで、LookAt:=xlPart (=部分一致)で行えばご質問の検索を行うことは可能と思われます。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

先にまとめて全体を検索して変数等に記憶しておく方法もあれば、都度、次のセルを探す方法もあると思われますが、どちらが適しているのかは質問者様がお考えの内容次第でしょう。
目視で確認するだけなら、面倒なUIなどを作成しなくてもすむ方法として、まとめて該当セルに色を付けてしまうなども考えられそうな気がしますけれど・・・
    • good
    • 0
この回答へのお礼

初歩的な質問に対して、コメントありがとうございました!
行数が多いため、該当セルに色をつけるだけではスクロールが大変でして…。もう少し勉強してみます。

お礼日時:2021/08/25 18:12

こんにちは


使い方をどうするかは、お任せ、A1セルの値で検索
例:
Dim Rng As Range, FindCell As Range
Set Rng = Range("C40:C400")
If Intersect(ActiveCell, Rng) Is Nothing Then Range("C400").Activate
Set FindCell = Rng.Find( _
What:=Range("A1").Value, _
After:=ActiveCell, _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=True, _
MatchByte:=False, SearchFormat:=False)
If Not FindCell Is Nothing Then FindCell.Activate

細かい事は考えていません
この回答への補足あり
    • good
    • 1

おはようございます。



回答とは違いますが、
既存の検索機能では、ダメな理由は何でしょうか?
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A