• ベストアンサー

条件処理マクロ

エクセルのマクロについて教えていただけないでしょうか? セル 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/7940)
回答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

  • 初心者です。EXCELのマクロを作ろうとして、困っています。

    初心者です。EXCELのマクロを作ろうとして、困っています。 やりたいことは、以下の通りです。 1行目には、年度並びで月が並んでいます(4月→3月)。 2行目は、空欄ですが、ここに後述のデータをコピーします。 セルA5には、コピーしたいデータが記載されています。 セルA6には、セルA5にデータを記載した「翌月の日付(YYMMDD)」が記載されています。 A6の日付を「前月」にして、2行目の該当月(前月)のセルに、セルA5のデータをコピーします。 以上のことをやりたいのですが、どの様にすれば良いか教えてください。 よろしくお願いします。

  • エクセルのVBA 条件分岐について

    エクセルのVBAで、条件分岐プログラムを考えております。 セルA1に入力された数値が、 2.0以下は"B1セルの値をC1セルへコピー 数値が 5.0以上の場合は"B2セルの値をC1セルへコピー それ以外の場合は”対象外”と表示させたいのですが ご教授お願いします。 又、条件分岐後の部分『C1セルへコピー』の部分を"マクロ1を実行" "マクロ2を実行"というように、変える様な事も出来ますでしょうか? 以上よろしくお願いします。

  • ExcelVBAのマクロを特定条件まで繰り返し。

    初めて質問させていただきます。 ExcelVBAで特定マクロを特定回数あるいは隣のセルが空欄になるまで実行させたいのですが、VBAの知識が乏しく判りません。例えば、セルB1~D1を選択してマクロAを実行し、セルA2が空欄で無ければ改行、セルB2~D2を選択してマクロAを実行、、、とセルAが「空欄」になるまで繰り返します。この作業を約1000行程度行わせるため、手作業では途方も無い時間を費やすことになります。 ご指導いただければ助かります。

  • 複数の条件付き書式をマクロで処理するには?

    エクセルの条件付き書式で、3つ以上の書式を設定しなければなりません。 エクセルの機能では3つしか設定できないため、マクロで条件を設定しようと思いますが、方法が分からないので教えてください。 データは、 ・あるセルに =today() で今日の日付データを持ってます。 ・横軸は日付と曜日のデータが入ってます。 ・縦軸はお店の名前が入っていますが、1行目が1~100%までの%の数値、2行目が1~1000までの整数が入っており、2行で1店というかたちで、その下の行にはまた違う店の名前が入ってます。 こんな感じです。↓    12/1 12/2 12/3 12/4 12/5     水   木   金   土   日 A店 100%  90%  80%  70%  60%     500  400  500  400  500 B店  30%  40%  50%  60%  100%     300  200  300  200  300 条件は以下の3つです。 (1)曜日が土日祝だったら背景色をグレーに(%と整数のセル両方) (2)%の値が100%だったら文字色を青に(%の行のみ) (3)上の日付が今日の日付より過去の日付だったら、セル・文字色とも赤色に(%、整数のセル両方) 上記の条件を設定する場合、条件は3つですが、曜日が(1)に該当しつつ%も(2)に該当する場合、曜日は(1)に該当するけど%は(2)に該当しない場合など複数のケースが想定されるため、実際に設定しなければいけない書式は以下の5パターンになるため、エクセルの条件付き書式ではできませんでした。 A. 背景=グレー、文字色=青 B. 背景=グレー、文字色=指定なし(黒) C. 背景=指定なし、文字色=青 D. 背景=指定なし、文字色=指定なし(黒) E. 背景=赤、文字色=赤 この場合、マクロで処理するしかないと思うのですが、どのようにVBAを書いたら良いでしょうか? ちなみに(2)の条件は%の行には設定したいのですが、整数の行には設定したくないです。 いちいち%の行を選んでマクロ実行するのは面倒なので、選択範囲の指定もマクロに組み込みたいです。 お知恵をお貸しください。 よろしくお願いします!!

  • 行コピーして、今日の日付の行に貼り付けるマクロ

    こんにちは、エクセルマクロについて、助けて頂きたく質問させていただきました。 添付しました画像のような表があり、 セルA2に「=TODAY()」が入っていて、セルB2から右は別シートのデータを参照しています。 マクロを実行すると、2行目を行コピーし、セルA3以下の日付からセルA2の日付(今日の日付)を探し出して、行貼り付けしてほしいです。 行コピーや値で貼り付けはマクロの記録を使って、詳しくない私でもなんとか作ることはできるのですが、 今日の日付を探し出して、そこに貼り付ける。というマクロは作れませんでした・・・。 お助け下さい、宜しくお願いします! ※補足します セルA2の今日の日付は便宜上入力しているだけです。無い方がマクロを組みやすいのなら、無くせます。

  • 前判断処理 Do untilの動作について

    excel2010 前判断処理 Do Untilの処理について教えてください。 A7セル,A8セル…とデータが入っていて、そのセルのデータをA6セルにコピーしてマクロを実行します。 このマクロは、ピポットテーブルのグラフを作成し、A6セルに入った文字列にシート名称を 変更するという内容になっています。 詳細内容は省きます。 A7セルのデータをA6セルにコピーしマクロ実行 A8セルのデータをA6セルにコピーしマクロ実行 … Anセルのデータが空欄であったらマクロ実行しない という様にしたいのです。 Sub tsumiage2() Dim 行番号 As Integer 行番号 = 7 Do Until Cells(行番号, 1).Value = "" If Cells(行番号, 1).Value = "" Then Exit Do Sheets("(5)人別積み上げ").Select Range("A6") = Cells(行番号, 1).Value macro41 行番号 = 行番号 + 1 Loop End Sub サンプルデータでA7セル,A8セルにデータが入っていて、A9セルが空欄の時、 A7セルをA6セルへコピーしてマクロ実行。 A8セルをA6セルへコピーしてマクロ実行。 A9セルをA6セルへコピーしマクロが実行されエラーのポップアップが出てしまいます。 Do Untilは、条件がそろったらそれ以降は実行されない というのを調べたのですが、A9セルが空欄でマクロが実行されるのは何故でしょうか? 対処法についても教えていただきたく。

  • セル移動マクロを教えて下さい。

    エクセルで最終行の次の行(新規入力となる行)の左4つ目のセルに移動するマクロを作りたいのですが、出来るでしょうか。 例えば列Aに1から3000までのNOが入っているとします。 B列からD列までは他のデータに使用しているため新規入力データE列の行から右に入力しています。 NO125の行までデータ入力している場合、ボタンをクリックすれば、A列のNO126(新規入力行のA列)にセルが移動するマクロです。 よろしく、お願いいたします。

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。

  • Excelマクロでセルの比較

    Excelマクロでセルの比較 まだマクロ初心者なので、詳しいことがわからなくて困っております。 例)●前提として何行目まであるかは変化します     (A列)(B列) (1行目) 35  35 (2行目) 26  26 (3行目) 13  13 (n行目) 12  12 ※n=最終行 【やりたいこと】 このようにシートに入力されていたとして、 「A1=B1?」⇒「A2=B2?」⇒「A3=B3?」⇒「An=Bn?」と比較を進めていき不一致の有無を出す。 もし不一致がなければ、そのまま通過しその次のマクロを実行していく。 不一致があった場合には、不一致の行を別ファイルに出力してファイル保存し、ファイルを閉じる。 マクロを実行している元のファイルは、保存せずにファイルを閉じる) 行の長さが変化するため、その変化にも対応した処理を実行したいと思っております。 本やサイトで調べてみたのですが、基礎知識がないためうまく処理をさせるマクロを作ることが出来ませんでした。 このようなマクロが可能なのかもわかりませんが、出来ましたらこのマクロを教えていただけますでしょうか。 宜しくお願いいたします。

  • 繰り返し処理のマクロ

    下記のマクロをご教示いただけるでしょうか。 ①シートAのアクティブセルをコピーし、シートBのE1セルにペースト ②マクロ「結果反映」を実行 ➂シートAのアクティブセルを1行下に移動 ①から➂をアクティブセル=空白セルになるまで繰り返し

専門家に質問してみよう