- ベストアンサー
VBA 検索列がエクセル側で選択されない状態で検索
Columns("B:B").Select Const find_replace = 1849 Application.FindFormat.Clear Application.CommandBars.FindControl(ID:=find_replace).Execute B列を選択し検索ダイアログを表示させています。 このコードだと、Excel上でB列が選択され、パッと見、どこを選択しているかモロばれで、みっともないのですが、 エクセル上でそれが見えないよう、VBAを変更することはできるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
CommandBars を使う限り無理ですね。 検索文字は、InputBoxかユーザーフォームを使うようにします。 検索をしたいのか、痴漢をしたいのか判らないので、両方載せます。 選択をしたくないという事なので、検索は表示だけにします。 ユーザーフォームは面倒なのでInputBoxです。 Option Explicit ' Sub Macro1() Dim What As String Dim Find As Range Dim StartAddress As String Dim AddressEs As String ' What = InputBox("検索ワード", "全件検索") On Error GoTo 0 Set Find = [B:B].Find(What) ' If Find Is Nothing Then MsgBox "見つかりません", vbCritical End End If Find.Select StartAddress = Find.Address ' Do AddressEs = AddressEs & "," & Find.Address(False, False) Set Find = [B:B].FindNext(Find) Loop Until Find.Address = StartAddress MsgBox Mid(AddressEs, 2) End Sub ' Sub Macro2() Dim What As Variant ' What = InputBox("検索ワード, 置換ワード", ", 区切りで入力して下さい", ",") What = Split(What, ",") [B:B].Replace What(0), What(1) End Sub
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
セルの値を検索するのに、難しい、珍しい方式で検索している(Application.CommandBars.FindControlを使っている) が、そういう方式以外の方法ではだめなのか。 ーー Range.Replaceを使う方式です。その場合 Columns("B:B").Selectのように選択しないで、 Sub test03() Range("B:B").Replace What:="gg", Replacement:="XXX" End Sub のようにすれば、どうか?これも意図に合わないか? ーー CommandBars.FindControlを使う方式は、検索該当結果が個別に表的に表示されるのが 気に入っているのかな。
補足
このマクロを作成した理由は、「どの文字を検索するかは毎回変わる」ということ、更に「検索して、B列内にデータが存在するかどうかだけを知りたいだけ」という理由です。 .Replace What:="gg", Replacement:="XXX" ↑は、検索文字「gg」置き換え文字「XXX」固定です。 ただ、検索文字は「gg」とは限らず、次は別の文字を検索したいかもしれない。 そして、XXXなどに置き換えはしないということです。 その為に、毎回ダイアログを出すコードを作成しています。 B列を選択しないまま、検索ダイアログを出して検索させる…ことは出来ないのかな?と思いました。
お礼
ありがとうございました。 2通りの方法を書いていただき感謝します。 おかげさまで、うまくできました。