[[20090109131301]] 『ブック間のコピー(マクロ)』(ふぁう) ページの最後に飛ぶ

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

 

 『ブック間のコピー(マクロ)』(ふぁう)

 マクロを使って、ブック間のコピーを行いたいのです。お力をお貸しください。
 売上予算ファイルと、費用予算ファイルの二つのファイルがあります。
 それぞれ、まったく同じ表が4月〜3月まで1年分あります。
 シート名も同じです。
 そのサンプルが下の表です。
 やりたいことは、売上予算ファイルの各月・各営業・各品種の売上データを、
 費用予算ファイルの同じ場所にコピペしたいのです。
 ただ、費用予算ファイルの費用欄には関数が入っている為、上書きでの貼り付けが出来ません。
 この為、各月のA3〜A7、C3〜C7、E3〜E7・・・・と飛び飛びでコピペしたいのです。

 尚、私マクロは初心者です。
 宜しくお願いいたします。

          A        B        C        D        E       F
 1 	1課		2課		3課	
 2 	売上	費用	売上	費用	売上	費用
 3 品種1	1000		200		150	
 4 品種2	50		400		390	
 5 品種3	1320		500		1250	
 6 品種4	850		350		500	
 7 合計	3220              1450               2290


 1) 表がずれていませんか?
    品種 の列は?

 2) 各月のA3〜A7、C3〜C7、E3〜E7...
    各ファイルの指定シートの同アドレスの値をコピーですか?

 関数のがよいのでは?
 (seiya)

 1)表の番地はまったく同じです。
  品種の列は実際は60列まであります。
  営業はWX列までです。 

 2)表の番地がまったく同じなので、同アドレスの値をコピーになります。

 関数で出来ればもちろんそれでもOKです。
 ただ、いろいろ参照やら関数が多数ありまして
 単純にコピーできる方法がいいと考え、マクロがいいのかな〜?と思っております。
 また、これをベースに、費用内容が異なるものをいくつか作らなければならないので、
 雛形が一つ出来れば他に転用できるかなというのもあります。

 宜しくお願いします。

 (ふぁう)

 >  雛形が一つ出来れば他に転用できるかなというのもあります。
 難しい注文ですね...

 これで試してください。

 Sub test()
 Dim wsDest As Worksheet, myFolder As String, fn As String
 Dim mySheet As String, myAddress
 Set wsDest = ThisWorkbook.Sheets("抽出先シート名")
 myFolder = "c:\test"     '<- 抽出元ファイルのフォルダ パス
 fn = "test.xls"   '<- 抽出元ファイル名
 mySheet = "Sheet1"    '<- 抽出元シート名
 myAddress = [{"A3:A7","C3:C7","E3:E7"}]  '<- 抽出セル番地
 For Each e In myAddress
     With wsDest.Range(e)
         .Formula = "='" & myFolder & "\[" & fn & "]" & mySheet & _
               "'!" & Split(e,":")(0)
         .Value = .Value
     End With
 Next
 End Sub
 (seiya)

 seiyaさん、ありがとうございます。
 うまくコピペすることが出来ました。
 ただ、これだと単月しかできません。

 シート名は4月、5月、6月・・・・・12月、1月、2月、3月となっております。
 この順番は変えることが出来ません。
 上記マクロを12回やれば出来ると思いますが、
 繰返し処理で簡単に出来ないでしょうか?

 どうか宜しくお願いいたします。

 (ふぁう)

 よくわかりません...

 > シート名は4月、5月、6月・・・・・12月、1月、2月、3月となっております。
 で、各シートのデータを夫々どのシートのどこに表示させたいのでしょう?
 (seiya)


 売上予算ファイルの4月は、費用予算ファイルの4月に、
 売上予算ファイルの5月は、費用予算ファイルの5月にと、
 売上予算ファイルの各月を、費用予算ファイルの同じ各月に表示させたいのです。

 それぞれまったく同じ表が4月から3月まであります。
 番地も一緒です。

 (ふぁう)

 こんな感じでしょうか?

 Sub test()
 Dim myFolder As String, fn As String
 Dim mySheets, myAddress, e, v, mySheet As String
 myFolder = "c:\test"     '<- 抽出元ファイルのフォルダ パス
 fn = "test.xls"   '<- 抽出元ファイル名
 mySheets = [{4,5,6,7,8,9,10,11,12,1,2,3}]    '<- 抽出元シート名
 myAddress = [{"A3:A7","C3:C7","E3:E7"}]  '<- 抽出セル番地
 For Each v In mySheets
     mySheet = v & "月"
     For Each e In myAddress
         With ThisWorkbook.Sheets(mySheet).Range(e)
             .Formula = "='" & myFolder & "\[" & fn & "]" & mySheet & _
                   "'!" & Split(e,":")(0)
             .Value = .Value
         End With
     Next
 Next
 End Sub
 (seiya)

 できましたー!
 ありがとうございました。
 中身はちんぷんかんぷんですが、
 頑張って解読してみます。

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

 (ふぁう)

 Step debugして実際にどのような動きをしているのか確かめてください。

 1) VBE で [表示] - [ローカルウィンド]
 2) コードのどの部分でもよいので、クリック
 3) F8 を押す
 F8 を押すごとにコードが一行実行されます。
 それと同時にローカルウィンドに各変数の値が表示されます。
 配列変数は + が表示されますので、クリックすると中身を見ることができます。

 わかり難いところに注釈を付けておきます。

 Sub test()
 Dim myFolder As String, fn As String
 Dim mySheets, myAddress, e, v, mySheet As String
 myFolder = "c:\test"     '<- 抽出元ファイルのフォルダ パス
 fn = "test.xls"   '<- 抽出元ファイル名
 mySheets = [{4,5,6,7,8,9,10,11,12,1,2,3}]    '<- 抽出元シート名
 myAddress = [{"A3:A7","C3:C7","E3:E7"}]  '<- 抽出セル番地
 ' ====
 ' 変数mySheetとmyAddressはEvaluate メソッドを使用して配列にしています。
 ' 双方ともArray又はSplit関数を使用しても可能です。
 ' ====

 For Each v In mySheets
     mySheet = v & "月"
     For Each e In myAddress
         With ThisWorkbook.Sheets(mySheet).Range(e)
             .Formula = "='" & myFolder & "\[" & fn & "]" & mySheet & _
                   "'!" & Split(e,":")(0)
             .Value = .Value
         End With
     Next
 Next
 End Sub
 (seiya)


 途中割り込みで申し訳ないのですが、一つだけ質問させて下さい。

 今回の「抽出元ファイル名」を「抽出先(転記先)ファイル名」に変えるにはどのようにしたらいいのでしょうか?

 宜しくお願い致します。
 (ジョニー)


 >  今回の「抽出元ファイル名」を「抽出先(転記先)ファイル名」に変えるにはどのようにしたらいいのでしょうか?

 どのような状況なのでしょうか?
 「抽出元ファイル名」はどうするのでしょう?
 (seiya)

 実は、市販の会計ソフトを幾つか使ったのですが、機能面や操作方法で挫折してしまいました。
 それならばと個人経営で使える程度の青色申告用の会計ソフトを何年か前に自作したのですが、
 今ではこのソフトを使ってくれている何名かの有志がいます。

 このソフトのバージョンアップの際に、古いソフトを使っている人達が今まで記帳していた日々の記録
 (上の例のような1から12月の転記に当てはまります。)や、
 摘要表シート、科目表シートなどの内容の一部を書き写したいのです。
 (使う人により科目内容などが変るので)

 そこで、新しいソフトの中にマクロを書き入れ、マクロボタンを押す事で新しいファイルに転記できればなと考えています。
 (今までは二つのファイルを並べて自動実行マクロで行っていましたが、その都度、相手宅に行き、個人情報を見ないようにしたりで神経を使っていました。)

 出来うるならばもう一つの方法として、「転記.XLS」 というような別ファイルにマクロを組み込み、「古いファイル.XLS」のデータを「最新ファイル.XLS」に転記出来れば、色々なファイルで今後の応用が出来るかなと思ったりしています。

 ファイル名などは書き直せると思いますので何でも結構です。
 宜しくお願い致します。(ジョニー)


 原則(同名のシートから同名のシートへ)は変更無しで、転記先のみ変更ということでしょうか?

 1), 2) を追加

 1) Dim DestWB As Workbook 
 2) Set DestWB = Workbooks.Open("ファイルのフルパス") '開いてない場合
                         ↑ 変更
    Set DestWB = Workbooks("転記.XLS") '開いている場合
                         ↑ 変更                          

 3) With ThisWorkbook.Sheets(mySheet).Range(e)
    を
    With DestWB.Sheets(mySheet).Range(e)
    に変更

 このようなことでしょうか?
 (seiya)
 Workbook になっていましたので修正しました. 10:40

 Sub test()
 Dim myFolder As String, fn As String
 Dim mySheets, myAddress, e, v, mySheet As String
 Dim DestWB As Workbook 

 Set DestWB = Workbooks.Open("H:\会計簿記\古いファイル.xls") '開いてない場合
  'Set DestWB = Workbooks("古いファイル.XLS")               '開いている場合

 myFolder = "H:\会計簿記"          '<- 抽出元ファイルのフォルダ パス
 fn = "年度現金出納帳.xls"         '<- 抽出元ファイル名
 mySheets = [{4,5,6,7,8,9,10,11,12,1,2,3}]    '<- 抽出元シート名
 myAddress = [{"A9:G1000"}]                   '<- 抽出セル番地
 For Each v In mySheets
     mySheet = v & "月"
     For Each e In myAddress
         With DestWB.Sheets(mySheet).Range(e)
             .Formula = "='" & myFolder & "\[" & fn & "]" & mySheet & _
                   "'!" & Split(e,":")(0)
             .Value = .Value
         End With
     Next
 Next
 End Sub

 ----------
 お蔭様で抽出元ファイル(年度現金出納帳.xls)に上のマクロを登録して実行した結果、
 1月から12月まで転記されました。

 ただ、転記されたデータの収入や支出欄での表示(通貨)が、貼り付けた箇所すべてで
 「0」表示されてしまいます。

 元のままの空欄セルとして貼り付けるにはどうしたらいいのでしょうか?

 もう一つ、"H:\会計簿記\古いファイル.xls"のような絶対パスではなく、
   同じフォルダ内で実行させる場合の登録方法は有るのでしょうか?
  (「\古いファイル.xls」とか「..\古いファイル.xls」のように。)
 無理を言って済みません。(ジョニー)


 >  ただ、転記されたデータの収入や支出欄での表示(通貨)が、貼り付けた箇所すべてで
 > 「0」表示されてしまいます

 1) Dim myRef As String を追加
 2)
              .Formula = "='" & myFolder & "\[" & fn & "]" & mySheet & _
                   "'!" & Split(e,":")(0)

                    を
              myRef = "'" & myFolder & "\[" & fn & "]" & mySheet & "'!" & Split(e,":")(0)
              .Formula = "=if(" & myRef & "<>""""," & myRef & ","""")"

 に変更してください。

 > もう一つ、"H:\会計簿記\古いファイル.xls"のような絶対パスではなく...
     myFolder = DestWB.Path
     に変更してください。
 (seiya)


 こんにちは。かみちゃん です。

 横から失礼します。

 ↑のseiyaさんのコメントを見て、見当違いのコメントになるかもしれませんが、書きかけていたので
 そのままアップさせていただきます。参考程度にしてください。

 > "H:\会計簿記\古いファイル.xls"のような絶対パスではなく、
 > 同じフォルダ内で実行させる場合の登録方法は有るのでしょうか?

 同じフォルダというのが、
 マクロを記述しているファイルと同じフォルダなら、
 ThisWorkbook.Path
 アクティブブックと同じフォルダなら、
 ActiveWorkbook.Path
 開いているBook1.xlsと同じフォルダなら、
 Workbooks("Book1.xls").Path
 でパスが取得できますので、

 Set DestWB = Workbooks.Open(ThisWorkbook.Path & "\古いファイル.xls")
 という感じでできると思います。

 (かみちゃん)
 2009-01-11 13:47


 >  もう一つ、"H:\会計簿記\古いファイル.xls"のような絶対パスではなく...
 よく意味がわかっていなかったようです。
 どこからの相対パスでしょう?
 CurDir から?
 (seiya)

 seiyaさん、我儘にお付き合い頂き感謝しています。
 お蔭様で希望のものが出来ました。有難う御座いました。
 パスの件はかみちゃんさんの書き込みで修正できました。

 かみちゃんさん、ファイルとフォルダ&パスの関係、勉強になりました。
 seiyaさん共々感謝します。有難う御座いました。

 (ジョニー)

 質問者のふぁうです。追加で質問よろしいでしょうか?

 パスの話がありましたが、例えば二つのファイルはまったく別のフォルダで、
 (マクロは新しいファイルに保存)
 マクロを使用するときは、「必ず二つのファイルは開いている状態」とした場合、
 パスの指定を無くして適用することはできますでしょうか?

 私の場合、一つの売上予算ファイルの売上金額を、
 複数の費用予算ファイルに転記します。
 この複数の費用予算ファイルは各フォルダにばらばらに入っている為、
 今は、マクロで指定している抽出元ファイルのパスに合致したフォルダに一度入れて、
 マクロを実行した後に、それを移動させています。
 売上予算が変更になることがあり、その都度マクロでやると結構大変な為、
 開いている2つのファイル(抽出元+抽出先)に適用されるような形式があると便利だなーと思いました。 
 もし出来るのならば教えてください。
 宜しくお願いいたします。

 尚、マクロは抽出先ファイルにModule1として保存しています。

 (ふぁう)

 こんにちは。かみちゃん です。

 > 売上予算が変更になることがあり、その都度マクロでやると結構大変な為、
 > 開いている2つのファイル(抽出元+抽出先)に適用されるような形式がある

 予算実績比較は、私も仕事でよくするので、予算が変更になるシーンはよく理解できるのですが、
 具体的にどのようなことがしたいのかを説明していただけませんか?

 なお、フォルダが違っても、ファイル名(ブック名)が同じ複数のファイルを同一インスタンスで
 同時に開くことはできません。(手作業でしてみるとわかると思います)

 また、マクロの保存先は、特に関係ありません。
 ・マクロが記述されているブック
 ・アクティブブック
 ・開いている特定のブック
 のいずれかのパスおよびカレントフォルダを基準にすることができるように思います。

 (かみちゃん)
 2009-01-13 22:09

 開いた状態なら、myFolderはいりません。
 (seiya)

 すみません、いろいろと混乱し、勘違いをしていました。
 seiyaさんのマクロは、そもそも開いている必要もないわけですね。
 追加の質問は忘れてください。

 いろいろと試してみた結果、特に問題ありませんでした。。。
 わからないことはたくさんありますが・・・。

 一度リセットさせていただいて、不明な点があれば改めて質問させていただきます。

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

 (ふぁう)

 >  一度リセットさせていただいて、不明な点があれば改めて質問させていただきます。
 わかりました...
 Step Debug しながら、変数、シート、の変化を追っていけば殆どわかると思います。
 (seiya)

コメント返信:

[ 一覧(最新更新順) ]


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