• ベストアンサー

エクセルVBA データの転記に関して質問です

在庫管理の為に以下の通りに作成をしています。 (1)シート1からシート2へデータを転記したい。 (2)シート1からシート2へデータを転記した時シート2にはデータが蓄積されていきます (3)シート1のコピー範囲には空白のセルが含まれています。 (4)シート1の空欄の一部は数式による空白があります。 シート1 C8入庫年月日 C9伝票番号 C10品名 C11品番 C12単位 C13数量 C14単価 C15金額 C16入荷先 C17備考 シート2 C4入庫年月日 C5伝票番号 C6品名 C7品番 C8単位 C9入庫数量 C10単価 C11金額 C12入荷先 *C17は転記しません。 以下のとおりに記述しました。 Dim ab As Long Dim cd As Long Range("C9:k18").Copy Sheets("1").Select Cells(Rows.Count, 3).End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=True, Transpose:=False ab = Range("H" & Rows.Count).End(xlUp).Row For cd = ab To ab + 10 Step 1 If ActiveSheet.Cells(cd, 8) = "" Then Rows(cd).Delete shift:=xlUp End If Next cd Sheets("2").Select Application.CutCopyMode = False Range("e6").Select End Sub この記述で実行すると、1度目の転記はうまくいくのですが2回目の転記をしたときに空白行が入り、空白行の下に2回目の転記が行われてしまいます。 どうしたら空白行を無視して2回目の転記がうまくいくでしょうか? VBA初心者です。よろしくお願いします。

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

回答が付かないようなので まずは、 質問間違ってませんか? >シート1 C8入庫年月日 C8伝票番号 C10品名 ・・・ C17備考 >シート2 C4入庫年月日 C5伝票番号 C6品名 ・・・ C12入荷先 >*C17は転記しません。 シート1 C8入庫年月日 D8伝票番号 E8品名 ・・・ L8備考 シート2 C4入庫年月日 D4伝票番号 E4品名 ・・・ K4入荷先 *L8は転記しません。 では、ありませんか こうしないと質問にあるコードと矛盾しませんか? >この記述で実行すると、1度目の転記はうまくいくのですが2回目の・・・ うまく行きませんよね? シート1のデータがシート1に貼り付けられるようになってますよ 整理します シート1の9行目以降のデータをシート2の5行目以降にコピーする コピーの条件として入庫年月日と数量が入力されているもののみ シート2にはデータを蓄積するため、最終行以降に順次追加していく この条件を満たしたものが下のコードです Sub test() Dim i As Long With Worksheets("1") For i = 9 To .Cells(Rows.Count, 3).End(xlUp).Row If .Cells(i, 3).Value <> "" And .Cells(i, 8).Value <> "" Then .Cells(i, 3).Resize(, 9).Copy Worksheets("2").Cells(Rows.Count, 3).End(xlUp).Offset(1).PasteSpecial Paste:=xlValues Application.CutCopyMode = False End If Next i End With Worksheets("2").Select Range("e6").Select End Sub これでうまく行かないのであれば もう一度質問を整理して 再度質問することをお薦めします 以上参考まで

manachan1
質問者

お礼

ありがとうございました。 #1さんに書いて頂いたコードでちゃんと動作するようになりました。勉強不足と、質問がうまく整理されておらず申し訳ありませんでした。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 最初に、質問は正確にお願いします。#1さんの解釈と、私の解釈が違うということは、それだけコードが曖昧なのかもしれません。 ご質問の回答のポイントとしては、行を削除するときは、下から上に Step -1 とすることです。うまく行かないというのは、以下の部分で、コピー後ですから、 >ab = Range("H" & Rows.Count).End(xlUp).Row >For cd = ab To ab + 10 Step 1 これでは、一番下の行 ab から先に、10行下には、何もあるわけないので、 For cd = ab To ab - 10 Step - 1 こういうことではないかとは思います。 後は、#1さんとも重複しますが、 >シート1 C8入庫年月日 C9伝票番号 C10品名 C11品番 C12単位 C13数量 C14単価 C15金額 C16入荷先 C17備考 >シート2 C4入庫年月日 C5伝票番号 C6品名 C7品番 C8単位 C9入庫数量 C10単価 C11金額 C12入荷先 Range("C9:k18").Copy としていますが、コピーの対象は、C8 ~列方向となっています。これは、縦ではなく、横に並ぶのではないでしょうか? >(1)シート1からシート2へデータを転記 ということで、なぜ、Range("C9:K18").Copy 後に、Sheets("1").Select が出てくるか分かりません。 >Range("C9:K18").Copy  ←そもそも、これが良く分からないです。 固定したデータ行なのでしょうか?このデータは、Sheets("1")にあるものでしょうか?

manachan1
質問者

お礼

回答ありがとうございました。勉強不足で質問が分かりづらくすみませんでした。 #1さんに教えて頂いたコードでうまく動作するようになりました。 これからもっと頑張って勉強します。

関連するQ&A