プロが教える店舗&オフィスのセキュリティ対策術

マクロ初心者です。(エクセル2003使用)

シート1にある表で、M列が空白以外(処理済みなどの値がある場合)である場合、その行全体をコピーし、シート2の最終行に貼り付けして、シート1からはその行を削除するマクロを作成したいと思っていますができません。
すみませんが、どなたかご教授願います。

(シート1の表)
・8行目が題目となっており、A9から表となっています。
・表の全体サイズは、横がAからMまでで、縦はC(シー)の管理番号行分までとなっています。(Mは、空欄があったり値(処理済みなどの値)が入っていたりしています)

(考えているマクロ)
・Loopの回数は、Cの管理番号が終わるまで
・IFでCに値があり、Mが空欄だった場合は、そのまま(何もしない)
・Cに値があり、Mに値があった場合は、その行全体を選択しコピーし、シート3の最終行に貼り付け、シート1のその行は削除する


Sub 処理済み()

Range("C9").Select

Do While ActiveCell.Value = ""
ActiveCell.Offset(1).Select
Loop


If ActiveCell.Offset(, 10).Value = "" Then
そのまま
Else If ActiveCell.Offset(, 10).Value = "値があったら" Then
その行全体を Select.Copy


Sheets("Sheet2").Select
Dim 下
下 = Range("A").End(xlDown).Row
ペースト

削除
End If

End Sub


すみませんが、どなたか教えていただけましたら助かります。
よろしくお願いいたします。

A 回答 (4件)

基本は最低限勉強した方がよいと思いますよ


>・Loopの回数は、Cの管理番号が終わるまで
初心者はdo~loopではなくfor~nextを使用した方が良いでしょう
do~loopは確実な条件を設定しないと無限ループになりやすく、扱いが難しい

行削除を伴う処理は最終行から行う方がよい
3行、4行目が削除対象だとして
上から処理を行った場合
3行目の行削除処理を行うと、4行目が3行目に移動するため
4行目が行削除処理されないままになってしまうため

上のようなことを踏まえて

Sub test()
Dim i As Long, ii As Long
ii = Worksheets("sheet2").Range("A65536").End(xlUp).Offset(1).Row
With Worksheets("sheet1")
For i = .Range("c65536").End(xlUp).Row To 9 Step -1
If .Cells(i, 3).Value <> "" And .Cells(i, 13).Value <> "" Then
Worksheets("sheet2").Rows(ii).Insert Shift:=xlDown
.Rows(i).Copy Worksheets("sheet2").Cells(ii, 1)
.Rows(i).Delete Shift:=xlUp
End If
Next i
End With
End Sub

参考程度に
    • good
    • 0
この回答へのお礼

ご丁寧なアドバイスを投稿いただきまして、ありがとうございます。
まだまだ分からないことが沢山あり、応用をきかすこともできない状態ですが、回答いただいたコードを理解できるよう勉強しようと思います。ご親切な回答、本当にありがとうございました。

お礼日時:2009/09/13 03:28

知ったかぶりです。


#1さんのご意見も御もっともですが、失礼ながら質問者さんは、
#1さんのアドバイスを実行出来るレベルに無いと感じました。

VBEを起動(alt+F11)して、F8キーを押す毎に、マクロを1Stepずつ
実行でき、ご自分で作られたマクロが何故期待動作しないかを確認、
改善すれば良いと思います。

参考に、質問者さんがやりたいと思うソースを以下に示します。
これも、1Stepずつ実行して、各命令がどのような動作をしているか
観測して、学習してください。
尚、もっとスマートなやり方もありますが、質問者さんが考えられた
方法を出来るだけ再現したつもりです。

Sub sample()

Dim i As Long
Dim j As Long

i = 9
j = 1

Do While Cells(i, 3) <> ""
  If Cells(i, 13) <> "" Then
    Rows(i & ":" & i).Copy
    Sheet2.Select
    Rows(j & ":" & j).Select
    ActiveSheet.Paste
    j = j + 1
    Sheet1.Select
    Rows(i & ":" & i).Select
    Selection.Delete
    i = i - 1
  End If
  i = i + 1
Loop
    • good
    • 0
この回答へのお礼

初心者なため初歩的な質問ですみませんでした。
ご親切な回答に感謝いたします。ありがとうございました。

お礼日時:2009/09/13 03:21

ぱっとみでお答え



loop文の位置がおかしい
何もしないでルーぴしている
    • good
    • 0

そこまで出来ているのに何が判らないのでしょうか?


実際にやってみておかしな所(分からない部分)を
質問すべきではないでしょうか?
中には、ご親切な回答者のかたもおられてプログラムを
組んでくれるかも知れませんが・・・・・
    • good
    • 0

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