[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで検索をだすには』(初心者)
「編集」→「検索」で現れる「検索と置換」が「マクロの記録」では 記録できないのでですが、「検索と置換」をマクロで表示させる方法は あるでしょうか。宜しくお願いします。XP、2003です。
たしか Application.Dialogs(xlDialogFormulaFind).Show で、出たと思います。
(HANA)
正確には、xlDialogFormulaFindで表示されるダイアログと編集---検索で表示される ダイアログとは、ちょっと違いますね!!
Sub test() Const find_replace = 1849 Application.CommandBars.FindControl(ID:=find_replace).Execute End Sub
どっちにしてもVBAから使うオブジェクトとしては、出来がよくないですね!! (お金出しているので、MS社には、言いたいことは、機会あるごとに言います) 機能が閉じてしまっているので、VBAから利用しようすると、 用途が狭まってしまいます。
本来は、検索する条件、置換する条件だけを取得する機能にすべきだと思いますけどねえ 実際の検索や置換は、FindやReplaceでできますので・・・。
これでやりたいことができるのなら、よいですが、 このダイアログをユーザーフォームで作ってしまうのも良いかもしれませんよ!!
ichinose
本当ですね!!
しかも、2007だと微妙に英語のまま出て来ます。
2002 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 検索 ?× −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 検索する文字列(N) [ ] [次を検索(F)] [ 閉じる ] □大文字と小文字を区別する(C) [ 置換(R) ] 検索方向(S)[行 ▼] □完全に同一なセルだけを検索する(O) 対象(L) [数式 ▼] □半角と全角を区別する(B) −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
2007 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 検索 ?× −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Find what: [ ] [ Find Next ] [ Close ] □Match case [ 置換(R) ] Search: [行 ▼] □完全に同一なセルだけを検索する(O) Look in: [数式 ▼] □Match byte −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
忘れられてるのかな。。。
(HANA)
(初心者)です。外出しておりました。お礼の返事が遅くなりすみません。 HANAさん。ichinoseさん。ありがとうございました。 ichinoseさんの構文で、セル内の文字列の途中の文字も検索できました。 希望通りです。
関連で追加の質問で出来ました。宜しければ教えて下さい。 検索の列ですがG列〜N列にしたいのですどうすればいいでしょうか。 それともうひとつあるのですが たとえばBOXへ「東京」という文字を入れ、検索し、いったん終了します。 再度マクロを起動するとさきほど検索した「東京」がBOXの中に残っていますが これをクリアして新規で検索用BOXを開くにはどうすればいいでしょうか (初心者)
Sub test1() Const find_replace = 1849 Application.FindFormat.Clear With Range("g:n") .Select .Find What:="", LookIn:=xlValues, LookAt:=xlWhole _ , SearchOrder:=xlColumns, MatchByte:=False End With Application.CommandBars.FindControl(ID:=find_replace).Execute End Sub
ichinose
ichinoseさん。ありがとうございます。希望通りです。 いろんな場面で使わせて頂きます。(初心者)
また質問させて頂きます。 記述して頂いた構文でマクロを実行するとオプションの セル内容が完全に同一であるものを検索する(O)にレ点がついて くるのですが、レ点を外してBOXを表示するにはどうすればいいで しょうか。(初心者)
これは、ご自分でHelpを調べて解決してください。 >Application.FindFormat.Clear これで「検索と置換」ダイアログの書式条件をクリアしています。 > .Find What:="", LookIn:=xlValues, LookAt:=xlWhole _ , SearchOrder:=xlColumns, MatchByte:=False
これで書式以外の条件の初期設定を行っています。
Findメソッドを調べれば、解決するはずです。
ichinose
ichinoseさん。有難うございます。FIND 調べてみます。 理解できたら、掲載させて頂きます。 (初心者)1/26 07:25
初心者です。 あれからいろいろ見てみたのですが、私には見つけられませんでした。 そこで 今回教えて頂いた内容や「全文検索」で探してみてたものに少し手を 加え、検索したい文字を含むセルをを選択し選択中は文字を赤く表示 するものにしました。 しましたといっても自分で考えたのは検索文字の前後に*をつけて検索する ように変更しただけですけれど。 そこでまた教えて頂きたいことが出てきました。 たとえば、対象のセルが3つあったとします。3回選択し、次は「もうありません」 と表示したいのですが、現状ではまた最初のセルを選択して繰り返しとなります。 対象の範囲を検索し終えたら「もうありません」と表示させるにはどうすればいいで しょうか。宜しければ教えてください。 以下が現状の構文です Sub 検索3の1() ' Dim C As Range Dim MOJI As String Dim MOJI1 As String Dim RESPONSE As VbMsgBoxResult With Worksheets("TOP").Range("g:n")
MOJI = InputBox("検索する文字入力して下さい。" & Chr(13) & Chr(10) & "その文字を含んだセルが検索されます。") 'MOJI=入力した文字 If MOJI <> "" Then MOJI1 = "*" & MOJI & "*" Set C = .Cells.Find(MOJI1, , xlValues, xlWhole, xlByRows, xlNext, True) If Not C Is Nothing Then C.Font.ColorIndex = 3 C.Select 'ここ RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行") Do While RESPONSE = vbYes C.Font.ColorIndex = xlAutomatic Set C = .Cells.FindNext(C) C.Font.ColorIndex = 3 ' 3=赤 C.Select 'ここ RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行") Loop MsgBox ("検索を終了しました") C.Font.ColorIndex = xlAutomatic Else MsgBox MOJI & "は、ありません。。" End If End If End With End Sub
>あれからいろいろ見てみたのですが、私には見つけられませんでした。 これは、 >セル内容が完全に同一であるものを検索する(O)にレ点がついて >くるのですが、レ点を外してBOXを表示するにはどうすればいい これに関してですか? 投稿されたような・・、 こんなコードが書けるようになったのに? ですか?
VBAをやるなら、VBAのHelpが参照できるように環境を整えていかないと VBAの学ぶのは大変ですよ!! Helpは、VBAをやる上では必須アイテムですよ!!
sub help() Application.Help end sub
上記のhelpを実行して表示されるMicrosoftExcelのヘルプの項目群にある プログラミング情報という項目がVBAのHelpです。 これが表示されないなら、インストールする必要があります。 ここから、Findメソッドを調べれば、 Sub test1() Const find_replace = 1849 Application.FindFormat.Clear With Range("g:n") .Select .Find What:="", LookIn:=xlValues, LookAt:=xlPart _ , SearchOrder:=xlColumns, MatchByte:=False End With Application.CommandBars.FindControl(ID:=find_replace).Execute End Sub (これでチェックマークは消えます xlWhole --->xlPart)
自分でHelpで確認する癖はつけてください。
ただ、これがわからなかったから、別のアプローチから、すぐ上のコードまで たどり着いたなら、結果的によかったのだと思いますよ!!
これに関しては、次投稿にて。
ichinose
>Sub 検索3の1() ' >Dim C As Range >Dim lrng As Range Dim MOJI As Variant 'Inputboxの戻り値は、Variant型で受ける >Dim MOJI1 As String >Dim RESPONSE As VbMsgBoxResult >With ActiveSheet.Range("g:n") >MOJI = InputBox("検索する文字入力して下さい。" & Chr(13) & Chr(10) & "その文字を含んだセルが検索されます。") 'MOJI=入力した文字 >If TypeName(MOJI) <> "Boolean" Then > MOJI1 = "*" & MOJI & "*" > Set C = .Cells.Find(MOJI1, , xlValues, xlWhole, xlByRows, xlNext, True) > If Not C Is Nothing Then > C.Font.ColorIndex = 3 > C.Select 'ここ Set lrng = C '最初に見つかったセルを別の変数に保存 > RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行") > Do While RESPONSE = vbYes > C.Font.ColorIndex = xlAutomatic > Set C = .Cells.FindNext(C) If C Is Nothing Then Exit Do 'CがNothingになる事例もあるので入れておきます If C.Address = lrng.Address Then Exit Do '最初に見つかったセルと同じなら、検索終了 > C.Font.ColorIndex = 3 ' 3=赤 > C.Select 'ここ > RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行") > Loop > MsgBox ("検索を終了しました") > C.Font.ColorIndex = xlAutomatic > Else > MsgBox MOJI & "は、ありません。。" > End If > End If >End With >End Sub
このように修正して下さい。
このスレッドの最初の方で >どっちにしてもVBAから使うオブジェクトとしては、出来がよくないですね!! と申し上げましたが、Excelが用意している検索専用のダイアログでは、このような 独自の検索仕様に簡単にできませんよね!!
初心者さんが提示されたコードで使われている inputboxメソッド、これは、 ユーザーの文字列入力用のダイアログ ボックスを表示し、入力された文字列を返す 関数ですよね? 機能がユーザーが入力した文字列を受け取るだけのダイアログなので 色んなプログラムで使うことができますよね!!
このように色んな仕様に使えるようなプログラムを沢山作っておけば、 プログラムの作成が簡単になると思いませんか?
こういう考え方から私は、このFindメソッドに関する処理も 色んな仕様に使えるようなプログラム として、作ってあります。
標準モジュールに 既に作成してあるFindメソッドに関するプログラム
Function get_findcell(Optional ByVal f_v As Variant = "", _ Optional ByVal rng As Range = Nothing, _ Optional ByVal strng As Range = Nothing, _ Optional ByVal alookin As XlFindLookIn = -4163, _ Optional ByVal alookat As XlLookAt = 1, _ Optional ByVal aso As XlSearchOrder = 1, _ Optional ByVal asd As XlSearchDirection = 1, _ Optional ByVal mc As Boolean = False, _ Optional ByVal mb As Boolean = True) As Range '指定された値でセル範囲を検索し、該当するセルを取得する 'input : f_v 検索する値 ' rng 検索する範囲 ' strng 検索開始するセル(実際には、このセルの次から検索する) ' alookin 検索対象 xlvalues,xlformulas,xlcomments ' alookat: :検索方法 1-完全一致 2-部分一致 ' aso : 検索順序 1 行 2 列 ' asd : 検索方向 1 Xlnext 2 XlPrevious ' mc : 大文字・小文字の区別 False しない True する ' mb : 半角と全角を区別 True する False しない 'output:get_findcell 見つかったセル(見つからなかったときはNothingが返る) Static 検索範囲 As Range Static 最初に見つかったセル As Range Static 直前に見つかったセル As Range Static 検索方向 As XlSearchDirection Dim app As Object If Not rng Is Nothing Then If Val(Application.Version) > 9 Then Set app = Application app.FindFormat.Clear Set app = Nothing End If Set 検索範囲 = rng If strng Is Nothing Then If asd = 1 Then Set strng = 検索範囲.Cells(検索範囲.Rows.Count, 検索範囲.Columns.Count) Else Set strng = 検索範囲.Cells(1, 1) End If
End If 検索範囲.Parent.Columns(1).Find "" End If If f_v <> "" Then
Set get_findcell = 検索範囲.Find(f_v, strng, alookin, alookat, aso, asd, mc, mb) If Not get_findcell Is Nothing Then Set 最初に見つかったセル = get_findcell Set 直前に見つかったセル = get_findcell 検索方向 = asd End If Else If 検索方向 = xlNext Then Set get_findcell = 検索範囲.FindNext(直前に見つかったセル) Else Set get_findcell = 検索範囲.FindPrevious(直前に見つかったセル) End If If Not get_findcell Is Nothing Then If get_findcell.Address = 最初に見つかったセル.Address Then Set get_findcell = Nothing Else Set 直前に見つかったセル = get_findcell End If End If End If End Function
別の標準モジュールに
'==================================================================== Sub 検索3の2() ' Dim C As Range Dim MOJI As Variant Dim MOJI1 As String Dim RESPONSE As VbMsgBoxResult With ActiveSheet.Range("g:n") MOJI = InputBox("検索する文字入力して下さい。" & Chr(13) & Chr(10) & "その文字を含んだセルが検索されます。") If TypeName(MOJI) <> "Boolean" Then MOJI1 = "*" & MOJI & "*" Set C = get_findcell(MOJI1, .Cells) Do While Not C Is Nothing C.Font.ColorIndex = 3 C.Select 'ここ RESPONSE = MsgBox("次を検索しますか?", vbYesNo + vbQuestion, "検索続行") C.Font.ColorIndex = xlAutomatic If RESPONSE = vbNo Then Exit Do Set C = get_findcell Loop MsgBox ("検索を終了しました") End If End With End Sub これでおおよそ同じ仕様で動作します。 色んな仕様に使えるプログラムは、コードは、長くなりますが、 自分の使いやすい仕様に作れるので便利ですよ!!
試してみてください。
ichinose
ichinoseさん。再度のご支援ありがとうございます。 丁寧な説明、感激しています。
>こんなコードが書けるようになったのに? ですか? わたしが考えて作った(書いた)構文ではなく、「全文検索」で検索 して、それに見よう見まねでほんの少し足しただけです。
>VBAをやるなら、VBAのHelpが参照できるように環境を整えていかないと >VBAの学ぶのは大変ですよ!! Helpは、VBAをやる上では必須アイテムですよ!! sub help() Application.Help end sub これで「EXCEL2003の 新しい機能」というのが開きます。 ・リスト機能 ・統計関数の改善 ・XML サポート ・スマート ドキュメント ・ドキュメント ワークスペース ・Information Rights Management ・ブックを並べて比較する ・その他の新機能
のメニューが開きます。
このことでしょうか 時間(日にち)をかけて確認してみます。
作って頂いたSub 検索3の2() 完璧に希望通り動きます。
>このように色んな仕様に使えるようなプログラムを沢山作っておけば、 >プログラムの作成が簡単になると思いませんか?
>こういう考え方から私は、このFindメソッドに関する処理も 色んな仕様に使えるよ >プログラム として、作ってあります
この2つ文章は基本の技術と考え方が身についていない私にとっては「なるほど」と 強く思いました。とりとめがない言葉ですみません。 理解度の進捗はいつになるかわかりませんが報告させて頂きます。 (初心者)1/30 23:45
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.