[[20170608003350]] 『別ブックの指定シートにコピー』(bass) ページの最後に飛ぶ

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

 

『別ブックの指定シートにコピー』(bass)

流れ 
コピー元のファイル    C:\data\csv\170122の中のcsvファイル
コピーを貼り付けるブック C:\data\csv\集計ブック.xlm

1・データの入ったブック10枚を開く、
(下のコードをSub ファイルを開く1〜10まで並べて セル位置も併せて
 B1〜B10まで作りました)
 
セル内にコピー元で参照するファイルのパスをB1〜B10まで入力しています。 

2・C:\data\csv\集計ブックのシート1に1に書いたブックのB1セルのファイルを
  コピーして貼り付けます

3・コピー元のブックはC:\data\csv\170122←(最後のフォルダ日付)

4・ ※1で説明したコードは2で書いた集計ブックのシートに作りました。

フォルダの中のファイルを開くところまではできましたが
コピーする所でつまづいてます。

集計ブックでできたファイルを開く部分
Sub ファイルを開く1()

Dim fn As String
fn = Range("B1")

Workbooks.Open Filename:=fn
End Sub

B1の箇所を変更してB2〜B10と続けて並べてます。

Dim fn As String
fn = Range("B10")

Workbooks.Open Filename:=fn
End Sub

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


 シート名が重複しないか懸念ありですが、取りあえず・・・

 Sub Copy10CSV()
     Dim fn As Variant
     Dim csvBook As Workbook

     Application.ScreenUpdating = False

         For Each fn In Range("B1:B10").Value 'csv名を順次取得
             Set csvBook = Workbooks.Open(Filename:=fn)  'csvを開く

             csvBook.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
             csvBook.Close False
         Next
     Application.ScreenUpdating = True

     MsgBox "完了"
 End Sub

(半平太) 2017/06/08(木) 11:29


半平太さんありがとうございます。
私の書き方が不味かったことをあやまります。
標準モジュールに貼り付けて試してみました、コードのとうりファイルが順番に開いて
完了メッセージもでました、最後に開いたファイルが閉じなかったです。

シート名の重複ですがのB1〜B10セルのファイル名は全部違う名前です。
ファイルの最後にEとTつけて重複しないようにしてます。

 セル内の値 
B1 C:\data\csv\170122\大阪部品_14時00分_E.csv
B2 C:\data\csv\170122\大阪部品_14時00分_T.csv
B3 C:\data\csv\170122\東京部品_14時00分_E.csv
B4 C:\data\csv\170122\東京部品_14時00分_T.csv
B5 C:\data\csv\170122\福岡部品_14時00分_E.csv
B6 C:\data\csv\170122\福岡部品_14時00分_T.csv
B7 C:\data\csv\170122\未完部品_14時00分_E.csv
B8 C:\data\csv\170122\未完部品_14時00分_T.csv
B9 地名だけ違うファイル名_14時00分_E.csv
B10 地名だけ違うファイル名_14時00分_T.csv

コピー先の指定シートについて、もっと詳細を書くべきでした、ごめんなさい。
8Eや8Tは集計用の作業シートに参照してる名前のシートです、大阪部品Eなら8Eシートのデータを
大阪部品Tなら8Tシートのデータにあって作業シートの参照に使ってます。

B1のC:\data\csv\170122\大阪部品_14時00分_E.csvcsvは
C:\data\csv\集計ブック.xlmのシート名"8E"にコピー。

B2 C:\data\csv\170122\大阪部品_14時00分_T.csvは
C:\data\csv\集計ブック.xlmのシート名"8T"にコピー。

B3 C:\data\csv\170122\東京部品_14時00分_E.csvは
C:\data\csv\集計ブック.xlmのシート名"9E"にコピー。

B4 C:\data\csv\170122\東京部品_14時00分_T.csvは
C:\data\csv\集計ブック.xlmのシート名"9T"にコピー。

B5 C:\data\csv\170122\福岡部品_14時00分_E.csvは
C:\data\csv\集計ブック.xlmのシート名"10E"にコピー。
B6 C:\data\csv\170122\福岡部品_14時00分_T.csvは
C:\data\csv\集計ブック.xlmのシート名"10T"にコピー。

B7 C:\data\csv\170122\未完部品_14時00分_E.csvは
C:\data\csv\集計ブック.xlmのシート名"11E"にコピー。
B8 C:\data\csv\170122\未完部品_14時00分_T.csvは
C:\data\csv\集計ブック.xlmのシート名"11T"にコピー。

B9 地名だけ違うファイル名_14時00分_E.csv
C:\data\csv\集計ブック.xlmのシート名"12E"にコピー。
B10 地名だけ違うファイル名_14時00分_T.csvは
C:\data\csv\集計ブック.xlmのシート名"12T"にコピー。

最後に開いたCSVがとじる流れになります。

よろしくお願い致します。

(bass) 2017/06/08(木) 14:21


最初に書いたコードですが

開いたシート(コピー元)
Dim fn As String
fn = Range("B1")
Workbooks.Open Filename:=fn
End Sub

指定したブックの指定シート部分に貼り付け後
指定シート1枚相当分書き足して終わらせて、

残り9個ぶんは読み込むセルの値の一部分変更して
指定シート部分を変更して作るつもりでした。

(bass) 2017/06/08(木) 14:44


 >完了メッセージもでました、最後に開いたファイルが閉じなかったです。 

 「完了」が出たなら、開いたCSVは、全て閉じている筈ですけど?

 Sub Copy10CSV()
     Dim fn As Variant, fnLeft As String, fnWithoutEX As String
     Dim csvBook As Workbook
     Dim actWsh As Worksheet
     Dim PathBrDown
     Dim AreaAry, WshtAry
     Dim posInAry
     Dim WsName As String

     AreaAry = Array("大阪", "東京", "福岡", "未完")
     WshtAry = Array(8, 9, 10, 11, 12)

     Application.ScreenUpdating = False

         Set actWsh = ActiveSheet

         For Each fn In Range("B1:B10").Value 'csv名を順次取得
             If fn <> "" Then
                 PathBrDown = Split(fn, "\")
                 fnWithoutEX = Replace(PathBrDown(UBound(PathBrDown)), ".csv", "")
                 fnLeft = Left(fnWithoutEX, 2)  '地域名(2文字)を取得

                 posInAry = Application.Match(fnLeft, AreaAry, 0)
                 If Not IsNumeric(posInAry) Then
                     posInAry = 5
                 End If

                 WsName = WshtAry(posInAry - 1) & Right(fnWithoutEX, 1)

                 Set csvBook = Workbooks.Open(Filename:=fn)  'csvを開く

                 csvBook.Sheets(1).Cells.Copy

                 With ThisWorkbook
                     .Activate
                     With .Sheets(WsName)
                         .Range("A1").PasteSpecial xlPasteAll
                         .Select
                         .Range("A1").Select
                     End With
                 End With

                 Application.DisplayAlerts = False
                     csvBook.Close False
                 Application.DisplayAlerts = True
             End If
         Next
         actWsh.Select
     Application.ScreenUpdating = True

     MsgBox "完了"
 End Sub

(半平太) 2017/06/08(木) 15:53


半平太さん、何度もありがとうございます。

実行時エラー9インデックスが有効範囲にありません

With .Sheets(WsName)
この行で止まります。

ファイル一つ目を開いてコピー用に全選択してる状態で止まってます。

(bass) 2017/06/08(木) 19:47


 >With .Sheets(WsName) 
 >この行で止まります。

 止まった時点で、そのWsNameにマウスと近づけると、WsNameが実際に何と言うシート名なのか分かると思います。
 その名前のシートが集計ブックに存在しないと言うエラーだと思います。

 私の理解では、以下のシート名が存在すると思っているのですが、

  8E   8T   9E   9T   10E  10T  11E  11T  12E  12T
 実在しないのでしょうか?

 それとも、WsNameがそのどれでもない名前になっている、と言うことなんでしょうか?

(半平太) 2017/06/08(木) 20:40


8E 8T 9E 9T 10E 10T 11E 11T 12E 12T
 実在しないのでしょうか?

古い集計ファイルと比較して確認します。
ありがとうございます半平太さん
(bass) 2017/06/08(木) 21:26


 ちょっと、流れが理解できないのですが・・・

 テスト環境にそのシートがあるかどうかは、直ぐ分りませんか?

 >8Eや8Tは集計用の作業シートに参照してる名前のシートです、
 >大阪部品Eなら8Eシートのデータを大阪部品Tなら8Tシートのデータにあって
 >作業シートの参照に使ってます

 それで、もし本番環境にも実在してないなら、作業シートの参照先が無いと言うことなので、
 作業シートの数式が壊れちゃうはず。そんな状態であるハズがないと思っているのですけども。

(半平太) 2017/06/08(木) 23:41


おはようございます。
何故かエラーだったので申し訳ないです。原因となりそうな部分を探しました。
似たシート名が多いこと、またコピー元のファイル名も原因となりそうだったので
画像をつくりました。みてください。

こっちのURLに参考の画像と使用するデータのcsvファイルをいれてます。
参考画像1 (最初にコードを入れて試したブックのシート部分
参考画像2  (テスト用にシートを再現したブック)
参考画像3  (フォルダ内のファイル一覧を置いたシートの画像)
参考画像4  (参考画像3で使った一覧取得のコードの画像
フォルダ(名前170604)
中に参考画像で使ってるデータ入りのCSVファイルです。

もしまだ続けて頂けるのなら使ってください。
https://www.dropbox.com/s/vy0bxdkbzx915ms/%E8%B3%87%E6%96%99.zip?dl=0
(bass) 2017/06/09(金) 04:38


 >似たシート名が多い

 そうなんですか。

 因みに、B列にファイル名が入力されている「シート1」の実際のシート名は何ですか?

 >またコピー元のファイル名も原因となりそうだった

 2回目のコードは、データ部分だけコピーするものなので、
 コピー元のファイル名は何であっても、無害です。

 >画像をつくりました。みてください。 

 申し訳ないですが、ネットからファイルを開くようなことは
 出来るだけ避けております。

(半平太) 2017/06/09(金) 09:56


半平太さん何度もありがとうございます。

>B列にファイル名が入力されている「シート1」の実際のシート名は何ですか?

シート1は「ファイル一覧」です。

最初につかった集計と作業に使ったブックのシート名です
まるで囲んだ数字に変化して「まるでかこんだ8」〜「まるでかこんだ12」や
「まるで囲んだ8E1」〜「まるで囲んだ12E1」や「作業8」〜「作業12」などシートの
名前に同じ数字の重複する箇所を含んでブック内で使ってました。

※まるで囲んだ数字がここのコメント使用で?表記に変わるためまるで囲んだと書いてます。

>またコピー元のファイル名も原因となりそうだった

ファイルの名前 使用CSVファイル
地名漢字2個+アルファベット1個+数字2個(01〜12)+_(アンダーハイフォン)+時刻(00時00分)
+_(アンダーハイフォン)+S.csv
ファイル名に14文字

詳しく違いを書きます。

大阪部品_14時00分_E.csv  →大阪P08_14時00分_E.csv  
大阪部品_14時00分_T.csv  →大阪P08_14時00分_T.csv

大阪部品_14時00分_E.csv  →大阪P09_14時00分_E.csv  
大阪部品_14時00分_T.csv  →大阪P09_14_時00分_T.csv

大阪部品_14時00分_E.csv  →大阪P10_14時00分_E.csv  
大阪部品_14時00分_T.csv  →大阪P10_14_時00分_T.csv

大阪部品_14時00分_E.csv  →大阪P11_14時00分_E.csv  
大阪部品_14時00分_T.csv  →大阪P11_14_時00分_T.csv

大阪部品_14時00分_E.csv  →大阪P12_14時00分_E.csv  
大阪部品_14時00分_T.csv  →大阪P12_14_時00分_T.csv

ファイル名の中にP8〜P12までの数字があったので原因です、ごめんさい。

地名の漢字は全部で10個全部2文字の漢字です。

ファイル一覧でB1セル〜B10セルないの中は順番に並べてます。

大阪P08_14時00分_E.csv  
大阪P08_14時00分_T.csv
大阪P09_14時00分_E.csv  
大阪P09_14時00分_T.csv
大阪P10_14時00分_E.csv  
大阪P10_14時00分_T.csv
大阪P11_14時00分_E.csv  
大阪P11_14時00分_T.csv
大阪P12_14時00分_E.csv  
大阪P12_14時00分_T.csv

こういう形にはなってません。
大阪P08_14時00分_E.csv  
大阪P08_14時00分_T.csv
東京P12_14時00分_E.csv  
東京P12_14時00分_T.csv
大阪P12_14時00分_E.csv  
大阪P12_14時00分_T.csv
東京P11_14時00分_E.csv  
大阪P11_14時00分_T.csv
大阪P09_14時00分_E.csv  
大阪P09_14時00分_T.csv

大阪P08_14時00分_E.csv (末尾EファイルのデータはA1〜G200の範囲です)

大阪P08_14時00分_T.csv (末尾TファイルのデータはA1〜AB50の範囲です)

Excelのバージョン2010を使ってます。

(bass) 2017/06/09(金) 16:49


 >B1 大阪部品_14時00分_E.csvは シート名"(8)E"にコピー ※大阪だから(8)E
 >B3  東京部品_14時00分_E.csvは  シート名"(9)E"にコピー ※東京だから(9)E

 ※○囲み数字は、(カッコ)書きにしてあります。

 上が以前の説明ですよね? 
 修正後はどうなるんですか?(地名は関係なくなるんですか?)

  B1 大阪R08_14時00分_E.csv は シート名"(8)E"にコピー  ?※R08だから(8)E
  B3 東京Z11_14時00分_T.csv は  シート名"(11)T"にコピー ?※Z11だから(11)T

 >こういう形にはなってません。

 10個の地名は、全て同じで、複数の地名が混ざることはないと言う意味ですか?
 いずれにしても、地名は(2文字存在しているだけで)処理に関係ないのですね?

(半平太) 2017/06/09(金) 19:46


> 修正後はどうなるんですか?(地名は関係なくなるんですか?)
>  B1 大阪R08_14時00分_E.csv は シート名"(8)E"にコピー ?※R08だから(8)E
>  B3 東京Z11_14時00分_T.csv は シート名"(11)T"にコピー ?※Z11だから(11)T

  R数字08 + 末尾E なので シート名8Eにコピー
  Z数字11 + 末尾T なので シート名11Tにコピー

そういうことです。

ファイル名の地名の説明(貼り付ける元データに場所データ情報が入っていなので使ってます、OKなんです)

地名の漢字2文字部分が必要な理由は、作業シートで参照して使う時にどこの地域データか不明にしないためです。でもデータ部分に地名の場所データがないので。
ブックに作ったシートは「8E」「9E」「10E」「11E」「12E」と「8T」「9T」「10T」「11T」「12T」 合計10種類
ここに地名で東京のファイルのデータだけ貼り付けて、作業シートから参照して、東京だけのデータにまとめて印刷する流れです、関係あるといえばあります。ファオルダパス一覧表示したセルの順番でこの同じ地名
ファイルだけにできたので
「大阪」や「東京」も他の地名もファイルが混ざらないように、振り分けできるに着けてます。

>10個の地名は、全て同じで、複数の地名が混ざることはないと
 言う意味ですか?

 一つのファイルに、一つの地名をファイルの先頭につけてるだけです。

地名を2つ以上繋げて書いたり「大阪福岡」「新潟東京広島」などと使ってません。

>いずれにしても、地名は(2文字存在しているだけで)処理に関係ないのですね?

ないです。

(bass) 2017/06/09(金) 21:13


まとめました

(1)シート名ファイル一覧 B1からB10のフォルダパスの入ったセル
   ※毎回シート名ファイル一覧のB1〜B10範囲セル内
(2)セルのファイル名

大阪P08_14時00分_E.csv  
大阪P08_14時00分_T.csv
大阪P09_14時00分_E.csv  
大阪P09_14時00分_T.csv
大阪P10_14時00分_E.csv  
大阪P10_14時00分_T.csv
大阪P11_14時00分_E.csv  
大阪P11_14時00分_T.csv
大阪P12_14時00分_E.csv  
大阪P12_14時00分_T.csv
※地名は必ず同じ、P+数字(01〜12まで)時刻部分は変わりますが(1)の最初のセル入力で並べ替え済み
 ファイル末尾のアルファベットは「E」と「T」の2種類
(3)指定シートにコピー

      ブックに有るシート名 「8E」「9E」「10E」「11E」「12E」と「8T」「9T」「10T」「11T」「12T」

8E ファイル名の中にあるP以降の数字08 + 末尾アルファベットEへ
9E ファイル名の中にあるP以降の数字09 + 末尾アルファベットEへ
10E ファイル名の中にあるP以降の数字10 + 末尾アルファベットEへ
11E ファイル名の中にあるP以降の数字11 + 末尾アルファベットEへ
12E ファイル名の中にあるP以降の数字12 + 末尾アルファベットEへ

8T ファイル名の中にあるP以降の数字08 + 末尾アルファベットTへ
9T ファイル名の中にあるP以降の数字09 + 末尾アルファベットTへ
10T ファイル名の中にあるP以降の数字10 + 末尾アルファベットTへ
11T ファイル名の中にあるP以降の数字11 + 末尾アルファベットTへ
12T ファイル名の中にあるP以降の数字12 + 末尾アルファベットTへ

 

(bass) 2017/06/09(金) 21:32


 >ブックに作ったシートは「8E」「9E」「10E」「11E」「12E」と「8T」「9T」「10T」「11T」「12T」 合計10種類 

 そこも分からないです。

 こんな説明がありました。
  ↓
 >地名漢字2個+アルファベット1個+数字2個(01〜12)+_(アンダーハイフォン)+時刻(00時00分) 
 >+_(アンダーハイフォン)+S.csv 

 数字は(01〜12)となっているので、12x2(EとT)で合計24種類じゃないですか?

 「テスト環境では」ですか? (本番は24種類?)

(半平太) 2017/06/09(金) 22:15


半平太さん何度もありがとうございます。
>ブックに作ったシートは「8E」「9E」「10E」「11E」「12E」と「8T」「9T」「10T」「11T」「12T」 合計10種類

>数字は(01〜12)となっているので、12x2(EとT)で合計24種類じゃないですか?
> 「テスト環境では」ですか?

シート10種類です。

数字は08〜12です訂正します。元ファイルでも使ってるのは08〜12です。

(bass) 2017/06/09(金) 23:14


 ○囲み文字が正常に表示されないので、(カッコ書き)にしています。
 その部分は、そちらで書き換えてください。(上から10行目辺りにあります)

 Sub Copy10CSV()
     Dim fn As Variant, fnLeft As String, fnWithoutEX As String
     Dim csvBook As Workbook
     Dim actWsh As Worksheet
     Dim PathBrDown
     Dim WshtAry
     Dim WsName As String
 '         ここ、○囲み文字を(各一文字)入れ替えてください。 ※ダブルクォーテーションは必要
 '                    ↓
     WshtAry = Array("(8)", "(9)", "(10)", "(11)", "(12)")

     Application.ScreenUpdating = False

         Set actWsh = Sheets("ファイル一覧")

         For Each fn In actWsh.Range("B1:B10").Value 'csv名を順次取得

             If fn <> "" Then
                 PathBrDown = Split(fn, "\")
                 fnWithoutEX = Replace(PathBrDown(UBound(PathBrDown)), ".csv", "")
                 fnLeft = Mid(fnWithoutEX, 4, 2) '数字(2文字、4,5桁目)を取得

                 fnLeft = WshtAry(fnLeft - 8)
                 WsName = fnLeft & Right(fnWithoutEX, 1)

                 Set csvBook = Workbooks.Open(Filename:=fn)  'csvを開く

                 csvBook.Sheets(1).Cells.Copy

                 With ThisWorkbook
                     .Activate
                     With .Sheets(WsName)
                         .Range("A1").PasteSpecial xlPasteAll
                         .Select
                         .Range("A1").Select
                     End With
                 End With

                 actWsh.Range("A1").Copy 'クリップボードを軽くする為だけ
                 csvBook.Close False
             End If
         Next

         Application.CutCopyMode = False
         actWsh.Select
     Application.ScreenUpdating = True

     MsgBox "完了"
 End Sub

(半平太) 2017/06/09(金) 23:58


半平太さんありがとうございます、無事完了ウインドウが開いて動きました。
わたしには、内容に理解が追いついてないので勉強しながらどう動いたか(デバッグモードの
黄色い表示を見ながら理解が追いつくように考えてみます、コピー元のファイル名から
コピー先のシート名に正確にデータが収まっているのがやっぱり1番気になりました。
ありがとうございました!

(bass) 2017/06/10(土) 07:18


コメント返信:

[ 一覧(最新更新順) ]


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