[[20191115000735]] 『複数ブックから数値を転記するマクロを教えてくだ』(追い込まれびと) ページの最後に飛ぶ

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

 

『複数ブックから数値を転記するマクロを教えてください。』(追い込まれびと)

VBA初心者の私に至急どなたかマクロのコードを教えてください(涙)
やりたいことは以下のとおりです。
【勤務時間の集約】
1 県ごと(福岡、佐賀、大分…)のexcelブック(ブック名に県名)に役職ごと(部長、課長、係長1、係長2、係員1、係員2…)のシート(シート名に役職)が作成され、業務別の勤務時間(C5:C45の値)が入力されている。

2 上記1が30ブック存在あり、様式はすべて同じ(セル番も同じ)。一つのフォルダにまとめられている。

3 集約用のブックには、役職ごとにシートがあり、各シートは横軸に県名、縦軸に業務名の表が作成されている(最初の県はD5:D45部分にペーストすることになる。以降右に続く)。

4 ちなみに、役職は各県揃っておらず、係長が1人のところもあれば2人以上のところもある。

5 上記1のブックの役職ごとの数値を上記3の集約用ブックの役職ごとのシートに転記させたい。

以上です。
調べた限りでは、For文の中にFor each文を入れる?のかなと考えていますが、基礎知識が少なく手が止まっております。
どなたかの知恵を貸してください!!

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


たとえば愛媛ブックに係長1、係長2がいたとき、
集約表の係長シートへの転記のされ方はどのようになりますか?
(黄色い循環参照) 2019/11/15(金) 01:01

■1
>至急どなたかマクロのコードを教えてください
余計なお世話でしょうけど、"至急"とおっしゃるような状態であれば、のんびりと質問サイトで聞いている場合ではありません。
それこそ、"至急”上司と相談して身元が確かな業者に外注の手続きを行うべきだと思います。

■2
>一つのフォルダにまとめられている。
>ブック名に県名〜役職ごとのシート(シート名に役職)が作成
そのフォルダに、対象ブック以外のファイルがあるかによって詳細はかわりますが、基本は

 (1)フォルダ内の全ファイルを巡回して
 (2)順番にブックを開いて
 (3)開いたブックの全シートを巡回して
 (4)ブック間でコピペする
 (5)開いたブックを閉じる
 ※(2)〜(5)を繰り返す

みたいになるとおもいます。

■3
>集約用のブックには、役職ごとにシートがあり
>各シートは横軸に県名、縦軸に業務名の表が作成されている
>(最初の県はD5:D45部分にペーストすることになる。以降右に続く)。
シートはデータ側と集計側で同じ名前のものにすればよいですね。
一方で、貼付先セルは最初の県であるか否かに関わらず、開いたブック名(=県名)をキーに列を特定することになるんじゃないですか?
行のほうは5行目で固定でよいのかもしれませんが・・・

■4
>調べた限りでは、For文の中にFor each文を入れる?のかなと考えていますが、基礎知識が少なく手が止まっております。
ループ処理の部分がわからないのであれば、一旦そこは置いておいて、例えば、「福岡.xlsx」だけを処理するみたいに考えてみてはどうでしょうか?

それでもうまくいかないのであれば、具体的なコードと、どのように上手くいかないのか
 ・エラーが出る場合:エラーが発生する箇所とエラー内容(エラー番号、エラーメッセージ)
 ・エラーは出ないが予定と違う場合:××になる予定が△△になってしまう
等をお伝え頂くとアドバイスできることがあるかもしれません。

(もこな2) 2019/11/15(金) 04:05


黄色い循環参照さま返信ありがとうございます。
集約表にも係長1、係長2のシートがあります。
報告用のシートと同名のシートを集約用に準備している状況です。
よろしくお願いします。
(追い込まれびと) 2019/11/15(金) 08:48

もなこ2さま返信ありがとうございます。
1については、仰るとおりで恥ずかしいのでが、皆様にご意見いただきながら作成してみたいと思います。
確かに一気にやるのは難しいので1つのファイル処理するところから始めたいと思います。
アドバイスありがとうございました。
(追い込まれびと) 2019/11/15(金) 08:54

 おはようございます ^^気が付いた点だけですみません。
1.県別BOOKの役職シート
2.集約シートの役職シート
のフォーマット(表形式)を3,4行でもよいので(個人情報はダミーで)
ご説明いただくと、さらに、具体的アドバイス、回答が有るかもしれません ← 多分 ^^;
1.全員分のシートが双方にあるのでしょうか
2.40行分の情報は何をいみするのでしょうか日付別勤務時間?
  、業務の種類別勤務時間?
m(_ _)m
(隠居じーさん) 2019/11/15(金) 09:52

集約表ブックを開く

1-県別ブックを開く

2-県別ブックの役職シートのC5:C45をコピー

3-集約表ブックの同名シートの同一県名列5:45行に貼り付け
(2-3を県別ブックのシート数分繰り返し)

4-県別ブックを閉じる
(1-4を県別ブックの数分繰り返し)

こういう流れかな
(べん) 2019/11/15(金) 10:13


隠居じーさんさま返信ありがとうございます。
1県別BOOK(単位:時間)同じシートが役職ごとあります

      勤務時間
 総務事務 10.50
 広報事務 15.25

2集約ブック(単位:時間)同じシートが役職ごとあります

      福岡 佐賀 大分
 総務事務
 広報事務

3 報告用ブックには在籍者シートしかありません。
  例)シート:部長、係長1
 集約用ブックには全県に対応するシートがあります。

   例)シート:部長、課長、係長1、係長2…

4 40行は事務種類が40種類あります。
  報告用ブックは事務種類別の月計勤務時間が入力されたものです。
(追い込まれびと) 2019/11/15(金) 12:27


 こんにちは ^^ 
40種類はどのシートも同じ順に同じ列、行にある
県名はファイル名のドットの手前までと同じである(@@県.xl、@@都.xl*、@@府.xl*
前程で ^^;。。。べん さん のロジックを参考にさせて頂いて。
ザックリですので、参考程度にお止め下さい。テスト環境作れなか
ったので。。。 ← 言い訳 A^_^;
いろいろ不都合が有るかと思いますが一案で
Option Explicit
Sub OneInstance()
    Dim Wb            As Workbook
    Dim i             As Long
    Dim Fd            As String
    Dim Fnm           As String
    Dim Retu          As Long
    Dim ItemX         As String
    Dim Var
    Fd = ThisWorkbook.Path & "\"
    Fnm = Dir(Fd & "*.xls*")
    Do Until Fnm = ""
        If Fnm <> ThisWorkbook.Name Then
            Set Wb = Workbooks.Open(Fd & Fnm)
            ItemX = Left(Wb.Name, InStr(1, Wb.Name, ".") - 1)
            For Each Var In Wb.Worksheets
                If Evaluate("=ISREF(" & Var.Name & "!A1)") Then
                    With Workbooks("集約.xlsm").Worksheets(Var.Name)
                        Retu = WorksheetFunction.Match(ItemX, .Rows(4), 0)
                        Var.Range("C5:C45").Copy .Cells(5, Retu)
                    End With
                End If
            Next
            Wb.Close False
        End If
        Fnm = Dir()
        DoEvents
    Loop
End Sub
今から出かけますので対応は夕方以降になります。
他にたくさんすばらしい回答者の皆様もいらっし
ゃいますので。。。でわ m(_ _)m
(隠居じーさん) 2019/11/15(金) 12:52

隠居じーさんさま
返信ありがとうございます!
早速活用させていただきます!
(追い込まれびと) 2019/11/15(金) 13:01

書いている間に隠居じーさんさんとかぶっちゃいましたが、そのまま。

たぶん、それぞれの構成、レイアウトは

データ側

 シート構成
    部長
    係長1
    係長2

 各シートレイアウト
     ____B________C________
    5  業務1     6:45
    6  業務2     7:30
    ・    ・
    ・    ・
   45  業務41    0:00

集計側(マクロもこちらに記述)

 シート構成
    部長
    課長
    係長
    係長2
    係員1
    係員2
      ・
      ・

 各シートレイアウト
     ____C________D______E______F_______
    4  業務      福岡   佐賀   大分
    5  業務1     
    6  業務2     
    ・    ・
    ・    ・
   45  業務41    0:00

みたいな感じになっているんじゃないですかね。

なので、集計用.xlsmは開いているのが前提として【福岡.xlsx】だけ処理しようと思ったら

 (1)福岡.xlsxを開く
 (2)開いたブックのシートを巡回して
 (3)対象となったシートと同じ名前の集計用ブックのシートのうち、4行目が"福岡"のものを探して
 (4)対象シートのC5:C45をコピーして
 (5)対象となったシートと同じ名前の集計用ブックの、5行目、(3)の列に貼付
 (6)(3)〜(5)を福岡.xlsxの全シート分繰り返す
 (7)福岡.xlsxを保存せずに閉じる

という処理をすればよいように思います。
テストはしてないですが、たぶんこんな感じ。

    Sub テキトー()
        Const ブック名 As String = "福岡.xlsx"
        Dim 県名 As String, 列 As Variant
        Dim MySH As Worksheet, dstSH As Worksheet       

        With Workbooks.Open(ThisWorkbook.Path & "\" & ブック名)
            県名 = Left(ブック名, InStrRev(ブック名, ".") - 1)

            For Each MySH In .Worksheets
                Set dstSH = ThisWorkbook.Worksheets(MySH.Name)
                列 = Application.Match(県名, dstSH.Rows(4), 0)

                If IsError(列) Then
                    MsgBox "県名検索エラー"
                    Exit Sub
                End If

                MySH.Range("C5:C45").Copy dstSH.Cells(5, 列)
            Next MySH

            .Close
        End With

    End Sub

で、↑の部分が作り込めたら、外側のループはこんな感じにすればよいとおもいます。

    Sub 外側のループ()
        Dim ブック名 As String

        ブック名 = Dir(ThisWorkbook.Path & "\*.xls?")
        Do Until ブック名 = ""
            If ブック名 <> ThisWorkbook.Name Then
                MsgBox ブック名 & " がみつかりました"
            End If

            ブック名 = Dir()
        Loop

    End Sub

どのくらい"至急"なのか知りませんが、これを理解してご自身のコードに取り込む時間がとれないなら、やはり外注すべきだとおもいます。

(もこな2 ) 2019/11/15(金) 13:32


もこな2さま 返信ありがとうございます。
返す言葉もありませんが、ありがたく使用させていただきます。

(追い込まれびと) 2019/11/15(金) 13:47


追い込まれびと さん
すみません。。。ちょっとミスってるかもしれません。
シートの処理関係、こちらでもう少しテストしてみます。
とりあえず、私の分は使用中止でお願いいたします。
m(_ _)m。。。のちほど m(_ _)m

(隠居じーさん) 2019/11/15(金) 15:18


>ありがたく使用させていただきます。
"使用"はお断りします。

研究材料として使って理解できた部分をご自身のコードに組み込むのであれば、ご自由にどうぞ。

(もこな2 ) 2019/11/15(金) 18:40


 こんばんは ^^
これでなんとか。。。あっているかどうか解りませんが、
エラー処理は不完全なので、ま、参考程度におとどめく
ださいませ。。。m(_ _)m 
Sub OneInstance()
    Dim Wb            As Workbook
    Dim i             As Long
    Dim Fd            As String
    Dim Fnm           As String
    Dim Retu          As Long
    Dim ItemX         As String
    Dim Var           As Variant
    Dim Tmp           As String
    Fd = ThisWorkbook.Path & "\"
    Fnm = Dir(Fd & "*.xls*")
    Do Until Fnm = ""
        If Fnm <> ThisWorkbook.Name Then
            Set Wb = Workbooks.Open(Fd & Fnm)
            ItemX = Left(Wb.Name, InStr(1, Wb.Name, ".") - 1)
            For Each Var In Wb.Worksheets
                On Error Resume Next
                Tmp = Workbooks("集約.xlsm").Worksheets(Var.Name).Name
                On Error GoTo 0
                If Tmp <> "" Then
                    With Workbooks("集約.xlsm").Worksheets(Var.Name)
                        Retu = WorksheetFunction.Match(ItemX, .Rows(4), 0)
                        Var.Range("C5:C45").Copy .Cells(5, Retu)
                    End With
                Else
                    MsgBox "集計に" & Var.Name & " シートが有りません" & Chr(13) & "作成後再実行してください"
                    Wb.Close
                    Set Wb = Nothing
                    Exit Sub
                End If
                Tmp = ""
            Next
            Wb.Close False
        End If
        Fnm = Dir()
        DoEvents
    Loop
    Set Wb = Nothing
End Sub
(隠居じーさん) 2019/11/15(金) 19:04

もこな2さま、隠居じーさんさま
おふたりともありがとうございました!
自宅のPCでは上手く動きましたので、後日実際のデータでやってみます。
私もちゃんと勉強します。
(追い込まれびと) 2019/11/15(金) 21:19

失礼します。
「MySH」「dstSH」はどのような意味があるのですか?
(追い込まれびと) 2019/11/15(金) 23:17

コメント返信:

[ 一覧(最新更新順) ]


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