- ベストアンサー
[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ
- VBA初心者のため、指定列からAを検索して隣のセルに値0を入力するマクロを組みたい
- 例えば、列Lにランダムな文字が入っていて、Aを検索し、発見したら隣の列Iに0を入力する
- 過去の質問で考えたコードに基づいて、Aがあった場合に隣のセルに0を入力する処理を追加する
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 #3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。 いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。 その中の代表格が、この「Find」 です。 >Set A = Worksheets("Sheet1").Cells.Find("A") >過去の質問で考えてみたのです どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。 だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。 それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。 例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。 #3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。 '-------------------------------------- '記録マクロをそのまま使う方法 Sub TestFind1() Dim c As Range Set c = Columns("L:L").Find(What:="A", _ After:=ActiveCell, _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ MatchByte:=False, _ SearchFormat:=False) c.Offset(0, 1).Value = 0 End Sub '-------------------------------------- 'TestFind1 をアレンジしてみる Sub TestFind2() Dim c As Range '検索語 Const MYTXT As String = "A" Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _ LookIn:=xlValues, _ LookAt:=xlPart, _ MatchCase:=False) If Not c Is Nothing Then c.Offset(0, 1).Value = 0 End If End Sub '--------------------------------------- '複数ある場合(パターンを使った方法) '--------------------------------------- Sub TestFind3() Dim c As Range Dim FirstAdd As String Const MYTXT As String = "A" Set c = ActiveSheet.Columns("L:L").Find( _ What:=MYTXT, _ LookIn:=xlValues, _ LookAt:=xlPart, _ MatchCase:=False) If Not c Is Nothing Then FirstAdd = c.Address Do c.Offset(, 1).Value = 0 Set c = ActiveSheet.Columns("L:L").FindNext(c) If c.Address = FirstAdd Then Exit Sub Loop Until c Is Nothing End If End Sub
その他の回答 (4)
- onlyrom
- ベストアンサー率59% (228/384)
再度の登場、onlyromです。 >For R = 1 To Cells(Rows.Count, "L").End(xlUp).Row >の部分はどのような処理をしているのでしょうか? Cells(Rows.Count, "L").End(xlUp).Rowのことですね? これで、L列の最終行(データのある最終行)を求めています。 例えば、L列データが1行目~555行目まで入力されていたら For R = 1 To 555 でもいいのですが、いつも555行目までデータが入力されているとは限らないはずですから、 For R = 1 to 555 と最終行を決めうちすると最終行が変更になる度に For R = 1 to 100 とか For R = 1 to 200 などと最終行を変更しなければいけません。 で最終行に変更があってもコードを変更しなくていいように Cells(Rows.Count, "L").End(xlUp).Row これで自動的にL列の最終行を求めているわけです。 最終行を求めるときはこうするんだと丸暗記してください。 それから先の回答でも言いましたがFindメソッドはとても便利なメソッドですから 暇なときにでもヘルプなど眺めしっかり学習しませう。
- imogasi
- ベストアンサー率27% (4737/17069)
マクロの記録モードにして、編集ー検索の操作をして、Aを検索し見つかってもさらに数度、次を検索、を続けてマクロの記録を編集で見てください。全てはそれからです。、 >そのままマクロに出来るコードを教えて頂けないでしょうか 丸投げといい、回答者を下請けと看做す態度で、規約上しないことになってます。 問題は検索を終わりにする判定です。検索操作ではまた最初に戻って検索を続けるので、最初に戻ったこと、そこを条件にします。 この検索はFind,FindNextの2つを使う必要があり、終わり条件を組み込むのが難しく初心者が手を出す課題ではない。 ただ「VBA Find FindNext」でWEB照会すれば沢山実例が出てくる・それらを読みもしないで・・。 http://www.moug.net/tech/exvba/0050116.htm など多数
- onlyrom
- ベストアンサー率59% (228/384)
質問者にはまだFindメソッドは難しいでしょうから、 次のようにオーソドックスな方法がいいでしょう。 L列に「A」があった場合、隣(M列)に「0」をセットする場合 '---------------------------------------------------- Sub Test() Dim R As Long Range("M:M").ClearContents For R = 1 To Cells(Rows.Count, "L").End(xlUp).Row If Cells(R, "L").Value = "A" Then Cells(R, "M").Value = 0 End If Next R End Sub '--------------------------------------------------------- それから、「A」という文字を含む 例えば、「A00」とか「xxA」とかの場合も該当にする場合は If Cells(R, "L").Value Like "*A*" Then とLikeを使います。 またFindメソッドはゆっくりじっくり勉強してください。
- n-jun
- ベストアンサー率33% (959/2873)
>Dim A As String 変数Aは文字列型 >Set A = Worksheets("Sheet1").Cells.Find("A") 検索範囲はシート1の全てのセル、且つ変数Aにセットされるのは Rang型 >If A Is Nothing Then 変数Aが”Nothing:見つからなかった場合に”と言う事。
補足
n-jun様、アドバイスありがとうございます。 初心者の為、こんな質問をして申し訳ないのですが。 「Aが見つかったら」と書くにはどのようにすれば宜しいでしょうか? 尚、変数宣言をするときに、String型ではなくRang型で宣言すれば宜しいのでしょうか? ご教授お願い致します! >Dim A As String 変数Aは文字列型 >Set A = Worksheets("Sheet1").Cells.Find("A") 検索範囲はシート1の全てのセル、且つ変数Aにセットされるのは Rang型 >If A Is Nothing Then 変数Aが”Nothing:見つからなかった場合に”と言う事。
お礼
onlyrom様 ご回答ありがとうございます。 今、試してみたら出来ました! 本当にありがとうございます!! M列には他の値も入っていたので、Range("M:M").ClearContents は消させて頂きました。 ちなみに、 For R = 1 To Cells(Rows.Count, "L").End(xlUp).Row の部分はどのような処理をしているのでしょうか?