質問: vbaについて勉強中です。 dim book1 as workbook dim book2 as w 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 上記で質問があります。 1 ブック1a2コピー、ブック2a6に貼付でエラーとなり、 9行目book1. worksheets (“アイテム一覧”). activate を追加すると実行できました。なぜ9行目が必要なんでしょうか? 2ブック1p2から最終行までをコピーし、ブック2c6から貼付けたいのですが、ブック1のa〜p列の最終行までがコピーされてしまいます。コピーしたいのはp列のみ(p2から最終行)です。 どのように書けばよいでしょうか。 p2コピー→c6から貼付けの後に、j2コピー→f6から貼付けとブック1の2行目から列単位で最終行までコピーし、ブック2の指定位置から貼付けしたいです。 3上記マクロ、もっと良いシンプルで読みやすい書き方が有れば教えてください。
回答: こんばんは まず、コード内にある不要な半角スペースはなぜ出来るのでしょう? 後付けで足しているのでしょうか? そこは置いといて 19行目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")も同様、、 2コピーしたいのはp列のみ(p2から最終行)です。 どのように書けばよいでしょうか。 cells(rows.count,1).end(xlup)はa列の最終行です なので cells(rows.count,"p").end(xlup) 1を踏まえて、などとすれば良いです。"p" は 16 でもok 3難しい質問です。結構好みがあると思いますので、、 初めの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 未検証なのエラーがあったらごめんなさい。