題名通りです。
イメージとしては元ブックマクロを起動するとファイル選択ウィンドウが表示され、そこで別ブック、そしてそのシート名を指定。
そしてその別ブックの指定したシート内容をそのまま元ブックのシート2へコピーしたいというものです。
ファイル選択などはApplication.GetOpenFilenameあたりでできるのではないかと思いましたが、シートの全コピー・ペーストのやり方がよくわからず困っております。
どなたか方法などの流れをご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア12705
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総合スコア3013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
イメージとしては元ブックマクロを起動するとファイル選択ウィンドウが表示され、そこで別ブック、そしてそのシート名を指定。
そしてその別ブックの指定したシート内容をそのまま元ブックのシート2へコピーしたいというものです。
よく考えてみてください。
手動でやる手間と全く同じことを、わざわざ、VBAで新たにしようとしています。
それでも、どうしても自分ごのみの表示&選択でやりたいということですか?
ファイル選択などはApplication.GetOpenFilenameあたりでできるのではないかと思いましたが、
GetOpenFilenameメソッドは、ファイルを開くダイアログボックスが表示されますが、実際にはファイル名の取得のみで、実際には開いてくれません。
なので、まず名前を取得して、それから
Wrokbooks.Openメソッドで別途開いてやらなければなりません。
これらの詳しい情報はその命令をネットで検索すれば詳しく解説しているサイトが見つかるはずです。
いつ回答がつくかわからない掲示板で質問するより、
検索が上手になった方が解決が早いと思いますよ。
まぁ、複数ブックをいっぺんに選択して(というかフォルダを選択してその中のExcelファイル全部の)、すべてのシート名を一覧で表示させるのはぼくも作ったことがあります。
マウスのクリック回数を減らすのは意義があると思いますが、
説明を読む限りマクロの必要性を感じません。
投稿2019/01/13 13:21
総合スコア2136
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/11 07:58
2019/01/11 09:00
2019/01/12 10:55