プロが教えるわが家の防犯対策術!

VBAについて勉強中です。

Dim book1 As workbook
Dim book2 As workbook
Set book1=workbooks (“商品一覧.xlsx”)
Set book2= workbooks (“比率表.xlsm”)
book1.worksheets (“マスター”).Activate
Range(“A:B,E:E,G:H”).copy
book2. worksheets (“マスター更新”).Columns(1).paste
Application.CutCopyMode=False

book1. worksheets (“アイテム一覧”). Activate
book1. worksheets (“一覧”). Range(Range(“A2”),cells(Rows.Count,1).End(xlUp)).copy
book2. worksheets (“印刷”).Range(“A6”).PasteSpecial(xlPasteValues)
Application.CutCopyMode=False

book1. worksheets (“アイテム一覧”). Range(Range(“P2”),cells(Rows.Count,1).End(xlUp)).copy
book2. worksheets (“印刷”).Range(“C6”).PasteSpecial(xlPasteValues)
Application.CutCopyMode=False
End Sub

上記で質問があります。
① ブック1A2コピー、ブック2A6に貼付でエラーとなり、
9行目book1. worksheets (“アイテム一覧”). Activate
 を追加すると実行できました。なぜ9行目が必要なんでしょうか?
②ブック1P2から最終行までをコピーし、ブック2C6から貼付けたいのですが、ブック1のA〜P列の最終行までがコピーされてしまいます。コピーしたいのはP列のみ(P2から最終行)です。
どのように書けばよいでしょうか。
P2コピー→C6から貼付けの後に、J2コピー→F6から貼付けとブック1の2行目から列単位で最終行までコピーし、ブック2の指定位置から貼付けしたいです。
③上記マクロ、もっと良いシンプルで読みやすい書き方が有れば教えてください。

A 回答 (1件)

こんばんは


まず、コード内にある不要な半角スペースはなぜ出来るのでしょう?
後付けで足しているのでしょうか? そこは置いといて
①9行目book1. worksheets (“アイテム一覧”). Activate を追加すると実行できました。
?エラー1004は返りませんか?

book1. worksheets (“一覧”). Range(Range(“A2”),cells(Rows.Count,1).End(xlUp))
このRange(“A2”)とcells(Rows.Count,1).End(xlUp)はbook1. worksheets (“一覧”)のセル範囲とは限りません。
シートオブジェクトが明示されていませんね。
Range(“A2”)と書くとアクティブシート(worksheets (“アイテム一覧”))のA2セルを指します。
シートをまたがってRangeオブジェクトを指定するとエラーが返ると思いますが
book1. worksheets (“アイテム一覧”). Activateは不要で
色々書き方はあると思いますが、こんな書き方になるのかな?

With book1.Worksheets("一覧")
.Range(.Range("A2"), .Cells(Rows.Count, 1).End(xlUp)).Copy
End With
book2.Worksheets("印刷").Range("A6").PasteSpecial (xlPasteValues)
Application.CutCopyMode = False

xlPasteValuesなので=で結ぶことも出来るかな
ちょっと分かり難いかも知れませんが
Dim n As Long
With book1.Worksheets("一覧")
n = .Cells(Rows.Count, 1).End(xlUp)
book2.Worksheets("印刷").Range("A6").Resize(.Range("A2:A" & n).Cells.Count, 1).Value = .Range("A2:A" & n).Value
End With

Range("P2")も同様、、

②コピーしたいのはP列のみ(P2から最終行)です。
どのように書けばよいでしょうか。

cells(Rows.Count,1).End(xlUp)はA列の最終行です
なので
cells(Rows.Count,"P").End(xlUp) ①を踏まえて、などとすれば良いです。"P" は 16 でもOK

③難しい質問です。結構好みがあると思いますので、、
初めのRange(“A:B,E:E,G:H”).copy部分は
Destination:=を省略していますが
book1.Worksheets("マスター").Range("A:B,E:E,G:H").Copy _
book2.Worksheets("マスター更新").Columns(1)
Application.CutCopyMode = Falseは不要、
(半角スペースに気を付けて)
などで
他は、=で結ぶ形でWith は使うと思います。

Dim book1 As Workbook
Dim n As Long
Set book1 = Workbooks("商品一覧.xlsx")
With Workbooks("比率表.xlsm")
book1.Worksheets("マスター").Range("A:B,E:E,G:H").Copy _
.Worksheets("マスター更新").Columns (1)
With .Worksheets("印刷")
n = book1.Worksheets("一覧").Cells(Rows.Count, 1).End(xlUp).Row
.Range("A6").Resize(.Range("A2:A" & n).Cells.Count, 1).Value = _
book1.Worksheets("一覧").Range("A2:A" & n).Value
n = book1.Worksheets("アイテム一覧").Cells(Rows.Count, 16).End(xlUp).Row
.Range("C6").Resize(.Range("P2:P" & n).Cells.Count, 1).Value = _
book1.Worksheets("アイテム一覧").Range("P2:P" & n).Value
End With
End With
End Sub

未検証なのエラーがあったらごめんなさい。
    • good
    • 0
この回答へのお礼

ありがとうございます!
やってみます!

お礼日時:2021/06/30 13:26

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