[[20160827111815]] 『フォルダー内にある全てのファイルを検索しコピー』(検索) ページの最後に飛ぶ

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

 

『フォルダー内にある全てのファイルを検索しコピー』(検索)

 初めまして。
 このような事は出来るのでしょうか。
 宜しくお願いいたします。

 エクセルファイル名は”全ビル集計表”です。
 これを開きマクロを実行すると『どのブックを開きますか?』と
 メッセージが出て、指定のブックを選択
 するとその中にある全てのファイルのシート名『工程内訳書』の
 中のデータを全て”全ビル集計表”Sheet1に書き出す。

 全てのファイルのシート名『工程内訳書』の範囲はA1:I52で出来ています。
 ですので、”全ビル集計表”Sheet1の書き出す範囲は
 A1:I52
 A53:I104
 A104:I156
 A157:I208
 A209:I260
 以下省略・・・
 でコピーしたいです。

 また、検索ファイルは全てにシートの保護も掛かっております。(パスワードは無し)
 計算式も入っていますが”全ビル集計表”Sheet1には値のコピーを

 このような操作ですが可能なのでしょうか。
 よろしくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >

 書き込みをして書き込みを削除した人がバージョン情報まで削除していたので復元しました。

 ※11さん、自分の発言はともかく、他人の書き込みを削除するのはやめましょう。
(カリーニン) 2016/08/27(土) 14:10

 >>メッセージが出て、指定のブックを選択
 >>するとその中にある全てのファイルのシート名『工程内訳書』

 ん?

 指定するのはブックですか? であれば、【その中にあるすべてのファイル】とは?
 フォルダを指定したいのではないんですか?

(β) 2016/08/27(土) 14:24


 説明不足ですみません。もう一度書きます。
 マクロを入れるエクセルファイルの名前は”全ビル集計表”です。
 これを開きマクロを実行すると『どのフォルダーを開きますか?』と
 メッセージが出て、指定のフォルダーを選択
 フォルダーの中には複数のファイルがあります。
 するとその中にある全てのファイルのシート名『工程内訳書』の
 中のデータを全て”全ビル集計表”Sheet1に書き出す。

(検索) 2016/08/27(土) 14:55


 よろしくお願いいたします。
(検索) 2016/08/27(土) 14:58

 直接の回答ではありません。

 「フォルダ ブック シート 転記」で校内検索してみました。

http://www.excel.studio-kazu.jp/cgi-bin/estindex/estseek2.cgi?phrase=%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%80%80%E3%83%96%E3%83%83%E3%82%AF%E3%80%80%E3%82%B7%E3%83%BC%E3%83%88%E3%80%80%E8%BB%A2%E8%A8%98&perpage=10&attr=&order=&clip=-1&navi=0
(カリーニン) 2016/08/27(土) 15:04


 「フォルダ 選択」の検索例です。

http://www.excel.studio-kazu.jp/cgi-bin/estindex/estseek2.cgi?phrase=%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80+%E9%81%B8%E6%8A%9E&perpage=10&attr=&order=&clip=-1&navi=0
(カリーニン) 2016/08/27(土) 15:06


参考?内容が近いようで違いますね。。
指定フォルダーの中に複数のBookがあり、そのBookの中の共通シート名が工程内訳書
それをマクロをもって全ビル集計表のsheet1に書き出すという事ですね。
簡単そうで不可能かと思いますよ。
いくつ有るか分かりませんが、一つずつBookを開き工程内訳書のシートをsheet1にコピーしましょう。

(横丁) 2016/08/27(土) 19:33


 カリーニンさん紹介のトピの回答コードを組み合わせれば、自助努力で解決だと思いますが
 これまた参考ということで一例をアップしておきます。(2つのプロシジャを、そのまま標準モジュールに貼り付けてください)

 (横丁さんコメントの【簡単そうで不可能かと思いますよ】という意味がよくわかりませんが)

 Sub Sample()
    Dim shT As Worksheet
    Dim shF As Worksheet
    Dim bkF As Workbook
    Dim fPath As String
    Dim fName As String
    Dim pos As Range

    fPath = GetFolder("どのフォルダーを開きますか?")
    If fPath = "" Then Exit Sub 'キャンセルボタン

    Application.ScreenUpdating = False

    Set shT = ThisWorkbook.Sheets("Sheet1")
    shT.Cells.ClearContents
    Set pos = shT.Range("A1")

    fName = Dir(fPath & "\*.xls*")

    Do While fName <> ""
        If fName <> ThisWorkbook.Name Then
            Set bkF = Workbooks.Open(fPath & "\" & fName)
            Set shF = Nothing
            On Error Resume Next
            Set shF = bkF.Sheets("工程内訳書")
            On Error GoTo 0
            If Not shF Is Nothing Then
                With shF.Range("A1:I52")
                    pos.Resize(.Rows.Count, .Columns.Count).Value = .Value
                    Set pos = pos.Offset(.Rows.Count)
                End With
            End If
            bkF.Close False
        End If
        fName = Dir()
    Loop

 End Sub

 Private Function GetFolder(msg As String) As String
    Dim Shell As Object, myPath As Object
    Dim hWnd As Long
    Dim stPath As Variant

    Const BIF_RETURNNONLYFSDIRS = &H1 'ディレクトリのみ選択可
    Const BIF_EDITBOX = &H10 'Edit_boxを表示

    hWnd = Application.hWnd
    Set Shell = CreateObject("Shell.Application")
    Set myPath = Shell.BrowseForFolder(hWnd, msg, BIF_RETURNNONLYFSDIRS Or BIF_EDITBOX)
    If Not myPath Is Nothing Then GetFolder = myPath.Items.Item.Path
    Set Shell = Nothing
    Set myPath = Nothing

 End Function
(β) 2016/08/27(土) 20:24

 (β)さん ありがとうございます。
 しかし何もコピーされず?またエラーも出ないのです。
 もしかするとフォルダーの中に複数のフォルダーがありそこからもフォルダーになっている関連でしょうか。

 名前は例ですので実際の名前と違いますが構層を書きます。

 デスクトップ上に
 1番フォルダー
   ↓クリック
 2番フォルダー (複数あり)
   ↓クリック
 3番フォルダー
   ↓クリック
   ワークシート (.xlsx)←ここで工程内訳書のシートが出てきます。
 これが原因でしょうか。

(日にち) 2016/08/27(土) 21:09


 例が分かりずらいかと思い補足します。

 フォルダー参照で選択した全ての中に含まれる(段階構層があっても)
 工程内訳書のワークシートを見付け出しデータを全て”全ビル集計表”Sheet1に書き出す。
 という事なのですが。
 よろしくお願い致します。
(日にち) 2016/08/27(土) 21:38

 指定フォルダの中のサブフォルダ階層すべてを対象にするということですね。
 そういうことは、ちゃんと最初に説明してください。

 コード書き次第アップします。
 (それを待たずとも、カリーニンさん紹介のトピの回答コードで、要件にマッチしている部分を組み合わせればできるんですが
  少しは参照してみましたか?)

(β) 2016/08/27(土) 21:50


横から失礼します。

>このような事は出来るのでしょうか。
という割に反応が変ですね。
普通は、コードが提示されたら別の反応になるはずなんですけどねえ。

階層構造になっているという説明は最初からきちんとすべきですよ。

ところで、(日にち)さんて(検索)さんとどういう関係?
> 初めまして。
でもなんでもないじゃないですか。

最近、妙なハンドルネームの付け方が流行っているなと思っていました。
質問の要約を書くスタイルですね。

『A4に年月を入力すると工期が出る』(工期)
が始まりですかね。
その後、
『他の入力文字から貼り付け』(貼り付け)
『セルの編集許可範囲』(範囲)
『エクセルファイルの容量』(file)
『一つのセルから結合したセルに貼り付ける』(結合)
『シート変更させない』(変更)
『 Sheet1が空白の場合空白』(空白)
『平成28年○月分を入力すると指定月の日にちを出す』(日にち)
と来たわけだけど、どうも同一人物のようですね。

同じHNを使ってくださいな。
そして、初めましてなどと虚偽の発言はされないほうがよい。

なお、すべて別人ですなどと主張されないほうがいいです。
というのは、管理者さんが調べればすぐわかることなので。

(γ) 2016/08/27(土) 21:54


 すみません。
 ニックネームは質問毎に変えないといけないかと思っておりました。
 言い訳みたいですが。
 以後は統一して質問させていただきます。
 本当に申し訳ございません。
 以後のニックネームは現在の"日にち"でお願いしたいと思います。

(日にち) 2016/08/27(土) 22:07


 質問ごとにHN変えるのが最近流行なのかな?

[[20160821094620]] 『決まった曜日の数値を入力』(ちゃた)
(カエムワセト) 2016/08/27(土) 22:21


ニックネームは発言者名です。
質問毎に変える必然性は無いです。

質問をたくさんして頂いても、別に問題はないです。
でも、
『エクセルファイルの容量』(file)
などで回答があったのですから、放置しないでいただきたい。
今回の質問と極めて共通する部分が大きいです。
放置しても、HNが違うから平気でいられるわけですよね。
今後、注意してくださいな。

(γ) 2016/08/27(土) 22:22


 HNの件は、皆さんの指摘を真摯に受け止め、今後、注意願います。

 コードすべて入れ替えてください。

 Sub Sample2()
    Dim shT As Worksheet
    Dim shF As Worksheet
    Dim bkF As Workbook
    Dim fPath As String
    Dim fName As Variant
    Dim pos As Range
    Dim fList As Variant

    fPath = GetFolder("どのフォルダーを開きますか?")
    If fPath = "" Then Exit Sub 'キャンセルボタン

    Application.ScreenUpdating = False

    Set shT = ThisWorkbook.Sheets("Sheet1")
    shT.Cells.ClearContents
    Set pos = shT.Range("A1")

    fList = GetFiles(fPath)

    For Each fName In fList
        If fName <> ThisWorkbook.FullName Then
            Set bkF = Workbooks.Open(fName)
            Set shF = Nothing
            On Error Resume Next
            Set shF = bkF.Sheets("工程内訳書")
            On Error GoTo 0
            If Not shF Is Nothing Then
                With shF.Range("A1:I52")
                    pos.Resize(.Rows.Count, .Columns.Count).Value = .Value
                    Set pos = pos.Offset(.Rows.Count)
                End With
            End If
            bkF.Close False
        End If
    Next

 End Sub

 Private Function GetFolder(msg As String) As String
    Dim Shell As Object, myPath As Object
    Dim hWnd As Long
    Dim stPath As Variant

    Const BIF_RETURNNONLYFSDIRS = &H1 'ディレクトリのみ選択可
    Const BIF_EDITBOX = &H10 'Edit_boxを表示

    hWnd = Application.hWnd
    Set Shell = CreateObject("Shell.Application")
    Set myPath = Shell.BrowseForFolder(hWnd, msg, BIF_RETURNNONLYFSDIRS Or BIF_EDITBOX)
    If Not myPath Is Nothing Then GetFolder = myPath.Items.Item.Path
    Set Shell = Nothing
    Set myPath = Nothing

 End Function

 Private Function GetFiles(fPath) As Variant

    Dim objWshShell     As Object
    Dim strTargetPath   As String       '対象フォルダパス
    Dim strRedirectPath As String       '一時ファイルパス
    Dim rtn       As Long
    Dim varFileList     As Variant
    Dim myTime As Double
    Dim fNo As Integer
    Dim buf() As Byte

    strTargetPath = fPath & "\"

    strRedirectPath = Environ$("Temp") & "\Dir.tmp"
    Set objWshShell = CreateObject("Wscript.Shell")

    rtn = objWshShell.Run("CMD /C DIR """ & strTargetPath & "*.xls*" _
        & """ /A-D /B /S > """ & strRedirectPath & """", 7, True)

    Set objWshShell = Nothing

    fNo = FreeFile()
    Open strRedirectPath For Binary As fNo
    ReDim buf(1 To LOF(fNo))
    Get #fNo, , buf
    Close #fNo

    varFileList = Split(StrConv(buf, vbUnicode), vbCrLf)
    Kill strRedirectPath
    ReDim Preserve varFileList(LBound(varFileList) To UBound(varFileList) - 1)

    GetFiles = varFileList

 End Function

(β) 2016/08/27(土) 22:26


 HNnoの件は謙虚に受け止めます。申し訳ございません。

 実際に試してエラーはでませんが工程内訳書のA1:I52の範囲が
 全ビル集計表”Sheet1の以下の範囲に
 コピーされないのと途中文字等の抜けも出てしまいます。

 工程内訳書のワークシート (.xlsx)が5個あった場合
 全ビル集計表”Sheet1に書き出す範囲の例です。
  ↓
 A1:I52    ←1個目の工程内訳書のA1:I52をここへ
 A53:I104  ←2個目の工程内訳書のA1:I52をここへ
 A104:I156  ←3個目の工程内訳書のA1:I52をここへ
 A157:I208  ←4個目の工程内訳書のA1:I52をここへ
 A209:I260   ←5個目の工程内訳書のA1:I52をここへ

 また、実行してみて分かったのですが工程内訳書のシート内に他の
 このブックには他のデータソースへのリンクが含まれています。
 と表示され更新か更新しないかが出ますが更新を押しました。
 テストは工程内訳書のワークシート (.xlsx)5個が入っていたため
 5回更新を押して行いました。
 何度も申し訳ございませんがよろしくお願い致します。

(日にち) 2016/08/27(土) 23:14


 転記される、されないという件については、こちらでは問題なく、要求された場所に転記されています。

 >するとその中にある全てのファイルのシート名『工程内訳書』の

 こういうことですから、なんというブック名かはわかりませんけど、とにかくフォルダ内のエクセルブックの
 "工程内訳書" という名前のシートを対象にしています。
 フォルダ内のエクセルブックであっても "工程内訳書" という名前のシートがなければ、それは転記対象にはなりません。

 確かに "工程内訳書" という名前のシートがあるのに、転記されないということですか?

 >途中文字等の抜けも出てしまいます。

 まったく理由がわかりません。コードでは、指定された領域に指定されたサイズの転記を行っています。
 文字の抜け というのは、具体的にはどんな状態なんですか?

 次に、データソースへのリンクの件、これはマクロとは関係のない話です。
 たとえば、どのブックでもいいですが手動で開いてみてください。
 メッセージがでるのでしょうね。外部リンク式がかかれているのではないですか?

 もし、外部リンク式があるけれど、メッセージを出さないで処理したいということなら、そういうことを
 ちゃんと説明してください。

(β) 2016/08/27(土) 23:52


 ありがとうございます。
 確かに "工程内訳書" という名前のシートがあるのに、転記されないということですか?
 はい。5個テスト用で工程内訳書を作り実行しました。
 結果はA1:I52までの範囲は5個の内1個の中のデータを確実に転記出来ていますが
 他はほとんどが転記されていませんという結果です。
 しかし、(β)さんのテストでは問題なく要求された場所に転記が出来ているとなれば
私の 工程内訳書の中のデータに問題があるのかもしれません。
 気になる事は、数箇所セルの結合で入力されている部分がある事くらいで・・・
 全ビル集計表”Sheet1も工程内訳書の同じセルの結合にしています。
 明日また実行テストをしてみます。

 リンクの件ですが外部リンクがあるみたいですのでメッセージを出さずに処理したいです。
(日にち) 2016/08/28(日) 00:30

 まず、(横丁) 2016/08/27(土) 19:33 でコメントがあったような手作業による確認もしてください。

 A.xlsx 、B.xlsx、C.xlsx、D.xlsx、E.xlsx があったとします。

 A.xlsxを開きます。リンク云々がでるのでしょうから、更新します。で、工程内訳書シートのA1:I52を選択して Ctrl/c。
 全ビル集計表.xlsmのSheet1のA1を選択して形式を選択して値貼り付け。

 B.xlsxについても、同様で A53 に値貼り付け、C.xlsxについても・・・・

 という操作を、テスト的に作成した5つのブックに対して実行して、その結果がどうなるかを確認して下さい。

(β) 2016/08/28(日) 08:37


横から失礼します。
 
すでにご指摘いただいているとおり、よく検証をしていただきたいと思います。
ステップ実行(F8)をしてください。
 
1.シート名が確実に"工程内訳書"となっていますか?
 よくあるのは、前後に半角スペースが入っていました、というケースです。
 
2.結合セルの関連では、現在のコードでは、値を書き出していますので、
 転記先のシートが予め結合されていなければ、結合状態にはなりません。
 それが、「途中文字等の抜けも出てしまいます」と見えるのではないですか?
 結合セル以外に、ランダムに文字が抜けるということはありえません。
 
 
# なお、貴方が建てられた既存のスレッドで、
# 回答があるのにそのままになっているものは、
# きちんと手当したほうがよろしいかと思います。

(γ) 2016/08/28(日) 09:40


(γ)(β)さんありがとうございました。
 申し訳ございません。
 私のミスでした。全ビル集計表のSheet1で結合セルがおかしい部分があり
 修正しましたら完璧にできました。
 また、手作業による確認もしては問題はありませんでした。
 その他のテストで5個のbookを作成(範囲内に番号1〜468 469〜936 937〜1404 1405〜1872 1873〜2340)
 のセル全てに番号を入力し、全ビル集計表のSheet1でマクロを実行。
 結果1〜2340全ての書き込み大丈夫でした。

 後は、外部リンクの更新画面が毎回表示があり更新でマクロを実行しており
 ますが、外部リンク式があるけれど、メッセージを出さないで処理したいのですが。
 よろしくお願い致します。
(日にち) 2016/08/28(日) 10:01

 Set bkF = Workbooks.Open(fName)

 これを

 ・もし、最新の状態で(更新をして)取り込みたいなら

  Set bkF = Workbooks.Open(fName,True)

 ・もし、更新せず、現時点のエクセルブックの値を取り込みたいなら

  Set bkF = Workbooks.Open(fName,False)

 これで試してください。

(β) 2016/08/28(日) 10:13


 (β)さん早速ありがとうございます。
 ・もし、最新の状態で(更新をして)取り込みたいなら
 Set bkF = Workbooks.Open(fName,True)
 今回はこちらを変更し更新画面が出ずに出来ました。

 一つお聞きしたいのですが、全ビル集計表”Sheet1に転記される
 順番には決まりがあるのでしょうか。

(日にち) 2016/08/28(日) 15:42


 フォルダにせよファイルにせよ、名前順になっているかと思います。
 これを、特定の順番で処理したい場合は、取り込み対象のブックフルパス(Sample2 では fList という名前の配列に入っています)を
 取り込み前に、必要な順番になるように並び替えを行うということになりますね。

(β) 2016/08/28(日) 16:50


 ありがとうございます。
 名前の順番ですね。分かりました。

 特定の順番で処理の場合この辺を変えると変更できるという事ですね。
 Dim fList As Variant

 fList = GetFiles(fPath)

    For Each fName In fList
 もし変更の場合質問させていただきますので
 その時はよろしくお願い致します。
 お世話になりました。
(日にち) 2016/08/28(日) 17:30

コメント返信:

[ 一覧(最新更新順) ]


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