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

ご回答者様

いつもお世話になっております。
表題の件、VBAの質問です。

抽出データシートの一部を取りまとめシートにコピーをしたいです。
B列にはJANコードが必ず入るので1以上の数字か必ず入ります。

1列目は項目が入っているのでデータは2列目からです。

マクロの記録を使用したら下記ソースになります。

Sub Macro1()
'
' Macro1 Macro
'

' Sheets("抽出データ").Select
Range("B2:F9").Select
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("取りまとめデータ").Select
Range("B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub


下記ソースの部分でシフト+コントロール+下矢印で最後の行まで選択しております。
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlDown)).Select

しかしながらB列とF列にはデータが入っていない行もあります。
(2列目は入っていて3列目がブランクで4列目のデータが入っている等)

その場合はデータが入っている最終行までを選択してコピーをしないと3行目でコピーが止まってしまうかと存じます。

そのため、変数を用いてB列のJAN(こちらは必ず記載があります)にデータが入っていた場合は
その行数の部分をコピーの範囲として選択したいです。
(例:2行目から40行目までにJANがある場合の範囲はRange("B2:F40").Select)

その際はeRow = Cells(Rows.Count, 2).End(xlUp).Rowを用いてB列のデータが入っている最終行を選択すれば良いことは認識していますがそこから変数iを使用してどにように範囲を選択して抽出データのシートから取りまとめのシートに値貼付けをしたらよいか分かりません。

抽出データシートも取りまとめシートも1行目は項目ですので2行目からデータが入っています。

お忙しい所誠に恐れ入りますが何卒宜しくお願い申し上げます。

質問者からの補足コメント

  • お世話になります。
    すみません、パソコンから返信出来ずに申し訳ございません。
    夜にソースを送ります。

    コピーしたいセルの範囲ですがF列を2行目から1000行目まで選択したら貼り付けできましたが
    可能であれば範囲指定したいです。

    夜に纏めて送ります。

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/03/11 11:27

A 回答 (4件)

分けて行う形なら難しいわけでは、ありませんし解り易いと思います。


Areasプロパティを使えばもう少しすっきりするかもしれませんが、取敢えずべたに
(Areasプロパティは調べてみてください)

取りまとめデータシートの最終行に書き足して行くコードの場合(参考)

Dim eRow1 As Long, stRow As Long, cout As Long
eRow1 = Sheets("抽出データ").Cells(Rows.Count, 2).End(xlUp).Row
stRow = Sheets("取りまとめデータ").Cells(Rows.Count, 2).End(xlUp).Row

Sheets("抽出データ").Range("B2:D" & eRow1).Copy
Sheets("取りまとめデータ").Range("B" & stRow + 1).PasteSpecial Paste:=xlPasteValues
Sheets("抽出データ").Range("F2:F" & eRow1).Copy
Sheets("取りまとめデータ").Range("F" & stRow + 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False ’自動記録で記録する場合、最後にコピーモード(セルが点々枠)時にESCキーを押して記録

とか、xlPasteValuesなので値の参照で

cout = Sheets("抽出データ").Range("B2:D" & eRow1).Rows.Count

Sheets("取りまとめデータ").Range("B" & stRow + 1 & ":D" & stRow + cout).Value = _
Sheets("抽出データ").Range("B2:D" & eRow1).Value
Sheets("取りまとめデータ").Range("F" & stRow + 1 & ":F" & stRow + cout).Value = _
Sheets("抽出データ").Range("F2:F" & eRow1).Value


取りまとめデータシートの最終行が必要ない場合、stRow部分は定数に
coutが何なのかは、考えてください。

補足を読まず、書いてしまいました。
夜、再度確認します。。
    • good
    • 0

#2 の返信で


>実はFの後のE列を飛ばしF列もコピーしたいと考えています。
そうすると
Range("B2:D9,F2:F9").Select と言う事ですか?(E列を飛ばす)
これを、Sheets("取りまとめデータ").Select  Range("B2")に PasteSpecial Paste:=xlPasteValues すると

B,C,D,E列のペーストされると思います。 元Sheets("抽出データ").F列がSheets("取りまとめデータ").E列へ

もし、それが希望通りなら良いですが、、もしコピー元と同じようにE列を飛ばしたいなら、、出来ないかと思います。
この回答への補足あり
    • good
    • 0
この回答へのお礼

お世話になります。
取り急ぎBからF列まではコピーできました。

F列のコピーですが、やはり難しいでしょうか。

宜しくお願い致します。

お礼日時:2020/03/11 11:24

すみません。


Dim eRow As LongSheets("抽出データ").Select 改行が入っていませんでした

Dim eRow As Long
Sheets("抽出データ").Select

>B列とF列にはデータが入っていない行もあります。
>B列のJAN(こちらは必ず記載があります) ?

間違えでしょうか?

ちなみに
Range("B2:F9").Select
Range(Selection, Selection.End(xlDown)).Select
多分、B列にデータが切れずにあるのなら、選択できるのではないでしょうか?
(B列に.End(xlDown))だったかと、、、
    • good
    • 0
この回答へのお礼

すみません、誤りです
実はFの後のE列を飛ばしF列もコピーしたいと考えています。
宜しくお願い致します。

お礼日時:2020/03/10 23:16

>(例:2行目から40行目までにJANがある場合の範囲はRange("B2:F40").Select)


>その際はeRow = Cells(Rows.Count, 2).End(xlUp).Rowを用いてB列のデータが入っている最終行を選択すれば良いことは認識していますがそこから変数iを使用してどにように範囲を選択して

取り敢えず、変数 i は忘れて
eRow = Cells(Rows.Count, 2).End(xlUp).Rowを用いて
Range("B2:F40").Select)を選択するなら、

eRowは、B列最終行の行番号ですから、Range("B2:F" & eRow).Select となります.

Dim eRow As LongSheets("抽出データ").Select
eRow = Cells(Rows.Count, 2).End(xlUp).Row
Range("B2:F" & eRow).Select
Selection.Copy

となりますが、.SelectやSelectionは範囲を選択する選択している範囲を なので

Selection.Copyは、
Range("B2:F" & eRow).Copy 範囲をコピーと同様な意味になりますね。

同様に
Sheets("取りまとめデータ").Select
最終行を求めるコード 
Range("B2").Select ’B列の最終行を求めてRange("B" & 変数).Select やCells(変数,2).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

これも、B列の最終行を求めてRange("B" & 変数).Select やCells(変数,2).Select
この場合、最終行の次の空きセルに貼り付けなくてはいけませんので、変数+1となります。

2つのシートを扱っているので、エラー回避などをふまえ シート名を明示するようにしましょう
例えば、eRow = Cells(Rows.Count, 2).End(xlUp).Rowは、
eRow = Sheets("抽出データ").Cells(Rows.Count, 2).End(xlUp).Row
    • good
    • 0
この回答へのお礼

お世話になります。
ありがとうございます。
早速、ためしてみます。

お礼日時:2020/03/10 23:07

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