• ベストアンサー

マクロで条件に不一致なら空白セルを挿入方法

初めまして最近仕事でログ処理用のマクロを作成しているのですが、 マクロ初心者で、こんな場合どうしたらよいでしょうか? 教えてください。よろしくお願いします。 処理前 A列 B列 C列 jan ConnectTime feb 空白 JST mar 空白 ConnectTime apr 空白 JST may 空白 ConnectTime jun 空白 ConnectTime 処理後 A列 B列 C列     D列 jan ConnectTime feb 空白   空白    JST mar 空白 ConnectTime apr 空白   空白    JST may 空白 ConnectTime jun 空白 ConnectTime この場合B1にIF(C1="ConnectTime","","セルを挿入し右にシフト")的な処理をし、B列に適用させたいのですが可能でしょうか? よろしくお願いします。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.2です。 > これは、B列全体を処理するマクロなのでしょうか? > それともB1に対してのマクロなのでしょうか? A列にデータが入ってる範囲において処理を行っています。質問の例で言うと、janがA1から始まっているとすると、A1からA6までデータが入っているので、1行目から6行目までの処理となっています。 For Each R In Range("A1", Cells(Rows.Count, 1).End(xlUp)) というのは、RというRange型の変数を、A1からA列の一番下にデータが入っているセルまでループでまわす、という意味で、R.Offset(,1)というのがRから1つ右のセル、つまりB列で、R.Offset(,2)というのがRから2つ右のセル、つまりC列を表します。 If R.Offset(, 2) <> "ConnectTime" Then  R.Offset(, 1).Insert Shift:=xlShiftToRight End If というのが、C列が"ConnectTime"でない場合は、B列にセルを挿入し、右にシフトする、という意味になります。 したがって、 > For Each R In Range("A1", Cells(Rows.Count, 1).End(xlUp)) > この行のA1は、自分の例の場合はB1ということでしょうか? は、このままでいいです。A列を基準にデータの有無を判定してループをまわさないと、どこがデータの終端行かわからないのでこのような記述になっています。

ykpnt
質問者

お礼

丁寧なご回答ありがとうございました。 おかげ様でやりたい処理ができました。 それに勉強になりました。ありがとうございます。 もっと勉強して自分でマクロを書けるように頑張りたいと思います。 本当にありがとうございました。

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

質問の例ではjanの行だけB列に空白でなくConnectTimeが入っており、C列の値がありません。 > この場合B1にIF(C1="ConnectTime","","セルを挿入し右にシフト")的な処理をし、B列に適用させたい に忠実にしたがうと、janの行はC列がConnectTimeでないので右にシフトされるはずですが、例では処理後も変わっていません。これは単にB列に「空白」というのを入れ忘れただけで、marやmayの行と同じなのでしょうか。 一応そうだと仮定してマクロを書いてみました。 Sub Sample()  Dim R As Range  For Each R In Range("A1", Cells(Rows.Count, 1).End(xlUp))   If R.Offset(, 2) <> "ConnectTime" Then    R.Offset(, 1).Insert Shift:=xlShiftToRight   End If  Next End Sub

ykpnt
質問者

お礼

ご回答ありがとうございます。 > に忠実にしたがうと、janの行はC列がConnectTimeでないので右にシフトされるはずですが、例では処理後も変わっていません。これは単にB列に「空白」というのを入れ忘れただけで、marやmayの行と同じなのでしょうか。 申し訳ございません。入れ忘れでした。訂正いたします。 処理前 A列 B列   C列 jan 空白 ConnectTime feb 空白 JST mar 空白 ConnectTime apr 空白 JST may 空白 ConnectTime jun 空白 ConnectTime 処理後 A列 B列 C列     D列 jan 空白 ConnectTime feb 空白   空白    JST mar 空白 ConnectTime apr 空白   空白    JST may 空白 ConnectTime jun 空白 ConnectTime となります。 マクロありがとうございました。 初歩的な質問かも知れませんが宜しくお願いします。 かいていただいたマクロですが、これは、B列全体を処理するマクロなのでしょうか?それともB1に対してのマクロなのでしょうか? For Each R In Range("A1", Cells(Rows.Count, 1).End(xlUp)) この行のA1は、自分の例の場合はB1ということでしょうか? 質問ばかりで申し訳ありませんが、どうぞ宜しくお願いいたします。

  • hitodesu
  • ベストアンサー率77% (7/9)
回答No.1

「式」によって「処理前」から「処理後」を得るのであれば、「処理前」と「処理後」のシートを別にした方がよいのではないでしょうか? いろいろやっているうちに「再帰的」な処理が行われると結構面倒になるかも知れません。 「処理前」のデータをSheet1に入れ、「処理後」をSheet2で得るという事です。 そうすれば処理前のデータに触れる事無く、Sheet2に式を入れる事でSheet2に「処理後」を得る事ができます。 式作成中に元データを破壊する事もありませんし、そのほうがよいかと思います。 そう考えれば、式も単純になると思います。 さらに言えばセル中の「式」で他のセルを操作するというのは出来ないかも知れませんし。

ykpnt
質問者

お礼

ご回答ありがとうございます。 申し訳ありません説明不足でした。 式によるセルの挿入はできないとのことなので、マクロでinsertを使って処理することにしたんですが、どう説明したらいいのか難しかったのでIF文で処理したい内容を表してみました。 シートを分けることはとても参考になりました。 データの破損を防ぐ為検討したいと思います。 ありがとうございました。

関連するQ&A