[[20220116200137]] 『複数のExcelデータを抽出するVBAコード』(ベル) ページの最後に飛ぶ

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

 

『複数のExcelデータを抽出するVBAコード』(ベル)

複数のExcelデータを抽出するVBAコードの知恵をお借りしたいです。

 条件は下記の通りです。 ・集計元のExcelファイルと集計先のExcelファイルは、フォルダ名「集計フォルダ」に保存している。
 ・「集計フォルダ」に保存したExcel全てを抽出する。

 ・集計元のExcelには複数のシートがあり、シート名「原料配合表」のシート名のデータを抽出。

 ・シート名「原料配合表」のC2セルに記入されている原料名と、B列〜P列の14行〜105行までのデータをそれぞれ抽出。

 ・抽出先のExcelには、A2〜A93まで原料配合表の原料名を入力。B2〜B93には原料配合表のB14〜105のデータを入力。(C列〜P列も同様)

 ・2つ目のExcelデータは、1つ目のデータの続きから、入力。(原料名であれば、A94から)

 この作業を「集計フォルダ」に保存されているファイル数分繰り返したいと考えています。
 色々とWEBの情報を見ているのですが、なかなか上手くいっておりません。
 VBAに詳しい方の知恵を貸していただくよう、お願いいたします。

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


>上手くいっておりません。

完成していなくてもOKです。現状のコードを見せてください。
(作成依頼と小言いわれないためにも)

(マナ) 2022/01/16(日) 20:38


編集がかぶりましたがそのまま。

>色々とWEBの情報を見ているのですが、なかなか上手くいっておりません。
どのように"上手くいかない"のですか?
現状のコードを提示のうえ相談されたほうが良いようにおもいます。

なお、実はまだ構想段階でして・・・・というお話ならば、まずは【1つ】のブックに集中して、【マクロの記録】を使い手作業をマクロ化して、必要な命令に当たりを付けるところから始めるとよいとおもいます。

(もこな2) 2022/01/16(日) 20:44


# 3かぶりですが、そのまま。

大きく分けると、
(1)フォルダ内のExcelファイルを順次取得すること
(2)ワークシートの特定領域を、別のシートに転記する方法
ということになります。
割と典型的な処理なので、結構いろいろなところで見かける話です。
 
色々な情報をご覧になって、なかなかうまくいかないそうですが、
そこをブレークスルーするコツを取得するよい機会です。
他人にコードをもらうのでは、そこは超えられないと思います。
また次に人に聞こうとするだけです。
 
せっかく努力されていいところまでいっているのですから、
現時点でてきているところを提示して、それに意見をもらうのが、
よい方法だと思いますが、いかがですか?

(γ) 2022/01/16(日) 20:44


みなさまご指摘有難うございます。
現状、WEBを調べて入力しているコードが下記になります。
(WEBのコードを拾って、少し修正しただけですので質問に記載しているルールには一致しないです)

下記のコードですと、集計元の「原料配合表」C2セルの原料名が、そのまま集計先のC2セルにのみ入力されてしまいます。
目的は、データベース化なので集計元のA列に入力させたいのです。
例えば、集計元のC2セルに"濃口醤油"と記入があって、B14〜B17まで原料が5つ記載があるとしたら、
集計先のA14〜A17までに"濃口醤油"と入力されて、B14〜B17まで原料が入力されるようにしたいです。
宜しくお願いいたします。

'プログラム0|変数設定の指定
Option Explicit

'プログラム1|プログラム開始
Sub GetExcelDataInFolder()

    'プログラム2|シート設定
    Dim ws1 As Worksheet
    Set ws1 = ThisWorkbook.Worksheets("Sheet1")

    'プログラム3|FileSystemObjectの設定
    Dim fs As FileSystemObject
    Set fs = New FileSystemObject

    'プログラム4|対象フォルダを取得
    Dim myfolder As Folder
    Set myfolder = fs.GetFolder(ThisWorkbook.Path)

    'プログラム5|対象フォルダ内の全ファイルを処理
    Dim myfile As File
    For Each myfile In myfolder.Files

        'プログラム6|拡張子が「xlsx」のファイルのみを処理
        If fs.GetExtensionName(myfile) = "xlsx" Then

            'プログラム7|フォルダ内のエクセルを開いてシートを設定
            Dim wb As Workbook
            Set wb = Workbooks.Open(Filename:=myfile)
            Dim ws2 As Worksheet
            Set ws2 = wb.Worksheets(3)

            'プログラム8|開いたエクセルの最終行を取得
            Dim cmax As Long
            cmax = ws2.Range("B65536").End(xlUp).Row
            Debug.Print myfile.Name & "のcmax=" & cmax

            'プログラム9|開いたエクセルのデータを転記
            Dim i As Long
            For i = 2 To cmax
                Dim cmax1 As Long
                cmax1 = ws1.Range("B65536").End(xlUp).Row
                ws1.Range("A" & cmax1 + 1 & ":P" & cmax1 + 1).Value = ws2.Range("A" & i & ":P" & i).Value
            Next

            'プログラム10|エクセルを閉じる
            wb.Close

        End If
    Next

    'プログラム12|エクセルを保存
    ThisWorkbook.Save

'プログラム14|プログラム終了
End Sub

(ベル) 2022/01/16(日) 21:37


 ■ワークシートのレイアウト
  転記元(「原料配合表」シート)         転記先
      A列   B列   C列                      A列      B列     C列
  1                                    1                    
  2               原材料               2
 ・                                   ・
 14         **                        14   原材料   **
 ・         **                        ・   原材料   **
 17         **                        17   原材料   **

 (実行したいこと)
 ・ 転記元の B14セルから、「B列のデータ最終行」までの範囲を
    転記先の B列のデータ最終行の次行から始まる箇所にコピーペイストする。
 ・ 転記元の C2セル(原料名)を、 転記先のA列に、同じ行から同じ行数分転記する。

 (わからないことは何ですか ?)
    ここはあなたに回答していただきたい。
    自分ではっきりさせることが大切です。
    箇条書きするとよいでしょう。

 (手持ちの知識)
 ・データの最終行のセル(の行番号)を調べるには、
   cmax1 = ws1.Range("B65536").End(xlUp).Row
   のように、Endプロパティを使ってできる。
   (これは、単にコピペするだけでなく、参照サイトのコードを理解することが前提ですよ。
     OKですよね。)   

 (1)転記元のB列の転記すべき箇所が、何行あるかは、
    上に書いた"知識"から求められますよね。
    簡単な引き算です。(13を引きます)
    これを仮に m としましょう。

 (2)転記先の「原料名」の書き込みセル範囲は、
    転記先のB列の最終行の次の行("最初のセル"とします)を求めておいて、
    ここから始まるm行分とすればいいわけです。
       最初のセル.Resize(m, 1).Value   = 原材料
    のような形式で書けるはずです。(むろん疑似コードです)

 (3)転記元のB列の転記についても、同じような考え方でできるはずです。
    こちらは、Copyメソッドを使って、一括で転記すればいいでしょう。
    コピー処理はよく使う処理です。ExcelVBAの第一歩はこれです。
    基本中の基本ですから、テキストにもきちんと書かれているはずです。

 コードを出してくれればいいのに、と思うかもしれませんが、それは罠です。
 考え方を理解して、コードを作る作業を自分が経験しないと、身には着きません。

 # まあ、プログラマーになるわけじゃないから、結果だけ知らせてくれればそれでいいよ、
 # というのが最近の風潮のようですが、私はそれには賛成しません。
 # VBAというのは自分である程度コントロールできるものでないと意味が乏しいし、
 # 面白くもないものだと思っています。(まあ、色んな考え方がありますけどね) 
(γ) 2022/01/17(月) 06:59

コメント返信:

[ 一覧(最新更新順) ]


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