[[20110123090332]] 『マクロで検索をだすには』(初心者) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで検索をだすには』(初心者)
 「編集」→「検索」で現れる「検索と置換」が「マクロの記録」では
 記録できないのでですが、「検索と置換」をマクロで表示させる方法は
 あるでしょうか。宜しくお願いします。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.