[[20200427085626]] 『フォルダ内のエクセルの複数セルを別の一つのエク』(みかん) ページの最後に飛ぶ

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

 

『フォルダ内のエクセルの複数セルを別の一つのエクセル内にまとめたい』(みかん)

1・とあるフォルダの中にいくつかのAエクセルがある。
(Aエクセルは、一つのフォルダ内にいくつかありファイル名もバラバラ)

2・このAエクセル内にある複数セルを別フォルダにあるBエクセルのセルにコピー。
(複数のAエクセルのセル内容を一つのBエクセルに上から順にリスト化していくイメージ。)

3・同時にAエクセルと同じ数だけCエクセルにコピー
(Aエクセルひとつずつにつき、Cエクセルも同様にひとつずつ必要。フォーマットになっているCエクセル様式の空欄をAエクセルからコピーして埋めていきたいイメージ。)

上記のような処理を行いたいのですが、どのように書けばよいのでしょうか。
最終的に1→2のパターンと、1→3のパターンが出来れば、処理するベースのエクセルが二つになったりしても構いませんが、一括で出来ると嬉しいです。

以上、難しい内容だと思うのですが、何卒アドバイス等頂けると助かります。
よろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


エクセル=ブックと解釈して、Bブックにマクロを書くならこんな感じでは?

 まくろスタート
   [とあるフォルダ]を巡回
      もしも、Excelブックだったら開く[Aブック]
         [Bブック]の出力シートの最終行の1行下に、開いたブックを書き込み
         [Cブック]を開いて該当シートに書き込む
         [Cブック]を"別名で"保存して閉じる
         [Aブック]を"保存せずに"閉じる
      もしもの話ここまで
   巡回の話ここまで
 まくろ終わり

もし、手を付けているものがあるなら、完成していなくても提示頂くとアドバイスできる部分があるかもしれません。

(もこな2 ) 2020/04/27(月) 09:35


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

・「エクセル=ブックと解釈して」
そのとおり、ブックです。

・「手を付けているものがあるなら」
このマクロの流れをイメージ出来なかったので未だ手を付けていない状況です。
(みかん) 2020/04/27(月) 11:01


Sub OpenFilesInFolder()

    'Aフォルダを巡回
    Dim path, fso, file, files
    path = "D:\D\ドキュメント\A"

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set files = fso.GetFolder(path).files

    'フォルダ内の全ファイルについて処理
    For Each file In files

        'ファイルを開いてブックとして取得
        Dim wb As Workbook
        Set wb = Workbooks.Open(file)

        'Bブックの出力シートの最終行の1行下に、開いたブックを書き込み

        'Cブックを開いて該当シートに書き込む
        'Cブックを"別名で"保存して閉じる

        ' [Aブック]を"保存せずに"閉じる
        Call wb.Close(SaveChanges:=False)

    Next file

End Sub

現況こんな形になりましたが、どうでしょうか。
(みかん) 2020/04/27(月) 17:13


ネットで調べながら作ったのですが、うまく出来ません。
どこがいけないのでしょうか。

    Sub OpenFilesInFolder()

    'Aフォルダを巡回
    Dim path, fso, file, files
    path = "D:\D\ドキュメント\A"

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set files = fso.GetFolder(path).files

    'フォルダ内の全ファイルについて処理
    For Each file In files

        'ファイルを開いてブックとして取得
        Dim wb As Workbook
        Set wb = Workbooks.Open(file)
            With Workbooks.Open(f.path)

        'Bブックの出力シートの最終行の1行下に、開いたブックを書き込み

            Dim staffPP As String: staffPP = .Range("F7").Value '2 部署
            Dim staffName As String: staffName = .Range("C15").Value '3 氏名
            Dim pcid As Long: pcid = .Range("A15").Value '4 機器ID
            Dim inday As Date: inday = .Range("C18").Value '5 in日
            Dim outday As String: outday = .Range("F18").Value '6 out日

            Dim i As Long: i = 15
            Do While .Cells(i, 1).Value <> ""
                wsData.Cells(di, 2).Value = staffPP '2 部署
                wsData.Cells(di, 3).Value = staffName '3 氏名
                wsData.Cells(di, 4).Value = pcid '4 機器ID
                wsData.Cells(di, 5).Value = inday '5 in日
                wsData.Cells(di, 6).Value = outday '6 out日

                i = i + 1: di = di + 1
            Loop
        End With

        'Cブックを開いて該当シートに書き込む

        'Cブックを"別名で"保存して閉じる

        ' [Aブック]を"保存せずに"閉じる
        Call wb.Close(SaveChanges:=False)

    Next file

    End Sub

(みかん) 2020/05/06(水) 20:36


>どこがいけないのでしょうか。

おかしいな?とおもったら、まずはステップ実行をして自己検証してみてください。
それがデバッグ作業というものです。

ちなみに、宣言していない「f」「wsData」をいきなり使ってますが、最低限そこは直さないとダメでしょう。

さらに、↓のようにしていますが足りないものがありませんか?

 With Workbooks.Open(f.path)
   staffPP = .Range("F7").Value

ヒント:セルは何に属してますか?

 ワークブック
   ┗ワークシート
     ┗セル

(もこな2) 2020/05/07(木) 07:59


追加で。

コンパイルエラーにならないことしかチェックしてないですが、そこまで変数てんこ盛りにしなくてもよさそうな気がします。

   Sub さんぷる()
      Const とあるフォルダ As String = "D:\D\ドキュメント\A"
      Dim Aブック As Workbook
      Dim 出力行 As Long
      Dim ファイル As Object

      Stop '←ブレークポイントの代わり

      出力行 = 15

      For Each ファイル In CreateObject("Scripting.FileSystemObject").GetFolder(とあるフォルダ).Files
         If ファイル.Name Like "*.xls?" Then
            Set Aブック = Workbooks.Open(ファイル.Path)

            '▼Bブックに書き込む
            With ThisWorkbook.Worksheets("出力")
               .Cells(出力行, 2).Value = Aブック.Worksheets(1).Range("F7").Value '2 部署
               .Cells(出力行, 3).Value = Aブック.Worksheets(1).Range("C15").Value '3 氏名
               .Cells(出力行, 4).Value = Aブック.Worksheets(1).Range("A15").Value '4 機器ID
               .Cells(出力行, 5).Value = Aブック.Worksheets(1).Range("C18").Value '5 in日
               .Cells(出力行, 6).Value = Aブック.Worksheets(1).Range("F18").Value '6 out日
            End With
            出力行 = 出力行 + 1

            '▼Cブックの処理
            With Workbooks.Open("D:\ほにゃほにゃ\フォーマット.xls")
               'Aブックの内容を書き込む
               .Worksheets(1).Range("F7").Value = Aブック.Worksheets(1).Range("F7").Value '2 部署
               .Worksheets(1).Range("C15").Value = Aブック.Worksheets(1).Range("C15").Value '3 氏名
               .Worksheets(1).Range("A15").Value = Aブック.Worksheets(1).Range("A15").Value '4 機器ID
               .Worksheets(1).Range("C18").Value = Aブック.Worksheets(1).Range("C18").Value '5 in日
               .Worksheets(1).Range("F18").Value = Aブック.Worksheets(1).Range("F18").Value '6 out日

               '別名で保存して閉じる
               .SaveAs _
                  Filename:="D:\ほにゃほにゃ\" & Format(出力行 - 15, "000")
               .Close
            End With

            'Aブックを保存せずに閉じる
            Aブック.Close False
         End If
      Next ファイル

   End Sub

(もこな2) 2020/05/07(木) 08:31


もこな2様

幾度もの質問に丁寧に回答頂いて大変助かりました。
参考に作成させていただいたところ、予定していた動作をするようになりました。

感謝いたします。
ありがとうございました。

(みかん) 2020/05/10(日) 13:04


コメント返信:

[ 一覧(最新更新順) ]


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