• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。)

[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ

このQ&Aのポイント
  • VBA初心者のため、指定列からAを検索して隣のセルに値0を入力するマクロを組みたい
  • 例えば、列Lにランダムな文字が入っていて、Aを検索し、発見したら隣の列Iに0を入力する
  • 過去の質問で考えたコードに基づいて、Aがあった場合に隣のセルに0を入力する処理を追加する

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 #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)
回答No.5

再度の登場、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)
回答No.3

マクロの記録モードにして、編集ー検索の操作をして、Aを検索し見つかってもさらに数度、次を検索、を続けてマクロの記録を編集で見てください。全てはそれからです。、 >そのままマクロに出来るコードを教えて頂けないでしょうか 丸投げといい、回答者を下請けと看做す態度で、規約上しないことになってます。 問題は検索を終わりにする判定です。検索操作ではまた最初に戻って検索を続けるので、最初に戻ったこと、そこを条件にします。 この検索はFind,FindNextの2つを使う必要があり、終わり条件を組み込むのが難しく初心者が手を出す課題ではない。 ただ「VBA Find FindNext」でWEB照会すれば沢山実例が出てくる・それらを読みもしないで・・。 http://www.moug.net/tech/exvba/0050116.htm など多数

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

質問者にはまだ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メソッドはゆっくりじっくり勉強してください。  

talman
質問者

お礼

onlyrom様 ご回答ありがとうございます。 今、試してみたら出来ました! 本当にありがとうございます!! M列には他の値も入っていたので、Range("M:M").ClearContents は消させて頂きました。 ちなみに、 For R = 1 To Cells(Rows.Count, "L").End(xlUp).Row の部分はどのような処理をしているのでしょうか?

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>Dim A As String 変数Aは文字列型 >Set A = Worksheets("Sheet1").Cells.Find("A") 検索範囲はシート1の全てのセル、且つ変数Aにセットされるのは Rang型 >If A Is Nothing Then 変数Aが”Nothing:見つからなかった場合に”と言う事。

talman
質問者

補足

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:見つからなかった場合に”と言う事。

関連するQ&A