電子書籍の厳選無料作品が豊富!

初めまして最近仕事でログ処理用のマクロを作成しているのですが、
マクロ初心者で、こんな場合どうしたらよいでしょうか?
教えてください。よろしくお願いします。
処理前
A列 B列 C列
janConnectTime
feb空白JST
mar空白ConnectTime
apr空白JST
may空白ConnectTime
jun空白ConnectTime

処理後
A列 B列 C列     D列
janConnectTime
feb空白  空白    JST
mar空白ConnectTime
apr空白  空白    JST
may空白ConnectTime
jun空白ConnectTime

この場合B1にIF(C1="ConnectTime","","セルを挿入し右にシフト")的な処理をし、B列に適用させたいのですが可能でしょうか?
よろしくお願いします。

A 回答 (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列を基準にデータの有無を判定してループをまわさないと、どこがデータの終端行かわからないのでこのような記述になっています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/02 18:04

質問の例では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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

> に忠実にしたがうと、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ということでしょうか?

質問ばかりで申し訳ありませんが、どうぞ宜しくお願いいたします。

お礼日時:2007/04/02 17:02

「式」によって「処理前」から「処理後」を得るのであれば、「処理前」と「処理後」のシートを別にした方がよいのではないでしょうか?


いろいろやっているうちに「再帰的」な処理が行われると結構面倒になるかも知れません。
「処理前」のデータをSheet1に入れ、「処理後」をSheet2で得るという事です。

そうすれば処理前のデータに触れる事無く、Sheet2に式を入れる事でSheet2に「処理後」を得る事ができます。
式作成中に元データを破壊する事もありませんし、そのほうがよいかと思います。

そう考えれば、式も単純になると思います。

さらに言えばセル中の「式」で他のセルを操作するというのは出来ないかも知れませんし。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
申し訳ありません説明不足でした。
式によるセルの挿入はできないとのことなので、マクロでinsertを使って処理することにしたんですが、どう説明したらいいのか難しかったのでIF文で処理したい内容を表してみました。

シートを分けることはとても参考になりました。
データの破損を防ぐ為検討したいと思います。
ありがとうございました。

お礼日時:2007/04/02 16:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!