アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記の様な表(処理前)があるとします。
2行目から行毎に"A列 = C列 AND B列 = D列"という比較を行い、
TRUEなら次の行へ、FALSEなら該当行のC列とD列に
空白セルを挿入し(処理後の表の様にしたいです)次の行へ進む
という処理をマクロにて実現したいです。
どのようなマクロを組めば宜しいでしょうか?ご教授お願い致します。

<処理前>
A列B列C列D列
東京斎藤東京斎藤
東京田中東京後藤
東京伊藤東京井上
東京後藤東京三沢
東京井上
大阪田中
東京三沢

<処理後>
A列B列C列D列
東京斎藤東京斎藤
東京田中<両列に空白セル挿入>
東京伊藤<両列に空白セル挿入>
東京後藤東京後藤
東京井上東京井上
大阪田中<両列に空白セル挿入>
東京三沢東京三沢

A 回答 (5件)

C列とD列に空白を挿入、というのは空白のセルを挿入して右にシフト、というわけではなくて、元々入っていた値を空白で上書きするということでよろしいですか?(処理後のようにしたいです、と言うことでそう解釈したので、違ったら補足願います)



1行目からデータが入っていると仮定して、以下のようなマクロを書いてみました。

Sub Macro1()
  Dim EndRow As Integer, i As Integer
  EndRow = Range("A65536").End(xlUp).Row
  For i = 1 To EndRow
    If Cells(i, 1).Value <> Cells(i, 3).Value Or _
     Cells(i, 2).Value <> Cells(i, 4).Value Then
      Range(Cells(i, 3), Cells(i, 4)).Clear
    End If
  Next
End Sub

データが2行目以降から入っているのなら、
For i = 1 To EndRow
の1の値をデータが始まる行に変更してください。

※質問文のように「A列 = C列 AND B列 = D列 の条件がFALSEのとき」という書き方をしたいなら、
     If (Cells(i, 1).Value = Cells(i, 3).Value And _
       Cells(i, 2).Value = Cells(i, 4).Value) = False Then
と書いても同じです。

この回答への補足

ご回答ありがとうございます。
言葉足らずで申し訳ございません。

C列とD列に空白を挿入、というのは空白のセルを挿入し、
元々あった値を下にシフト(遷移)させたいです。
このシフトは比較結果がTRUEになるまで継続させます。

以上です。

補足日時:2007/01/12 01:25
    • good
    • 0

回答の前の質問です。

下記部分は、***と解釈していいのですか?。
下記の様な表(処理前)があるとします。
2行目から行毎に"A列 = C列 AND B列 = D列"という比較を行い、
TRUEなら次***の行へ何もせず進む、FALSEなら該当行のC列とD列を空白セルにして(処理後の表の様にしたいです)次の行へ進む
という処理をマクロにて実現したいです。
但し、他の列には、データがない。
または、あっても関与しない。・・・・・ですか??。

この回答への補足

ご回答ありがとうございます。
言葉足らずで申し訳ございません。

C列とD列に空白を挿入、というのは空白のセルを挿入し、
元々あった値を下にシフト(遷移)させたいです。
このシフトは比較結果がTRUEになるまで継続させます。

>但し、他の列には、データがない。
>または、あっても関与しない。・・・・・ですか??。
比較元は常にA列とB列、比較先はC列とD列となります。
その他の列(E列以降)は関与しません。

以上です。

補足日時:2007/01/12 01:31
    • good
    • 0

No.1です。



> C列とD列に空白を挿入、というのは空白のセルを挿入し、
> 元々あった値を下にシフト(遷移)させたいです。

理解できました。
以下のようにマクロを修正してみましたが、これでいかがでしょうか。

Sub Macro1()
  Dim EndRow As Integer, i As Integer
  EndRow = Range("A65536").End(xlUp).Row
  For i = 1 To EndRow
    If Cells(i, 1).Value <> Cells(i, 3).Value Or _
     Cells(i, 2).Value <> Cells(i, 4).Value Then
      Cells(i, 3).Insert Shift:=xlShiftDown
      Cells(i, 4).Insert Shift:=xlShiftDown
    End If
  Next
End Sub

この回答への補足

ご回答ありがとうございます。
教えて頂いた内容でやりたいことは実現可能でした。
ありがとうございます。

重ねて質問してもよろしいでしょうか?
下記の部分なのですが、1文にまとめることは可能でしょうか?

Cells(i, 3).Insert Shift:=xlShiftDown
Cells(i, 4).Insert Shift:=xlShiftDown

補足日時:2007/01/15 01:33
    • good
    • 0

No.1です。

補足拝見しました。
Cells(i, 3).Insert Shift:=xlShiftDown
Cells(i, 4).Insert Shift:=xlShiftDown
を1行にまとめるなら、
Range(Cells(i, 3), Cells(i, 4)).Insert Shift:=xlShiftDown
とするか、あるいは
Cells(i, 3).Resize(1, 2).Insert Shift:=xlShiftDown
とすればいいです。
    • good
    • 0
この回答へのお礼

早急なご回答ありがとうございます。
やはりセル分記述するしかないのでしょうか?
もし仮に該当行のC列からJ列に対して挿入したい場合、"3-10"の様に範囲指定することは不可でしょうか?
重ね重ねで申し訳御座いませんが、ご回答宜しくお願い致します。

お礼日時:2007/01/15 10:34

> やはりセル分記述するしかないのでしょうか?



いえ、その必要はありません。たとえば、
Range(Cells(i, 3), Cells(i, 10)).Insert Shift:=xlShiftDown
とすると、「i行3列目からi行10列目まで」という意味になり、たとえばiが1の場合、C1:K1の範囲を意味します。(C1とK1ではありません)

また、
Cells(i, 3).Resize(1, 2).Insert Shift:=xlShiftDown
は、「i行3列目から横に2列」を意味し、これを
Cells(i, 3).Resize(1, 10).Insert Shift:=xlShiftDown
にすると、「i行3列目から横に10列」を意味し、iが1の場合、C1:L1を意味します。
    • good
    • 0

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