[[20170816150813]] 『表記載の同フォルダ内のブックを開き、該当項目の』(石川) ページの最後に飛ぶ

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

 

『表記載の同フォルダ内のブックを開き、該当項目の値をコピーペーストする』(石川)

 こんにちは。
 当方VBA初心者です。
 現在手作業で実施していることを、自動化したいと思っています。 
 部分的でもよいので、ご教示願えますでしょうか。

 以下にやりたいことを記します。
 説明不足の部分があればそちらも教えていただけると幸いです。

 ■■■Bフォルダ内  <C:\Users\username\Desktop\B>■■■

 「各タイトル_WEB別売上表.xlsx」

 「aaa_タイトルA.xlsx」
 「bbb_タイトルA.xlsx」
 「aaa_タイトルB.xlsx」
 「ccc_タイトルB.xlsx」
 「aaa_タイトルC.xlsx」
 「bbb_タイトルC.xlsx」   

 「マクロ用.xlsm」

 ※すべて[Sheet1]。
 ※「WEB名_タイトル名.xlsx」のフォーマットは同一
 ※「WEB名_タイトル名.xlsx」は増える可能性あり

 ■■■■■■■■■■■■■■■■■■■■■■

 「各タイトル_WEB別売上表.xlsx」
   ----A----  ----B----  ----C----   ----D----    
 1 タイトル名 WEB名   売上金   ブック名
 2 タイトルB  bbb    321,000  bbb_タイトルB
 3 タイトルA  aaa    50,000  aaa_タイトルA
 4 タイトルC  aaa    280,050  aaa_タイトルC
 5 タイトルA  bbb     150   bbb_タイトルA
 6 タイトルB  aaa    123,456  aaa_タイトルB
 7 タイトルC  bbb    45,000   bbb_タイトルC
 8
 9

 「aaa_タイトルA.xlsx」
   ----A----  ----B----  ----C----  ----D---- 
 1     WEB名    売上   売上金    配分    
 2     aaa        関数      50,000     関数
 3

 「bbb_タイトルA.xlsx」
  ----A----  ----B----  ----C----  ----D----  
 1     WEB名    売上   売上金    配分    
 2      bbb        関数       150   関数
 3

 「aaa_タイトルB.xlsx」
   ----A----  ----B----  ----C----  ----D----  
 1     WEB名    売上   売上金   配分    
 2     aaa       関数   123,456   関数
 3

 ====================================

 1「各タイトル_WEB別売上表.xlsx」を開く
 2 D列 の「ブック名」を確認して、
 3 同フォルダ内の「ブック名.xlsx」を開く
 4「各タイトル_WEB別売上表.xlsx」の C列 の売上金をコピー
 5  該当「ブック名.xlsx」の [C2] に売上金の値をペースト
 6「各タイトル_WEB別売上表.xlsx」の最終行まで繰り返し
 7 最終行まで終わったら
 8「完了」のMsgboxをだす

 以上、よろしくお願いいたします。

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


やりたいことの大筋は判りましたが、貴方がマクロを書いてみて、判らなかった部分は何処なのでしょうか? ある程度コードを書いてみたならば、まずそれを見せてください。

開くブック名は判っているのだし、それを WorkBooks.Open し、C2セルの値をイコールで代入するだけであり、難しいところは無さそうに見えます。
(???) 2017/08/16(水) 16:19


 ???様
 ご返信ありがとうございます。
 ヒントも教えていただきありがとうございます。

 ゼロからマクロを書いた経験もなく、「マクロの記録」でやろうと思ったのですが、
 記録したにも関わらずうまく動作せず、もっといい方法がないかと思いまして...。

 そもそも、1〜8までの想定している手順も、もしかしたら別の手順のほうがスマートかもしれない、、
 と何日か考えていますが、

 なかなか考えがまとまらないままここへ質問してしまいました。すみません。

 ちなみにマクロの記録でできたコードは以下です。

 Sub test6()

 '
 ' test6 Macro
 '

 '
    Range("D2").Select
    Selection.Copy
    Workbooks.Open Filename:="C:\Users\username\Desktop\B\bbb_タイトルB.xlsx"
    Windows("各タイトル_WEB別売上表.xlsm").Activate
    Range("C2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("C2").Select
    ActiveSheet.Paste
    ActiveWorkbook.Save
    ActiveWindow.Close
    Application.CutCopyMode = False

 End Sub

(石川) 2017/08/16(水) 16:51


なるほど、単純に対象のシートから、C2セルの値だけ持ってくれば良いようですね。

集計用のシートに、ActiveXのボタンを貼り、シートモジュールとして以下のコードをコピペ、一旦ブック保存してから、マクロ有効で開き直し、ボタンを押してみてください。 今後は、ボタンを押すだけで、最新の値を持ってくるようになります。

 Private Sub CommandButton1_Click()
    Dim i As Long

    'Application.ScreenUpdating = False

    For i = 2 To Me.Cells(Me.Rows.Count, "D").End(xlUp).Row
        With Workbooks.Open(ThisWorkbook.Path & "\" & Me.Cells(i, "D").Value & ".xlsx", False, True)
            Me.Cells(i, "C").Value = .Sheets("Sheet1").Range("C2").Value
            .Close False
        End With
    Next i

    'Application.ScreenUpdating = True
    MsgBox "完了", vbInformation
 End Sub
(???) 2017/08/16(水) 17:24

追記。
うまく動作したならば、コメントアウトしてある2行の先頭のシングルクォートを消して有効行にしてください。描画更新を抑止することで、より速く処理するようになります。
(???) 2017/08/16(水) 17:26

 ???様
 早速の回答ありがとうございます。
 ただいま外出中ですので、のちほど試してみて、
 ご返信させていただきます。
 

(石川) 2017/08/16(水) 17:28


 ???様
 教えていただいた方法を試してみました。
 エラーなく動作し、「完了」のポップアップまで出ましたが、
 完了後フォルダ内の.xlsxファイルを見たところ、
 下記のような状態になってしまいました。

 ・「各タイトル_WEB別売上表.xlsx」の C列[売上金]がすべて消えている
 ・各「WEB名_タイトル名.xlsx」のファイルの C2セルへ値が入っていない

 考えられるのが、 各「WEB名_タイトル名.xlsx」のファイルの
 C2セルが元々 null のため、
 それが「各タイトル_WEB別売上表.xlsx」のC列[売上金]へ反映されてしまったのか?
 と思ったのが、合っておりますでしょうか...。

 またPCから離れてしまいますので、取り急ぎご報告です。

(石川) 2017/08/16(水) 18:12


 追記

 Me.Cells(i, "C").Value = .Sheets("Sheet1").Range("C2").Value

 この部分の左辺と右辺を変えればよいのでしょうか。
(石川) 2017/08/16(水) 18:25

マクロの自動記録したコードが、一覧表の値をコピーして、そのまま一覧表に貼りつけていた(つまり、見かけ上何もしない)ので、各ブックの値を一覧に持ってくる、と思ったのですが、逆でした?

各ブックに貼りつけていくならば、代入の左辺と右辺を逆にする事と、Workbooks.Openに指定している第2、第3引数を削除して、ファイル名だけにしてください。(読み取り専用を指定していました) 更に、代入しただけでCloseすると、結果が保存されないので、Close前にSaveする1行を追加してください。
(???) 2017/08/17(木) 09:15


 一覧表(「各タイトル_WEB別売上表.xlsx」)のC列の値を、
 各ブック(「WEB名_タイトル名.xlsx」)の[C2]セルへ貼り付ける。

 という手順にしたいです。説明不足で申し訳ありません。

 >一覧表の値をコピーして、そのまま一覧表に貼りつけていた(つまり、見かけ上何もしない)
 たしかにマクロの記録で作成したコードだと何も起こらなかったです、、!

 教えていただいた通り修正し、動かしてみてまたご連絡いたします。

(石川) 2017/08/17(木) 10:02


 ???さま
 お世話になっております。
 ご指摘箇所を修正し、動かしてみたところ、
 希望どおりの動作を確認することができました。
 ありがとうございます!

 今後、一覧表(「各タイトル_WEB別売上表.xlsx」)から
 各ブックへ反映させる項目が増える可能性もあるので、
 ご教示頂いたコードを基に更新していこうと思います。

 正常に起動したコードを下記に記載いたします。

 Private Sub CommandButton1_Click()
    Dim i As Long
    'Application.ScreenUpdating = False
    For i = 2 To Me.Cells(Me.Rows.Count, "D").End(xlUp).Row  

        With Workbooks.Open(ThisWorkbook.Path & "\" & Me.Cells(i, "D").Value & ".xlsx")  
            .Sheets("Sheet1").Range("C2").Value = Me.Cells(i, "C").Value  
            .Save
            .Close False
        End With
    Next i
    'Application.ScreenUpdating = True

    MsgBox "出来ました。" & vbLf & "よかった", vbOKOnly, "売上反映"

 End Sub

 以上、よろしくお願いいたします。
(石川) 2017/08/17(木) 10:30

コメント返信:

[ 一覧(最新更新順) ]


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