• ベストアンサー

条件処理マクロ

エクセルのマクロについて教えていただけないでしょうか? セル A3以下にデーターが入っています(データーが入っている最終行は変化します) B3以下にもデーターが入っていますが、行によっては空欄にもなる場合があります やりたいこと セルAにデーターがあり、セルBにデーターがない場合はセルAのデーターをセルBにコピー セルAにデーターがあり、セルBにデーターがある場合はコピーせず、次の行を判定 これをAにデーターが入っていないセルが出てくるまで繰り返す 条件分岐と繰り返しマクロの組み合わせ方がよくわりません よろしくお願いします

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

  • ベストアンサー
回答No.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

y-kazu1962
質問者

お礼

ありがとうございました 解決できました

その他の回答 (2)

回答No.2

まず、ご自身で、どうやったらいいのか考えてみたらいかがでしょうか? あえて、私は、コードは書きません。 つまらない回答だなって思うのでしたら、無視して構いません。 文章の内容では、ロジックとして成立しにくいと思います。 文章の内容では、ご希望どおりにはならず、数回で終わって最後までいきません。 まず、フローチャートなどで、組み立て方を学ぶべきだと思います。 文章が、プログラム的にきちんと書けていたら、もう7割はプログラミングはできたと思ってよいと思います。掲示板の中には、マクロを知らないという人でも、きちんとロジックができている人もいます。 >条件分岐と繰り返しマクロの組み合わせ方がよくわりません 組み合わせということではなく、その前の段階です。 分岐は分岐(If構文)で、繰り返し(ループ)はループです。 サンプル・コードは探せば、いくつも出てくるはずです。それは参考にするものはいくつもあります。 --------------------------- >セルAにデーターがあり、セルBにデーターがない場合はセルAのデーターをセルBにコピー エクセルでは、セルBにコピーというのは、二種類あります。 オブジェクト(書式などが含まれている)としてコピーすることか、それとも、値をコピーする(正しくは代入の)ことか、というものです。それはどちらでしょう? 一般的には、VBA自体では、値をコピーすることですが。 ここの意味はよくわからないです。 >セルAにデーターがあり、セルBにデーターがある場合はコピーせず、次の行を判定 コピーしないというのは、何もしないということでは? つまり、Ifの「真」だけでも成立するので、この場合「偽」は必要ないのではないでしょうか? >これをAにデーターが入っていないセルが出てくるまで繰り返す それに、「Aにデータが入っていないセルが出てくるまで」というなら、Aにデータが入っていなければ、終了ということになります。 >行によっては空欄にもなる場合があります ということですから、そこで終了というわけですから、最後の行まではいかないということになります。文面からすれば、最後の行のセルまで行くということではないか、と思います。 --------------------------- 例えば、Bにデータが入っていて、Aにない場合などは、どうするのか、 などのことも想像してしまいます。 さて、一体、どんなデータ群なのか、読み手には伝わってきていません。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

少しエクセルの使い方に慣れていると、わざわざループなどしなくても一発で解決できます。 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

y-kazu1962
質問者

お礼

ありがとうございました 違うやり方があるのがわかりました

関連するQ&A

専門家に質問してみよう