[[20170318232433]] 『別のシートにデータを移行』(沙紀) ページの最後に飛ぶ

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

 

『別のシートにデータを移行』(沙紀)

初めて投稿いたします。
シート1のA1〜E5までのデータをシート2のA1〜C15へ移行したいのです。
シート1のA1、B1はシート2のA1、B1へ。
シート1のA2、B2はシート2のA4、B4へとういうように、次の移行先は2行空けます。
また、シート1のC1はシート2のC1、シート1のD1はシート2のC3へ移行させたいのです。
シート1には毎日200行のデータが最終行から追加され、その都度コピー&ペーストを行なってます。
よい方法を教えて頂けないでしょうか。

シート1

   A  B   C   D			 
1  1 4/6 A社 東京		
2  2 4/6 B社 名古屋					
3  3 4/6 C社 大阪		
4  1 4/7 D社 京都		
5  2 4/7 E社 福岡			

シート2

   A  B   C   
1  1 4/6 A社
2			
3	 東京
4  2 4/6 B社
5			
6	名古屋
7  3 4/6 C社
8			
9	大阪
10 1 4/7 D社
11			
12	京都
13 2 4/7 E社
14			
15	福岡		

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 ごくオーソドックスなCopyを使ったコードです。

 Sub test()
     Dim ws1 As Worksheet
     Dim ws2 As Worksheet
     Dim k As Long
     Dim j As Long

     Set ws1 = Worksheets("Sheet1")
     Set ws2 = Worksheets("Sheet2")

     For k = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row
         j = (k - 1) * 3 + 1
         ws1.Cells(k, 1).Resize(1, 3).Copy ws2.Cells(j, 1)
         ws1.Cells(k, 4).Copy ws2.Cells(j + 2, 3)
     Next
 End Sub

 Valueをそのまま移す方法もあります。
 色々な書き方がありえますが、
 まずはCopyを勉強するとで、できることが広がると思う。

 毎日の追加処理への対応は次のステップで。
(γ) 2017/03/19(日) 00:12

 おはようございます。

 >シート1のA1〜E5までのデータをシート2のA1〜C15へ移行したいのです。
 E5までのデータがその後の説明やレイアウトに出て来ないですけど単なる間違い?

 >シート1には毎日200行のデータが最終行から追加され、その都度コピー&ペーストを行なってます。 
 それと転記したいのは、都度コピペする追加されたデータだけ?
 毎日200行追加されるなら1年で約50000行追加されると言う事ですか?何年分蓄積するんですか?

 データ数が問題になりそうな要件ですね。
 毎回全データ転記するならコードは簡単ですが、よほど効率を考えたコードでないと
 1年(コードによっては1か月)もすれば使い物にならなくなるかも知れません。
 差分だけ転記する方法もありますけど、その場合差分を正確に知る必要が出てきます。
(sy) 2017/03/19(日) 09:56

 γさん

 >シート1には毎日200行のデータが最終行から追加され、その都度コピー&ペーストを行なってます。
 上記の部分を見落とされただけと思いますが、ご提示のコードでは1日分の転記でも使い物にならないと思います。

 取り敢えず配列を使って全てのデータを転記するコードです。
 実際のデータが何十万行あるのか分からないので、一度試してみて下さい。

 Sub 転記()
    Dim v1 As Variant
    Dim v2 As Variant
    Dim i As Long
    Dim t As Double

    t = Timer

    v1 = Sheets("Sheet1").Range("A1").CurrentRegion.Value
    ReDim v2(1 To UBound(v1, 1) * 3, 1 To 3)

    For i = 1 To UBound(v1, 1)
        v2(i * 3 - 2, 1) = v1(i, 1)
        v2(i * 3 - 2, 2) = v1(i, 2)
        v2(i * 3 - 2, 3) = v1(i, 3)
        v2(i * 3, 3) = v1(i, 4)
    Next i
    Sheets("Sheet2").Range("A1:C1").Resize(UBound(v2, 1)).Value = v2

    Debug.Print Timer - t

 End Sub
(sy) 2017/03/19(日) 10:24

syさん
ご指摘ありがとうございます。
そのとおりでしたね。

私としては、
質問者さんは、まずはオーソドックスなコピーを学習する段階だろうと思いまして。
>色々な書き方がありえます、
というのは配列処理も含んだ積もりでしたので、
本筋を提示いただきまして感謝いたします。

>毎日の追加処理への対応は次のステップで。
というのは、
・データの始点を今回のデータの始まりにおいて自動で対象を特定する部分とか、
・書込位置をEndなどで調べて
などというのを想定しておりました。
順を追っていくほうがよいかと思いまして。

いずれにせよ、質問者さんのスキルアップに役立ってもらえばよいですね。

(γ) 2017/03/19(日) 10:56


コメント返信:

[ 一覧(最新更新順) ]


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