許せない心理テスト

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

A 回答 (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
    • good
    • 10

再度の登場、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メソッドはとても便利なメソッドですから
暇なときにでもヘルプなど眺めしっかり学習しませう。
 
    • good
    • 5

マクロの記録モードにして、編集ー検索の操作をして、Aを検索し見つかってもさらに数度、次を検索、を続けてマクロの記録を編集で見てください。

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

質問者にはまだ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メソッドはゆっくりじっくり勉強してください。
 
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/02/03 17:55

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

補足日時:2008/02/03 17:02
    • good
    • 4

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A