[[20190118191230]] 『開いていないbookから開いていないbookへのコピー』(かりん58) ページの最後に飛ぶ

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

 

『開いていないbookから開いていないbookへのコピー&ペースト』(かりん58)

こんばんわ。VBA超初心者です。教えてください。お願いします。

コピー元のファイルを開いて、シート全体をコピーし、コピー先のファイルを開いて、指定したシートのA1セルに全て貼り付けるVBAを作っています。(同じ状態にする)
簡単な書き方だと以下の通りとなりました。コピー元を開いて、コピー先に貼り付け、コピー元のみは閉じる流れです。
1つ目のコピー元は動きました。そこで何点か教えてください。

Sub Sample1()
'1つ目のコピー元
Workbooks.Open "コピー元ファイルをフルパスで"
Workbooks("コピー元ファイル名").Worksheets("シート名").Range("A1:AZ45000").Copy
Workbooks.Open "コピー先ファイルをフルパスで"
Workbooks.Open "C:\Users\k-takada\Documents\TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx"
Workbooks("月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx").Worksheets("ディスクIO_貼り付け先").Range("A1:AZ45000").PasteSpecial
Application.DisplayAlerts = False
Workbooks("コピー元ファイル").Close
Application.DisplayAlerts = True

'2つ目のコピー元
Workbooks.Open "コピー元ファイルをフルパスで"
Workbooks("コピー元ファイル名").Worksheets("シート名").Range("A1:AZ45000").Copy
★Workbooks.Open "C:\Users\k-takada\Documents\TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx"
Workbooks("月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx").Worksheets("ディスクIO_貼り付け先").Range("A1:AZ45000").PasteSpecial
Application.DisplayAlerts = False
Workbooks("コピー元ファイル").Close
Application.DisplayAlerts = True
End Sub

1.範囲をRangeで指定していますが(それしかわからず・・・)、シート全体をコピーして、コピー先にも同じように貼り付ける書き方を教えてください。
2.2つ目のコピー実行時、★のところで『指定したディメンションは、このグラフの種類では無効です。』とエラーになります。
確かにデータを貼り付けると別シートでグラフが作成されるコピー先ですが、原因わかりますでしょうか。対処法教えてください。
3.コピー元は5ファイルでコピー先ファイルは1つで5シートにはりつけるようにしたいと考えています。
この書き方は2ファイルように書いてますが、もっとスマートな書き方はあれば教えてください。

よろしくお願いします<(_ _)>

< 使用 Excel:Excel2013、使用 OS:Windows7 >


とりあえず、2だけ

私もわからなかったのでグーグル先生に聞いたら
https://yaplog.jp/purplish-blog/archive/1838
↑がヒットしました。

そこには、「保存しようとしたパスが存在しなかった。」
とあります。

そして、提示されている一つ目と二つ目のフルパスが全く一緒ですけど間違いないですか?

 "C:\Users\k-takada\Documents\TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx" 
 "C:\Users\k-takada\Documents\TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx" 

これが間違いないということであれば、一つ目では問題がないのに、二つ目でエラーが出る理由は私にはわからないです。

(もこな2) 2019/01/18(金) 21:04


↑のつづき、

失礼しました。上記は出力先だから一緒なんですね。
そうなると、開いてるブックを開こうしてエラーになったとかではないですかね。

とりあえず、そちらは置いておいて、インデントがついてない & もろもろで見づらかったのでチョイ修正しました。

    Sub Sample1改()
        Dim MyPath As String
        Dim dstWB As Worksheet

        MyPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\"

        '出力先のブックを開いて変数にセット
        Set dstWB = Workbooks.Open(MyPath & "TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx")

        '1つ目のコピー元
        With Workbooks.Open("コピー元ファイルをフルパスで")
            .Worksheets("シート名").UsedRange.Copy dstWB.Worksheets("ディスクIO_貼り付け先").Range("A1")
            .Close
        End With

        '2つ目のコピー元(ただし、このままだと1つ目をコピーしたところにそのまま貼り付けて上書きになってしまう)
        With Workbooks.Open("コピー元ファイルをフルパスで")
            .Worksheets("シート名").UsedRange.Copy dstWB.Worksheets("ディスクIO_貼り付け先").Range("A1")
            .Close
        End With

    End Sub

とりあえず、こんな感じで整理・確認してみてはどうでしょうか。

(もこな2) 2019/01/18(金) 21:36


もこな2さん

返信ありがとうございます!
すいません。書き方が中途半端で。。。
★の箇所、以下認識であってますか?

 MyPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\"  ★←ファイルはマイドキュメントにあるので、そのまま
        '出力先のブックを開いて変数にセット
        Set dstWB = Workbooks.Open(MyPath & "★コピー先をフルパスで")
        '1つ目のコピー元
        With Workbooks.Open("★コピー元ファイルをフルパスで")
            .Worksheets("★コピー元シート名").UsedRange.Copy dstWB.Worksheets("★コピー先シート名").Range("A1★←このままでシート内全て選択される")
            .Close
        End With
        '2つ目のコピー元(ただし、このままだと1つ目をコピーしたところにそのまま貼り付けて上書きになってしまう)
        With Workbooks.Open("コピー元ファイルをフルパスで")
            .Worksheets("★コピー元シート名").UsedRange.Copy dstWB.Worksheets("★コピー先シート名").Range("A1★コピー先シート名")
            .Close
        End With

リンクのパスは私も見たのですが、結局対処法わからず、、、
もう少し調べてみます!
(かりn58) 2019/01/18(金) 23:44


回答が中途半端だったので自己削除

(もこな2) 2019/01/19(土) 09:05


確認されたいことがよくわからないですけど、とりあえず。

【気になる箇所1つめ】

 MyPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\
 '出力先のブックを開いて変数にセット
 Set dstWB = Workbooks.Open(MyPath & "★コピー先をフルパスで")

もともと、マイドキュメントのパスをそのまま投稿されていたので、ユーザー名とかモロバレになっても大丈夫かな〜とおもったので、先にマイドキュメントのパスを取得しておくように変えました。
なので、その必要がないのであれば、1行目は要らない部分ですし、なにより2行目で [マイドキュメント\]にフルパス結合しちゃたら意味が通じなくなるのはわかりますよね?

【気になる箇所2つめ】
これは私の説明不足だったかもですが、例えば「SHeet1」シートの全セルを選択するには
 Worksheets("Sheet1").Cells.Select
でよいです。これを選択ではなくコピーするなら
 Worksheets("Sheet1").Cells.Copy
ですね。ただ、全セル必要かということは考えたほうがよいです。
大抵の場合、データがないセル≒使ってないセル だとおもいますので,「UsedRange」や「SpecialCells(xlCellTypeLastCell)」などを使って、コピーする範囲を限定されたほうがいいんじゃないかとおもいます。

    Sub テスト壱()
        With Worksheets.Add
            .Range("B3").Value = "aaaa"
            .Range("D5").Value = "cccc"

            Debug.Print .UsedRange.Address(0, 0)
            Debug.Print .Range("A1", .Cells.SpecialCells(xlCellTypeLastCell)).Address(0, 0)
        End With
    End Sub

【気になる箇所3つめ】
質問をよむと、コピー先のセル範囲を取得することに悩まれているようですけど、例えば手動でSheet1のA1:D5をSheet2のA1:D5にコピーするときってどうしてますか?
Sheet1のA1:D5を選択してコピーのあと、Sheet2のA1:D5を選択して貼付でもよいでしょうけど、大抵の場合、Sheet2のA1という左上の1セルだけ選んだ状態で貼付することありませんか?それでも勝手に拡張して貼付てくれますよね?それはマクロも一緒です。

    Sub テスト弐()

        With Worksheets.Add
            .Name = "貼付先"
        End With

        With Worksheets.Add
            .Name = "複写元"

            .Range("B3").Value = "aaaa"
            .Range("D5").Value = "cccc"

            .UsedRange.Copy Worksheets("貼付先").Range("A1")

        End With
    End Sub

【気になる箇所4つめ】
どのようなデータを貼付したいのかいまいちわかりませんが、セルをコピーしたいのであれば、出力先がA1(を起点とするセル範囲)で固定されていたら、先にコピーしたものの上に貼付しちゃいますよね?

(もこな2) 2019/01/19(土) 11:39


もこな2さん、おはようございます。ご回答ありがとうございます。
1については、概要は理解できました。マイドキュメントのパスを指定する事でその後のファイルの指定は、マイドキュメント以下のパスを入力すれば良いという事ですよね。

2と4についてはシート全体というよりはデータが入っている箇所を選択してコピー、とした方が良いという事で調べてみました。
その前にやりたい事をお伝えします。私が最初に投稿したシート名に誤りがありました。ご指摘の通り、これだと2つ目が上書きになってしまいます。
流れとしては取り込みもとのファイルが5種類程度あり、それを1つの別ブックの各シートへ貼り付けたいのです。そうするとその別ブックの1つのシートに5つのグラフが出来る仕組みになっています。

もこな2さんのを参考にして新たに書いてみたいのが以下です。

Sub Sample1()

       Dim MyPath As String
        Dim dstWB As Worksheet

        MyPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\"

        '出力先のブックを開いて変数にセット
        Set dstWB = Workbooks.Open(MyPath & "TAKU\月次報告グラフ体裁_AIXnmon用_テンプレート.xlsx")

        '1つ目のコピー元
        With Workbooks.Open("フルパス指定")
            .Worksheets("コピー元シート名").UsedRange.Copy
            .Worksheets("コピー先シート名").Range ("A1")
            Application.CutCopyMode = False
            .Close
        End With

    End Sub

ただこれだと『Set dstWB = 』のところで出力先ファイルは開いたのですが、『型が一致しません。』エラーがでてしまいました。。
原因わかりますでしょうか。
(かりん58) 2019/01/21(月) 10:31


 >Dim dstWB As Worksheet
 ここの宣言が、Workbookではなく、Worksheetになっているからではないでしょうか?
(稲葉) 2019/01/21(月) 10:35

書いている間に稲葉さんからフォロー頂いてますが、一応投稿しておきます。

>『型が一致しません。』エラーがでてしまいました
私がミスって間違えていますね。原因はエラーメッセージのとおり型が一致してないからです。
ちょうどいいので課題にしてみます。本当は何という型で宣言すればよかったのか(Object以外で)考えてみてください。
【ヒント】

 Dim dstWB As Worksheet
                  ~~~~~
 Set dstWB = Workbooks.Open
                 ~~~~~

あと、わたしの説明がよくなかったので勘違いされたと思う箇所を修正

 ※1 Copyメソッドと、Paste(PasteSpecial)メソッドを分けて書くならそれぞれにメソッドを付けないとダメです。
 ※2 Copyメソッドの引数として貼付先を与えない場合、確かにCutCopyModeがTrueになりますけど、直後にコピー元のブックを閉じちゃうから解除する必要性は薄いとおもいます。

【※1、※2 を踏まえて修正】

 '1つ目のコピー元
 With Workbooks.Open("フルパス指定")
     .Worksheets("コピー元シート名").UsedRange.Copy
     .Worksheets("コピー先シート名").Range ("A1")
     Application.CutCopyMode = False
     .Close
 End With
                        ↓
 '1つ目のコピー元
 With Workbooks.Open("フルパス指定")
     .Worksheets("コピー元シート名").UsedRange.Copy
     dstWB.Worksheets("コピー先シート名").Paste dstWB.Worksheets("コピー先シート名").Range("A1")
     .Close
 End With

 あるいは

 '1つ目のコピー元
 With Workbooks.Open("フルパス指定")
     .Worksheets("コピー元シート名").UsedRange.Copy
     dstWB.Worksheets("コピー先シート名").Range("A1").PasteSpecia
     .Close
 End With

(もこな2) 2019/01/21(月) 11:41


稲葉さん、ありがとうございます<(_ _)>

>もこな2さん
型が一致しません、のところは『Dim dstWB As Workbook』にして解決できました!
ありがとうございます。
まだまだ勉強不足ですいません。色々と今回は勉強になりました。

ありがとうございました<(_ _)>また何かあればよろしくお願いします。

(かりん58) 2019/01/21(月) 17:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.