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

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

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

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があった時、、、、 とコードが書けないです。 大変困っているので、ご教授頂けないでしょうか? 出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか? 宜しくお願い致します。

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

  • ベストアンサー
  • 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/17068)
回答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

  • マクロ:セルの範囲指定

    エクセルマクロで困っています。 セルの範囲指定をしようとしています。 初心者過ぎて、よくわかりません。 現在のマクロ↓ Sub 済() If ActiveCell.Column = 21 Then Selection.FormatConditions.Delete '条件付き書式削除 With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With ActiveCell.Offset(0, 1).Select With Selection.Interior .ColorIndex = 16 .Pattern = xlSolid End With '色変え判定セル書き換え ActiveCell.Offset(0, 5).Select ActiveCell.FormulaR1C1 = "77" ActiveCell.Offset(0, -5).Select Else answer = MsgBox("U列を選択して下さい", vbCritical) End If End Sub やりたい事は、下記の通りです。 列Uがアクティブの時にU~ACの行を塗りつぶし。 列は変動します。 今は、やり方がよく分からなかったため オフセットで一つ一つ塗りつぶしてます。 マクロを組みすぎてファイルが重くなって困っています。 回答よろしくお願いいたします。

  • 文字列を検索しその列をコピーする(VBA)

    よろしくお願いします。 OS:WINDOWS 2000 PRO 環境:OFFICE 2003 エクセルのVBAについての質問です。 A列には数値コードが入っています。 そのコードは"1"と"2"に分類されてます。 マスターはSHEET1で、このマスターから コード1はSHEET2に、 コード2はSHEET3に 振り分けたいのですが、どうもうまくいきません・・・ A列にはコード"1" "2"以外に空白セルが存在します。 空白セルは無視したい。。。 それとこのデータはDBから抽出するのですが、 抽出したデータは規則性はありません。 抽出するごとに"1"と"2"と"空白"はランダムなので、 LOOP等のマクロを調べてやってみたのですが、出来なくて週末になってしまいました。 A列からコード1とコード2を検索して、 ヒットしたコードの行ごと各SHEETにコピーして、 なおかつ各シートA列の入力されていない一番下の セルにコピーしたいのですが、検索でヒットした 上から順番に。。。 これをLOOPと組合わせれば、各シートにコピーするのは 問題ないような気がします。。。 Sub AAA_BBB() .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0) End With End Sub LOOP等で上記の条件を満たせる方法はないでしょうか。 ご教示を、よろしくお願いします。

  • 行方向の同じ値のセルを結合するマクロ

    ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub

  • vbaリストと同じ値があったら、隣のセルに値を反映

    エクセル マクロ(vba)の質問です。 a列に検索リストがあり、b列に検索対象があります。 このとき、a列の検索リストと合致した文字のみをb列から取り出し、c列に反映させたいです。 以下のコードを走らせましたが、何も起こらず、どこを修正すればいいのか困っています。 お手数ですが、ご教示いただけますと幸いですm(_ _)m dim i as long for i = 1 to cells(rows.count,1).end(xlup).row if Instr(cells(i,2),cells(i,1)) then cells(i,3) = cells(i,1) i = i + 1 end if next

  • Excel VBAでクリックひとつでグラフの参照を隣の列へと移してグラフの変化を確認したいのですが

    縦にデータが70列ほど並んだエクセルシートに関して,そのうち1列目と2列目を参照したグラフを書いています. Excel VBAでマクロをつくり,クリックひとつで2列目の参照が3列目へ,そしてもう一度クリックすると3列目の参照が4列目へと遷移させてグラフの変化を確認したいのですが,VBA初心者のためやり方がわかりません. クリック1回でグラフの参照を1列ずらすようなマクロの作り方がわからなかったため,今は最後の列の隣(71列目)に2列目をコピーするようにして,グラフの参照は1列目と71列目にしています. しかしこのようにしてもRange内に変数を入れてはいけないせいなのか,エラー(Rangeメソッドは失敗しました:Globalオブジェクト)と表示されて全く動きません. 現在書いているコードは以下のとおりです. Sub change_graph() ' ' change_graph Macro ' マクロ記録日 : 2009/12/15 ユーザー名 : ABC ' ' Dim cCnt As Long Dim myAddress As String ActiveCell.Offset(0, 1).Range("A1:A914").Select myAddress = ActiveCell.Address cCnt = Range("& myAddress:$W$61").Columns.Count Selection.Copy ActiveCell.Offset(0, cCnt - 1).Range("A1").Select ActiveSheet.Paste ActiveCell.Offset(0, -(cCnt - 1)).Range("A1").Activate End Sub よろしければ (1)そもそもグラフの参照を1列ずつ変化させるやり方 (2)上記コードの誤り を教えていただけないでしょうか? よろしくお願いいたします.

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • セルの値からマクロで検索を行うには

    エクセルのシート1枚に700件程の物品の在庫管理をしています。 件数が多いためナンバーで検索を行えるよう、以下のようなマクロを作ってみました。 Sub 検索を行う() Dim 検索セル As Range Set 検索セル = Range("A1:A675").Find(120) If Not 検索セル Is Nothing Then 検索セル.Activate End If End Sub これでA列の「120番」を検索できるのですが、セルに入力した数値を検索するには、どうすればよいのでしょうか?? (例えばセルE1に120と入力して検索) 色々調べてみたのですが、セルの値から検索ができなくて・・・・。 よろしくご教授ください。

  • Excel VBA でテキストボックスの値をセルA列から検索

    いつもお世話になります。 Private Sub CommandButton3_Click() Dim 行 As String Dim 列 As String Dim 最終行 As String Dim 検索行 As String Dim メッセージ As Integer Dim 一致 As Range Dim myNO As Variant Dim i As Long Sheets(3).Select 最終行 = Range("A2").End(xlDown).Offset(1).Select 行 = ActiveCell.Row 列 = ActiveCell.Column myNO = TextBox2.Value 検索行 = Range("A2").End(xlDown).Select ※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole) If 一致 Is Nothing Then MsgBox "データがありません。新規コード入力します。" Cells(行, 列 + 0) = UserForm1.TextBox2.Value Cells(行, 列 + 1) = UserForm1.ComboBox7.Value Else i = Cells(行 - 1, "A") Cells(i, 列 + 0) = UserForm1.TextBox2.Value Cells(i, 列 + 1) = UserForm1.ComboBox7.Value End If End Sub 「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。 ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

  • VBAマクロで結合セルを含む列に列挿入する方法?

    お世話になっています。 下記のエクセルVBAマクロで、 列挿入処理をしているのですが、 列に結合セル(行方向)がある場合にだけ、 列選択がうまくできず、 目的と異なる処理をしてしまいます。 ActiveCell.Offset(0, 1).Columns("A:A").EntireColumn.Select Selection.Insert Shift:=xlToRight 新しいマクロの記録で やってみたのですが、 上記マクロが生成されただけでした。 手作業では 列の上のアルファベットを選択して、 列挿入できるので、 何かいい方法があるのは? と思います。 どなたかよろしくお願いします。

  • B列の値を参照して、A列に連番を振る方法

    A・B・C列があり、A列には連番を、B列にはVLOOKUP関数が入っており、 C列には、B列の検索値が入っております。 B列は下記のVBAコードで同じ値をセル結合させています。 Sub 結合() Dim rngU As Range Dim i As Range Dim rngB As Range Dim Key As String Set rngB = Range("B2") Set rngU = Range(Range("B3") _ , Range("B6000").End(xlUp).Offset(1)) Application.DisplayAlerts = False For Each i In rngU If Not i.Text = Key Then If (Not i.Offset(-1) Is rngB) And _ (Not i Is rngB) Then Range(rngB, i.Offset(-1)).MergeCells = True End If Set rngB = i End If Key = i.Text Next i Application.DisplayAlerts = True End Sub そこで、A:3から連番を振りたいのですが、B列の決まった特定の結合セルの 隣のA列のセルもB列の決まった特定の結合セルと同数にセル結合させ、 連番を1つとしてカウントしたいのです。 また、A列にはB列同様にVLOOKUP関数が入っており、連番を振りたくないセルには 印が付くようにしています。 行数やB列の決まった特定の結合セル番地はランダムに変わるため、B列の結合セルで参照させるしか ないのかなっと思っております。 B列の特定の結合セルの値は決まっております。 上記のような処理を自動にさせるためのVBAが分かる方がいらっしゃいましたら、 是非ご教授お願いいたします。

専門家に質問してみよう