dポイントプレゼントキャンペーン実施中!

お世話になっております。

表題の通り、マクロのボタン一発で3個のワークブックから同時に
ワークシートをコピーしたいと思っております。

すいませんが詳しい方、説明の上手な方、直接、コードで説明できる方、
お手数ですが教えて下さい。よろしくお願いします。

具体的には以下のような感じです。
説明が下手ですいませんが、よろしくお願いします。

----------------

注文リストからの受注を3人の作業者で製作しております。
そのため注文リストを3枚プリントして作業者に配布しております。

作業中~完了後に3人の作業者が集まって、
それぞれの注文リストを見せ合い、
作りもれがないかを確認しております。

ですが現場でタブレット端末を利用しているため、
このチェック作業をエクセルのファイルで行おうと思っております。
以下のように考えております。

1)先の説明の通り工場の現場にタブレット端末があり、
WiFiでサーバーとやり取りしております。

2)ワークブックはサーバー上に置きます。

3)作業者が使うワークブック/ワークシートの
名前は以下の通りです。

ワークブック ワークシート 

注文リスト-佐藤 10-24-佐藤
注文リスト-田中 10-24-田中
注文リスト-山本 10-24-山本

4)ワークシートをまとめるワークブックの名前

注文リスト-まとめ-10-24

このワークブックにボタン一発でワークシート
10-24-佐藤、10-24-田中、10-24-山本 をコピーしたいです。

5)前述の通りワークブックはサーバー上にあります。
ですがコードを書く時は便宜上、フォルダー「A」が
「C:」にあるということでお願いします。

ファイルパスは「C:\A」です。
※ファイルパスはこちらで書き換えます。
例)
C:\A\注文リスト-佐藤.xlsm という感じです。

わかると思います

すいませんがよろしくお願いします。

質問者からの補足コメント

  • どう思う?

    3)のワークブックとワークシートの名前がわかりにくいので、
    レイアウト変更して記載しておきます

    ワークブック
    注文リスト-佐藤
    注文リスト-田中
    注文リスト-山本

    ワークシート
    10-24-佐藤
    10-24-田中
    10-24-山本

    です。
    今度はわかると思います。
    すいませんがよろしくお願いします

      補足日時:2016/10/24 18:46
  • HAPPY

    tatsu99さん

    今回はご解答ありがとうございます。
    質問するより頂いたコードをヒントに
    自分で調べたり勉強することにしました。

    今回はすごいコードを書いて頂きありがとうございました。
    機会がありましたらまたお願いします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/10/27 23:19

A 回答 (3件)

以下のマクロを標準モジュールへ登録してください。


-----------------------------------------------------------
Option Explicit
Public Const dirName As String = "d:\goo\excel\goo33"

'3つのワークブックからシートをコピーする
Public Sub CopySheets()
Dim dirName As String
Dim trgbooks As Variant
Dim trgsheets As Variant
Dim i As Long
trgbooks = Array("注文リスト-佐藤.xlsm", "注文リスト-田中.xlsm", "注文リスト-山本.xlsm")
trgsheets = Array("10-24-佐藤", "10-24-田中", "10-24-山本")
For i = 0 To UBound(trgbooks)
'sheetの取り込み
Call GetSheet(trgbooks(i), trgsheets(i))
Next
End Sub
'指定ブックの指定シートを取り込む
Public Sub GetSheet(ByVal bookName As String, ByVal SheetName As String)
Dim fullName As String
Dim myBook As String
Dim mySheet As String
myBook = ThisWorkbook.Name
mySheet = Worksheets(1).Name
If ExistsWorkSheet(SheetName) Then
Application.DisplayAlerts = False 'シート削除時の警告を出さないようにする
Worksheets(SheetName).Delete '既に該当シートがあるなら削除する
Application.DisplayAlerts = True 'シート削除時の警告を出すようにする(元に戻す)
End If
fullName = dirName & "\" & bookName
If Dir(fullName) = "" Then
MsgBox (fullName & "は存在しません")
Exit Sub
End If
Workbooks.Open fullName
Workbooks(bookName).Activate
If ExistsWorkSheet(SheetName) = False Then
MsgBox (bookName & "中に" & SheetName & "は存在しません")
Workbooks(bookName).Close
Exit Sub
End If
Worksheets(SheetName).Copy after:=Workbooks(myBook).Worksheets(mySheet)
Workbooks(bookName).Close
Workbooks(myBook).Activate
MsgBox (bookName & "中の" & SheetName & "をコピー完了")
End Sub
'ワークシートの存在チェック
Public Function ExistsWorkSheet(ByVal SheetName As String) As Boolean
Dim ws As Worksheet
ExistsWorkSheet = False
For Each ws In Worksheets
If ws.Name = SheetName Then
ExistsWorkSheet = True
Exit Function
End If
Next ws
End Function
-----------------------------------------------
マクロ CopySheets を実行するとコピーできます。
使用時の注意事項は以下の通りです。
1.Public Const dirName As String = "d:\goo\excel\goo33"
が、3つのブックの存在するディレクトリです。(C:\Aに相当です)あなたの環境に
あわせてください。ディレクトリの最後に\はつけないでください。

2.注文リスト-まとめ-10-24中に
作業用のシート(sheet1等、名前は任意)を1つ以上、確保しておいてください。
そのシートの右側に、10-24-佐藤、10-24-田中、10-24-山本
をコピーします。
(10-24-佐藤、10-24-田中、10-24-山本だけのブックにしないでください。
作業用のシート(sheet1等)が最低1つないとコピー時エラーが発生します)
この回答への補足あり
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
お礼が遅くなりすいません。

軽くテストしてみましたが、イメージ通りなので
びっくりしました!

エラーメッセージもワークブックが1個だけない場合、etc.にも
対応して頂きありがとうございます。

ベストアンサーですが、
何か聞きたいことあるかもしれませんので、
しばらく質問は閉じないで、今回はお礼のコメントとさせて頂きます。
※ベストアンサーの入力は後日させて頂きます。

複雑なコードを書いて頂き本当にありがとうございます。
機会がありましたら、またよろしくお願い致します。

お礼日時:2016/10/26 17:34

補足要求です。


注文リスト-まとめ-10-24中に取り込みますが、すでに、このブック中に
10-24-佐藤
10-24-田中
10-24-山本
が存在したとき、このシートの取り込みをスキップしますか?
それとも、上書きしますか?(実際は削除してから取り込みます)
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

>補足要求です。
注文リスト-まとめ-10-24中に取り込みますが、すでに、このブック中に
10-24-佐藤
10-24-田中
10-24-山本
が存在したとき、このシートの取り込みをスキップしますか?
それとも、上書きしますか?(実際は削除してから取り込みます)


上書きします。
削除してからの取り込みで問題ありません。

理由は各作業者が使っているシートが
本人にとって最新の作業状況を反映したシート(情報)だからです。

ご想像できると思いますが、
作業完了後に3人のワークシートを照合して、
作り忘れた製品がないか確認するというのが
「~まとめ~」のワークブックの目的です。

なので、
ワークブック /  ワークシート
注文リスト-佐藤 / 10-24-佐藤
注文リスト-田中 / 10-24-田中
注文リスト-山本  / 10-24-山本

の中にある各シートの情報が最新情報です。

ご解答ありがとうございます。
続きがあるようですので、楽しみにしております。

お礼日時:2016/10/25 21:05

なぜそのような面倒な処理を、都度行わなければならないのか。


初めから各Bookのシートを結合したBookを作成しておき、それを参照すればよいと思う。

・・・
ワークシートのコピーのコードが分からないのであれば、
「記録マクロ」を使ってコードの確認をしてみましょう。
(ワークシートのコピー(複製)のやり方は分かりますよね)


・・・余談・・・
全部作ってもらうと、仕様が変更になった時に他人に頼らないとならなくなります。
まったくの第三者に(しかもこのような場所で公に)それを示すことができるのであれば、
まあ問題はないでしょうが、必ず正しい答えが返ってくるとは限りません。

自身で分からない点をピンポイントで質問し、自力で作成するようにしてみよう。
    • good
    • 2
この回答へのお礼

ご解答ありがとうございます。

他の方にも参考になると思うので、
質問に順番に説明していきますね。

>なぜそのような面倒な処理を、都度行わなければならないのか。
初めから各Bookのシートを結合したBookを作成しておき、それを参照すればよいと思う。


消込をする必要があり、それぞれのシート上で、
セルに色を付ける、etc.等
加工する必要があります。

エクセルの場合データベースではないので
1つのワークブックに対して複数のユーザーが
同時にアクセスして書き込みが出来ないからです。
※エクセルのバージョンはEXCEL2010です

>ワークシートのコピーのコードが分からないのであれば、
「記録マクロ」を使ってコードの確認をしてみましょう。
(ワークシートのコピー(複製)のやり方は分かりますよね)


記録マクロは使えません。

「シートをコピー」という表現が悪かったですね。
感覚的にいうと「~まとめ」のワークブックから
3つのワークブックにアクセスしてシートをインポートすると
という感じです。

開いているワークブックの方から閉じている
ワークブックのシートを取りに行くという操作はできませんよね。

もしかしたら根本的に出来ないかもしれないので、
それも含めてこちらで質問しました。

>・・・余談・・・
~~

自身で分からない点をピンポイントで質問し、自力で作成するようにしてみよう。


「3シート同時にコピーしたい(=インポート)」というのが
ピンポイントのテーマです。

ごちゃごちゃ書いてますが、なかなかニュアンスが伝わらないので、
一応、お話風に読んで頂いて、似たようなことでいろいろやってみた
経験のある方に、ご解答頂けたらという感じで
質問させて頂いております。

とりあえず知識だけ、という方のご解答ではしんどいので、
ニュアンスのわかる方むけでお願いしております。

それと当然ですが頂いたコードはこちらでカスタマイズします。
的外れなものでもいいので、とりあえず動作するコードを頂いて、
それをヒントにカスタマイズしたり、作りこんでいけたら、、、
という感じです。

今回はご解答頂きありがとうございます。
以上のような感じですがアドバイスがございましたら、
引き続きよろしくお願い致します。

お礼日時:2016/10/25 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!