- ベストアンサー
条件処理マクロ
エクセルのマクロについて教えていただけないでしょうか? セル A3以下にデーターが入っています(データーが入っている最終行は変化します) B3以下にもデーターが入っていますが、行によっては空欄にもなる場合があります やりたいこと セルAにデーターがあり、セルBにデーターがない場合はセルAのデーターをセルBにコピー セルAにデーターがあり、セルBにデーターがある場合はコピーせず、次の行を判定 これをAにデーターが入っていないセルが出てくるまで繰り返す 条件分岐と繰り返しマクロの組み合わせ方がよくわりません よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>セルAにデーターがあり、セルBにデーターがない場合はセルAのデーターをセルBにコピー セルAにデーターがあり、セルBにデーターがある場合はコピーせず、次の行を判定 これをAにデーターが入っていないセルが出てくるまで繰り返す このままでは、「繰り返す」、ロジックはジツゲンできない。論理が弱いから、、、 A列にデータがない、コレはセル1つのハナシ、そしてB列からみても、逆のことがいえる。 だから、全ての組合わせ(ケース)を考えべき、結局次のように整理する、、、 Aアリ&Bアリ:何もしない(で次!) Aアリ&Bナシ:AをBへ、そして次! Aナシ&Bアリ:何もしない(で次!) Aナシ&Bナシ:何もしない(で次!) 何のことはない!2タクだ! 1つのケースだけ判定すればオシマイ!!、コレで初めてループできそう、、、 最終行のつかみ方は、イロイロな方法がある。一番良く見かけるのは、列を限界行(仕様上の最大行)から上方向にみて、最初の空白でないセルを最終行、とするやり方、、、 ソコからさらに上には、空白セルがあるかもしれない、という点には注意が必要。 ココで、限界行の表現には、間違ってもリテラルは使わないこと、OFFICEの上位のバージョン(2007とか)では通用しないコードになってしまう。 ツイデなので、「Aナシ&Bナシ」(実は行全体で判定)の行を削除しながら処理すると、こうなる、、、 Option Explicit Sub CorrectB() Const xHeads = 1 'ヘッダ(見出し)の行数 Dim xLast As Long Dim nn As Long xLast = Cells(Rows.Count, "A").End(xlUp).Row For nn = xLast To (xHeads + 1) Step -1 If Application.WorksheetFunction.CountA(Rows(nn)) = 0 Then Rows(nn).Delete Else If Not IsEmpty(Cells(nn, "A").Value) And IsEmpty(Cells(nn, "B").Value) Then Cells(nn, "B").Value = Cells(nn, "A").Value End If End If Next End Sub
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
まず、ご自身で、どうやったらいいのか考えてみたらいかがでしょうか? あえて、私は、コードは書きません。 つまらない回答だなって思うのでしたら、無視して構いません。 文章の内容では、ロジックとして成立しにくいと思います。 文章の内容では、ご希望どおりにはならず、数回で終わって最後までいきません。 まず、フローチャートなどで、組み立て方を学ぶべきだと思います。 文章が、プログラム的にきちんと書けていたら、もう7割はプログラミングはできたと思ってよいと思います。掲示板の中には、マクロを知らないという人でも、きちんとロジックができている人もいます。 >条件分岐と繰り返しマクロの組み合わせ方がよくわりません 組み合わせということではなく、その前の段階です。 分岐は分岐(If構文)で、繰り返し(ループ)はループです。 サンプル・コードは探せば、いくつも出てくるはずです。それは参考にするものはいくつもあります。 --------------------------- >セルAにデーターがあり、セルBにデーターがない場合はセルAのデーターをセルBにコピー エクセルでは、セルBにコピーというのは、二種類あります。 オブジェクト(書式などが含まれている)としてコピーすることか、それとも、値をコピーする(正しくは代入の)ことか、というものです。それはどちらでしょう? 一般的には、VBA自体では、値をコピーすることですが。 ここの意味はよくわからないです。 >セルAにデーターがあり、セルBにデーターがある場合はコピーせず、次の行を判定 コピーしないというのは、何もしないということでは? つまり、Ifの「真」だけでも成立するので、この場合「偽」は必要ないのではないでしょうか? >これをAにデーターが入っていないセルが出てくるまで繰り返す それに、「Aにデータが入っていないセルが出てくるまで」というなら、Aにデータが入っていなければ、終了ということになります。 >行によっては空欄にもなる場合があります ということですから、そこで終了というわけですから、最後の行まではいかないということになります。文面からすれば、最後の行のセルまで行くということではないか、と思います。 --------------------------- 例えば、Bにデータが入っていて、Aにない場合などは、どうするのか、 などのことも想像してしまいます。 さて、一体、どんなデータ群なのか、読み手には伝わってきていません。
- keithin
- ベストアンサー率66% (5278/7941)
少しエクセルの使い方に慣れていると、わざわざループなどしなくても一発で解決できます。 sub macro1() dim LastRow as long lastrow = range("A65536").end(xlup).row on error resume next with range("B3:B" & lastrow) .specialcells(xlcelltypeblanks).formular1c1 = "=RC[-1]" .value = .value end with end sub でもまぁ、 >条件分岐と繰り返しマクロの組み合わせ方がよくわりません こっちの方が簡単と思うなら、もちろん構いません。 sub macro2() dim r as long for r = 3 to range("A65536").end(xlup).row if cells(r, "B") = "" then cells(r, "B").value = cells(r, "A").value end if next r end sub
お礼
ありがとうございました 違うやり方があるのがわかりました
お礼
ありがとうございました 解決できました