[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『別ブックの最終行に貼り付けをしたい』(ぺんぎん)
マクロ初心者です。
別のブックの可変的な最終行の次の行に、データを貼り付けしたいです。
下記の「Dim j」の部分でエラーが出てしまい、行き詰ってしまってしまいました。
どのように修正したら良いのか分からず・・・ご指導宜しくお願いします!
Sub 集計表に貼り付け()
Workbooks.Open Filename:=path & "集計表.xlsx"
Dim wb0 As Workbook Set wb0 = ThisWorkbook
Dim wb1 As Workbook Set wb1 = Workbooks("集計表.xlsx")
Dim j As Range j = wb1.Worksheets("貼付シート").Cells(Rows.Count, "B").End(xlUp).Row + 1
wb0.Worksheets("コピーシート").Range("A1:AH10").Copy wb1.Worksheets("貼付シート").Range("A" & j).PasteSpecial Paste:=xlPasteValues
End Sub
< 使用 Excel:unknown、使用 OS:Windows10 >
Dim j As Range → Dim j As Long では? (Jimi-hen) 2022/03/14(月) 14:10
複数のトピックを同時進行すると、かえって理解しづらくなることもあるとおもいますので、1つずつ解決することをお勧めします。
■2
>下記の「Dim j」の部分でエラー
実際にエラーが発生しているのはその次の行です。
Workbooks("集計表.xlsx").Worksheets("貼付シート").Cells(ActiveSheet.Rows.Count, "B").End(xlUp).Row + 1
↑で返ってくるのは行番号を表す【数値】です。
なのに、既に指摘されているように「 Dim j As Range」のように、object型(Range)で宣言しているので格納に失敗してエラーになっています。
したがって、宣言を直すか使い方を直すかどちらかが必要です。
Sub 宣言を直す() Const path As String = "C:\hoge\" Dim j As Long'整数を格納するLong型で宣言します。
With Workbooks.Open(Filename:=path & "集計表.xlsx").Worksheets("貼付シート") j = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
ThisWorkbook.Worksheets("コピーシート").Range("A1:AH10").Copy .Range("A" & j).PasteSpecial Paste:=xlPasteValues End With End Sub '------------------------------------------------------------------------------------- Sub 使い方を直す() Const path As String = "C:\hoge\" Dim dstRNG As Range'分かりやすいように変数名を変えました。
With Workbooks.Open(Filename:=path & "集計表.xlsx").Worksheets("貼付シート") Set dstRNG = .Cells(.Rows.Count, "B").End(xlUp).Offset(1, -1) 'オブジェクト型の時はSetが必要 End With
ThisWorkbook.Worksheets("コピーシート").Range("A1:AH10").Copy dstRNG.PasteSpecial Paste:=xlPasteValues End Sub
(もこな2 ) 2022/03/14(月) 14:36
もこな2様、宣言を直すを使わせていただき、無事解決しました。
開いているエクセルを・・・というのがミソ?なんですかね。
勉強になりました!
そしてもっと勉強します・・・。
ありがとうございました。
ちなみに、[20220304163933]のぺんぎんさんとは別人になります。
紛らわしくてスイマセン。
(ぺんぎん) 2022/03/14(月) 14:56
■4
>開いているエクセルを・・・というのがミソ?なんですかね。
違います。繰り返しになりますが、変数の【型】と格納しようとしたデータの【型】があっていないことが問題でした。
したがって、↓のようにJimi-henさんから指摘のあったように修正しても問題ないです。
Sub 集計表に貼り付け_改() Const path As String = "C:\hoge\"
Workbooks.Open Filename:=path & "集計表.xlsx" Dim wb0 As Workbook Set wb0 = ThisWorkbook Dim wb1 As Workbook Set wb1 = Workbooks("集計表.xlsx") Dim j As Long '★ここを修正 j = wb1.Worksheets("貼付シート").Cells(Rows.Count, "B").End(xlUp).Row + 1 wb0.Worksheets("コピーシート").Range("A1:AH10").Copy wb1.Worksheets("貼付シート").Range("A" & j).PasteSpecial Paste:=xlPasteValues End Sub
■5
>宣言を直すを使わせていただき、無事解決しました。
こちらの意図としては、完成品のプレゼントではなく研究用のコードを提示したつもりなので、ご自身のコードと見比べてどこがどう違っているのか、どの命令が何をしているのか等を研究してみてください。
また、扱っている(扱おうとしている)ものがなんであるかを意識すれば、たとえば↓のようにしても良いことがわかると思います。
こちらも興味があれば読み解いてみてください。(ほぼ答えを書いておきましたが...)
Sub おまけ() Const path As String = "C:\hoge\" Dim dstRNG As Range
With Workbooks.Open(Filename:=path & "集計表.xlsx").Worksheets("貼付シート") '▼B列最終セルから、下に1、左に-1(右に1)ずれた【セル】を「dstRNG」に格納 Set dstRNG = .Cells(.Rows.Count, "B").End(xlUp).Offset(1, -1) End With
With ThisWorkbook.Worksheets("コピーシート").Range("A1:AH10") '▼「dstRNG」を10行、34列に拡張して、コピーシートのA1:AH10セルの【値】を直接(参照して)入れる dstRNG.Resize(.Rows.Count, .Columns.Count).Value = .Value End With End Sub
(もこな2 ) 2022/03/14(月) 17:21
Const path As String = "C:\hoge\" Dim wbkNew As Workbook Dim rngFrom As Range Dim rngTo As Range
Set wbkNew = Workbooks.Open(Filename:=path & "集計表.xlsx") Set rngFrom = wbkNew.Worksheets("コピーシート").Range("A1:AH10") Set rngTo = ThisWorkbook.Worksheets("貼付シート") _ .Cells(ThisWorkbook.Worksheets("貼付シート").Rows.Count, "B").End(xlUp).Offset(-1, -1)
rngFrom.Copy rngTo.PasteSpecial Paste:=xlPasteValues
wbkNew.Close False End Sub
行番号だけを抜き出して、セルアドレスを示す文字列を無理に作らなくても、
セルそのものを変数に入れるということも覚えると便利です。
Rows.Countも、どのシートの行数を数えてるのか意識する必要があります。
(どのシートの行数も同じだろうけども。。。。バージョンによって違う場合があります。)
(まっつわん) 2022/03/15(火) 08:13
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.