- ベストアンサー
VBA/FIND関数を使っての先頭文字列の検索方法
エクセルVBAにてFIND関数を使って、 文字列検索⇒コピー&ペーストのマクロを作成しているのですが、 どうしても、先頭文字列から検索をする方法がわかりません。 たとえば、 あいうえお いうえおあ おあいうえ えおあいう という文字列から「あいう*」を検索したい場合、 1行目だけを抽出したいのですが、 1,3,4行目が抽出されてしまいます。 find関数では先頭文字からの検索はできないのでしょうか? もし、不可能な場合、先頭文字からの検索を行うにはどのように行えばよいでしょうか? アドバイス、よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 ちょっと申し訳ありません。忘れていたことがありました。以前に同じような件で回答していたのに・・・。 「Excelが壊れている・・」なんて撤回してお詫びします。 findの検索条件は、以前に検索した条件をひきつぐのです。だから、#5さんの言うように引数を省略すると以前の検索条件が使われるので、結果が変わってきます。 私のコードは、 Find("あいう*", lookat:=xlWhole) で検索した後なので、Find("あいう*")で検索できるのです。あなたができないというのは、以前に、 lookat:=xlPart で検索されたのが残っているからでしょう。 なおこれは、、VBAでなくてもシートの検索で「検索と置換」のダイアログで設定したものも反映します。 findのヘルプです。 引数 LookIn、LookAt、SearchOrder、および MatchByte の設定は、このメソッドが使われるたびに保存されます。次にこのメソッドを使うときに、これらの引数の指定を省略すると、保存された設定が使われます。これらの引数の設定を変更すると、[検索と置換] ダイアログ ボックスに表示される設定が変わります。また、[検索と置換] ダイアログ ボックスで設定を変更すると、保存されている設定が変わります。このような設定の変更によって生じる問題を避けるためには、Find メソッドを使うたびに、これらの引数を明示的に指定します。
その他の回答 (5)
- n-jun
- ベストアンサー率33% (959/2873)
#2です。 http://www.happy2-island.com/excelsmile/smile03/capter01518.shtml ワイルドカードを使って検索するプログラムの作成例 にある、 「7行目のWhatにはワイルドカード文字を使って「大*」という条件を設定しました。 1文字目が大、それ以降は何でもよいという意味です。 加えて、10行目のLookAtにはxlWholeを設定し、完全一致で検索するようにしました。」 Findメソッドでは引数を省略しすぎると問題が出るのかも?
お礼
ご回答ありがとうございます。 引数を省略せずにもう一度試してみます。
- okormazd
- ベストアンサー率50% (1224/2412)
#3です。 実際に、#3のコードを実行したのでしょうか。 セルを検索しているのではなく、セルの文字列を検索しているから、1文字目からしか検索しないと思うが。 もし、全部検索してしまうなら、そのExcelは壊れているから、あきらめなさい。
- okormazd
- ベストアンサー率50% (1224/2412)
#1です。 Book全体の検索では、#1では時間がかかってダメでしょう。 For i = 1 To ActiveWorkbook.Sheets.Count Set c = ActiveWorkbook.Sheets(i).Cells.Find("あいう*") If Not c Is Nothing Then MsgBox c.Address Next で、どうでしょうね。1文字目からの「あいう・・・」しか検索されないと思うが。
補足
再度、ご回答ありがとうございます。 私も("あいう*")で可能かと思っていたのですが、実際に組んでみると "あいう"の入っているものをすべて検索してしまいます。。
- n-jun
- ベストアンサー率33% (959/2873)
ヒットしたセル値(例えばr.Value)の頭文字をチェックして みたら良いのでは? Ser r = 'Findメソッド文 If Not r Is Nothing And Left(r.Value , 3) ="あいう" Then ' やりたいこと End If とか?
お礼
FIND関数だけでは難しいようであれば、この方法でいけそうですね。 ありがとうございます。
- okormazd
- ベストアンサー率50% (1224/2412)
質問のデータが、[D5:D8]にあるとすれば、 For Each c In [D5:D8] If c.Value Like "あいう*" Then MsgBox c.Address End If Next とかで、いいと思うが。
補足
ご回答ありがとうございます。 質問に不備がありました。 検索範囲はブック全体なのですが、ご回答の方法の場合でも可能なのでしょうか?
お礼
ご回答ありがとうございます。 引数を省略しているための誤動作?だったのかもしれません。 引数を省略せずに再度試してみたいと思います。