質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3800閲覧

元ブックへ他ブックから指定したシートをそっくりそのままコピーしたい

k207067

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/11 06:26

題名通りです。

イメージとしては元ブックマクロを起動するとファイル選択ウィンドウが表示され、そこで別ブック、そしてそのシート名を指定。
そしてその別ブックの指定したシート内容をそのまま元ブックのシート2へコピーしたいというものです。

ファイル選択などはApplication.GetOpenFilenameあたりでできるのではないかと思いましたが、シートの全コピー・ペーストのやり方がよくわからず困っております。
どなたか方法などの流れをご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問の内容を

シートの全コピー・ペーストのやり方

だと理解しています。
コメントなさったエラーはどちらかブックが開けてないということだろうと思います。
こう書き下して、ブレークポイントを置いていけば、どっちが開けてないか分かるはずです。

VBA

1Sub CopyTo() 2 Dim src As Worksheet 3 Set src = Workbooks("Book2.xlsx").Worksheets("Sheet1") 4 Dim dst As Worksheet 5 Set dst = Workbooks("Book1.xlsm").Worksheets("Sheet1") 6 src.Copy After:=dst 7End Sub

とりあえずは、手動で、二つのファイルを開いてコピーできることをご確認ください。

ファイルダイアログからブックを開くことができないというのは、質問の粒度として、別の(前段階の)質問です。
仮に全部が聞きたいなら、コピーのしかたではなく開いてコピーする方法、という質問にしてください。
概略としてはこういう感じだと思います。

VBA

1OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 2If OpenFileName <> "False" Then 3 Set wb = Workbooks.Open OpenFileName 4EndIf 5Set src = wb.Worksheets("Sheet1")

投稿2019/01/11 06:40

編集2019/01/11 08:59
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k207067

2019/01/11 07:58

FileName = Application.GetOpenFilename( _ filefilter:="Excelファイル,*.xls*", _ MultiSelect:=True) Workbooks("FileName").Worksheets("コピー元シート").Copy After:=Workbooks("別データ.xlsm").Worksheets("Sheet3") のような感じでやってみたのですが、やはりパスだけではインデックスエラーになりますよね・・・
papinianus

2019/01/11 09:00

「やはりパスだけでは」:おっしゃる意図が分かりません 「インデックスエラー」:開いてないですからね、多分。開いてください。
shinobu_osaka

2019/01/12 10:55

なぜこの程度の質問が解決済みになってないのかと思って見に来たら何言ってるのかわからなかった…。 そして Workbooks("FileName") のダブルクウォートいらないでしょ…。 ブレークポイントの使い方覚えて少しづつ動かしながらちゃんと動いてるか確認してどこでコケてるのか調べるべきかと。
guest

0

ベストアンサー

やりたいことは
>元ブックマクロを起動するとファイル選択ウィンドウが表示され
>別ブック、そしてそのシート名を指定
>指定したシート内容をそのまま元ブックのシート2へコピー
ですよね。

つまり、
・対象ファイルの選択
・対象シートの選択
・選択したシートのコピー
の3つの作業を行いたいのだと思います。

この作るべきものをぼやけたイメージのまま進めてしまうと、
>ファイル選択「など」はApplication.GetOpenFilename「あたりで
といった具合に作るべきものもぼやけたイメージになってしまいます。

さしあたり、現時点の質問内容にはシート選択の方法について具体的な内容が見当たりません。
シートはどのように選択させる想定でしょうか?
(ユーザーフォームにリストボックスを配置し、シート名を一覧表示させたうえでダブルクリックで選択させる、等)

ここらへんはモノ作りを始める前にしっかりイメージしておきましょう。
それによって処理の実装方法などもかわってきます。

以下、papiniausさんへのコメントで記載されたコードを元にしたアドバイスです。

①対象ファイルの選択

まず
Workbooks("FileName").Worksheets("コピー元シート").Copy After:=Workbooks("別データ.xlsm").Worksheets("Sheet3")
の部分ですが、shinobu_osakaさんからも指摘がある通りWorkbooks("FileName")では"FileName"という名前のブックを探してしまいます。

しかもそのファイル名はファイル選択ダイアログで指定しただけの段階で、まだ開かれてもいません。
Workbooks(ファイル名)では開いているブックから対象ブックを探しますので、その前にOpenしてあげる必要があります。

加えてもう1点、
FileName = Application.GetOpenFilename(filefilter:="Excelファイル,*.xls*", MultiSelect:=True)
の部分ですが、ファイル選択ダイアログを表示する際に敢えて複数ファイル選択できるように指定しています。

この場合、変数FileNameには選択した1つまたは複数のファイル名が文字列配列として格納されます。
ファイル名を取り出す際にはFileName(0)のように添え字が必要になりますし、複数指定されても次の対象シート選択でどのように選択させるのか困ってしまいそうです。
ここでは単一ファイル選択(MultiSelect:=False)を指定したほうがよいのではないでしょうか。

'①-1:ファイルの選択 Dim FileName As String FileName = Application.GetOpenFilename(filefilter:="Excelファイル,*.xls*", MultiSelect:=False) '①-2:対象ブックを開く Dim wb As Workbook Set wb = Workbooks.Open(FileName)

・ファイルは単一選択
・次の段階で「ブックに含まれるシート名の一覧」必要になるので、ここでブックをオープンしておく。

②対象シートの選択

①でオープンしたブックからシート一覧を取得します。
これはWorkBook.WorkSheetsに格納されているすべてのシートをループ処理して、シート名を取得していけばいいと思います。

取得したシート名をどのように選択させるかは前述のとおり不明なのですが、例えばリストボックスを配置したユーザーフォームを用意しそこに一覧表示する場合、以下のようなコードで実現できます。

'②-1:シート名一覧の取得 Dim sh As Worksheet '全てのシートをループ処理 For Each sh In wb.Worksheets 'シート名をリストに追加 UserForm1.Listbox1.AddItem sh.Name Next

③選択したシートのコピー

ここまでくれば、シートのコピーは既存のコードを少し変更するだけで実現できると思います。
wb.Worksheets(UserForm1.Listbox1.Value).Copy After:=Workbooks("別データ.xlsm").Worksheets("Sheet3")

開いたブックから選択したシート名を指定してコピーしています。

まとめると

個々の処理については以上です。

説明の中で、シート選択方法の例としてユーザーフォームを用意する方法をご紹介しました。
このやり方だと、メインマクロ側で開いた対象ブックの上方やフォーム側で選択したシート名などの情報を、メインマクロとフォームマクロの間でお互いに受け渡してあげなければならなくなります。

こういったやりとりが面倒であれば、①からのすべての処理をフォーム側のマクロとして実装してしまう方が楽かもしれません。

UserForm1

1Private wb As Workbook 2Private FileName As String 3 4'フォーム起動時 5Private Sub UserForm_Initialize() 6 '①-1:ファイルの選択 7 FileName = Application.GetOpenFilename(filefilter:="Excelファイル,*.xls*", MultiSelect:=False) 8 9 '①-2:対象ブックを開く 10 Set wb = Workbooks.Open(FileName) 11 12 '②-1:シート名一覧の取得 13 Dim sh As Worksheet 14 '全てのシートをループ処理 15 For Each sh In wb.Worksheets 16 'シート名をリストボックスに追加 17 ListBox1.AddItem sh.Name 18 Next 19 20End Sub 21 22'リストダブルクリック時 23Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 24 '選択したシートをコピーする 25 wb.Worksheets(UserForm1.ListBox1.Value).Copy After:=ThisWorkbook.Worksheets("Sheet2") 26 27 '対象ブックを閉じる 28 wb.Close 29 Set wb = Nothing 30 31 'フォームを閉じる 32 Unload Me 33End Sub

以上、長くなりましたが参考になれば幸いです。

投稿2019/01/15 08:53

編集2019/01/15 08:56
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k207067

2019/01/18 08:08

分かりやすい説明ありがとうございます。 サンプルを参考にもう一度流れを理解してみようと思います。
guest

0

イメージとしては元ブックマクロを起動するとファイル選択ウィンドウが表示され、そこで別ブック、そしてそのシート名を指定。
そしてその別ブックの指定したシート内容をそのまま元ブックのシート2へコピーしたいというものです。

よく考えてみてください。
手動でやる手間と全く同じことを、わざわざ、VBAで新たにしようとしています。
それでも、どうしても自分ごのみの表示&選択でやりたいということですか?

ファイル選択などはApplication.GetOpenFilenameあたりでできるのではないかと思いましたが、

GetOpenFilenameメソッドは、ファイルを開くダイアログボックスが表示されますが、実際にはファイル名の取得のみで、実際には開いてくれません。
なので、まず名前を取得して、それから
Wrokbooks.Openメソッドで別途開いてやらなければなりません。

これらの詳しい情報はその命令をネットで検索すれば詳しく解説しているサイトが見つかるはずです。
いつ回答がつくかわからない掲示板で質問するより、
検索が上手になった方が解決が早いと思いますよ。

まぁ、複数ブックをいっぺんに選択して(というかフォルダを選択してその中のExcelファイル全部の)、すべてのシート名を一覧で表示させるのはぼくも作ったことがあります。
マウスのクリック回数を減らすのは意義があると思いますが、
説明を読む限りマクロの必要性を感じません。

投稿2019/01/13 13:21

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問