[[20220314133153]] 『別ブックの最終行に貼り付けをしたい』(ぺんぎん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『別ブックの最終行に貼り付けをしたい』(ぺんぎん)

マクロ初心者です。
別のブックの可変的な最終行の次の行に、データを貼り付けしたいです。
下記の「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
↓はもういいのですか?(理解できたのですか?)
[[20220304163933]] 『マクロを使用して名前が固定でないエクセルからVLOOCKしたい』(ぺんぎん)

複数のトピックを同時進行すると、かえって理解しづらくなることもあるとおもいますので、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


あ!!!色々いじくりまわしていて、データ型の修正忘れていました。
Jimi-hen様、ありがとうございました。

もこな2様、宣言を直すを使わせていただき、無事解決しました。
開いているエクセルを・・・というのがミソ?なんですかね。
勉強になりました!
そしてもっと勉強します・・・。
ありがとうございました。

ちなみに、[20220304163933]のぺんぎんさんとは別人になります。
紛らわしくてスイマセン。
(ぺんぎん) 2022/03/14(月) 14:56


■3
>ちなみに、[20220304163933]のぺんぎんさんとは別人になります
そうでしたか失礼しました。

■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


もなこ2様、重ねてありがとうございます。
データの型をLongにしてみたのですが、やはりなぜかエラーとなってしまい、困っておりました。
似たようなコードをいくつか作らなくてはならず、宣言を直すの方法をアレンジし、クリアできるものがありました。
何がエラーだったのか、単純ミスなのか…もう一度研究してみます。
■5もありがとうございました。
勉強させていただきます。
(ぺんぎん) 2022/03/14(月) 23:38

Sub 集計表に貼り付け_改2()
    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.