[[20190313161818]] 『セルの列選択移動』(あらじぃ) ページの最後に飛ぶ

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

 

『セルの列選択移動』(あらじぃ)

2つのシート間で複数列/複数行のデータ移動をする際に、効率良く移動する方法を探しています。作業としては単純で、すべて追記だけです。

問題は、2つのシートで列の名前が位置も含めて交錯していることです。
仮に親表(転記先)には左列からA/B/C/D/E/F/G という列項目名で、
転記元は左からA/F/C/Bという列項目名だった場合、
もし転記元が10行あったら、
転記元Aの10セル分を転記先のA列の一番下空欄にマウスでCUT&PASTE
転記元Fの10セル分を転記先のF列の一番下空欄にマウスでCUT&PASTE
転記元Cの10セル分を転記先のC列の一番下空欄にマウスでCUT&PASTE
転記元Bの10セル分を転記先のB列の一番下空欄にマウスでCUT&PASTE
というやぼったいことをしなければなりません。
実際には親表には20程度の列、転記元には6列あるので、毎回手動では作業効率が悪くてしかたがないです。
何か良い方法はないものでしょうか。
すいません、これで伝わらなけば例を書きます。

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


 転記元の空いている列に、親表の列順で元表から参照したデータ範囲を作っておいたらいいのでは?
(コナミ) 2019/03/13(水) 16:51

ありがとうございます。一度転記元のシートで整形してからやるということですよね。でも、やはりそれだと手動のCOPY作業が大量発生するような気が。何か得策ありますか?
(あらじぃ) 2019/03/13(水) 17:04

 親表の構成がわかりません。
 計算式等入っていなければ、コナミさんのおっしゃる通り、矩形範囲コピーで済むと思います。
 それでも何とかしたいなら、マクロの記録ほとんど実現できると思うのですか・・・
(稲葉) 2019/03/14(木) 08:35

全ての列を備えたマスターデータを作成
マスターにはキー列を付ける

2つのシートにキー列を追加し、キーを入力したらマスターからデータを引っ張ってくるようにVLOOKUP,MATCHかINDEX,MATCH,MATCHで数式を組む

CUT&PASTEなんて必要ありません。

これが一般的なエクセルの使い方です。

(ななし) 2019/03/14(木) 08:46


 転記元がA/F/C/B
 転記先(親表)がA/B/C/D/E/F/G

 だったら転記元を
 A/B/C/空白列2列/F

 となるように参照列を作成しておき、それを一度にコピーしてから
 転記先に形式を選択して貼り付け→空白セルを無視するにチェックをいれてから貼り付け
 (式が入っているなら値貼り付けとか?)にすればいいのでは?
 具体的な内容がわからないのでこちらも勘でしか回答できませんからぼやっとしてますけど。
(コナミ) 2019/03/14(木) 10:06

項目名がAとかBとかの例ですよね? 列もAとかBなので紛らわしいのですが、まぁ、元と先の項目名は同じだけど列が違うので、1列ずつコピペしなければならず面倒、という事でしょうか。

面倒な作業は、マクロにやらせちゃいましょう。 Dictionaryオブジェクトを利用し、項目名が何列目にあるかを格納すれば、短くコーディングできますよ。

 Sub test()
    Dim DIC1 As Object
    Dim DIC2 As Object
    Dim wk1 As Worksheet
    Dim wk2 As Worksheet
    Dim i As Long
    Dim iR As Long
    Dim iMax As Long

    Set DIC1 = CreateObject("Scripting.Dictionary")
    Set DIC2 = CreateObject("Scripting.Dictionary")
    Set wk1 = Sheets("Sheet1")
    Set wk2 = Sheets("Sheet2")

    For i = 1 To wk1.Cells(1, wk1.Columns.Count).End(xlToLeft).Column
        If wk1.Cells(1, i).Value <> "" Then
            DIC1.Add wk1.Cells(1, i).Value, i
        End If
    Next i
    For i = 1 To wk2.Cells(1, wk2.Columns.Count).End(xlToLeft).Column
        If wk2.Cells(1, i).Value <> "" Then
            DIC2.Add wk2.Cells(1, i).Value, i
        End If
    Next i

    iMax = wk1.Cells(wk1.Rows.Count, "A").End(xlUp).Row
    iR = wk2.Cells(wk2.Rows.Count, "A").End(xlUp).Row + 1

    For i = 0 To DIC1.Count - 1
        If DIC2.exists(DIC1.keys()(i)) = True Then
            wk1.Range(wk1.Cells(2, DIC1.Items()(i)), wk1.Cells(iMax, DIC1.Items()(i))).Cut (wk2.Cells(iR, DIC2(DIC1.keys()(i))))
        End If
    Next i
 End Sub
(???) 2019/03/14(木) 10:36

 ひょっとして、貼りつける行番号は一緒じゃないのかな?
(コナミ) 2019/03/14(木) 11:10

やりたいことはすべて行追記で、キーとなる列も存在しません。
マクロはちょっと難しそうなので、困っていますが、ちょっと時間ができたら例を書きます。
皆さんお知恵をいただいているのに、話に追いつけておらず、すみません。
(あらじぃ) 2019/03/15(金) 15:17

実際のデータは文字です。数式は一切ありません。
1,2,3,4は単なる行番号でデータではありません。
あ,い,う,え,お,がそれぞれの列見出しです。

[親表]

	あ	い	う	え	お	
1    10	30	10	40	10		
2	50	40	50	50	30	
3	20	50	20	30	10				
4	20	30	20	10	50				

[転記元]

	え	あ	お	い		
1    11	12	13	14			
2	21	22	23	24
3	31	32	33	34

[親表に追記後](つまりできあがり)

	あ	い	う	え	お	
1    10	30	10	40	10		
2	50	40	50	50	30	
3	20	50	20	30	10				
4	20	30	20	10	50				
5	12	14		11      13
6       22      24              21      23
7       32      34              31      33

こんな例で伝わりますか?

(あらじぃ) 2019/03/15(金) 19:16


 こんばんは!

 数式を書くよりコピーした方が早いかもしれませんが、、一応、、、

 =IFERROR(INDEX(転記元!$A$2:$D$4,ROW(A1),MATCH(A$1,転記元!$A$1:$D$1,0)),"")
(SoulMan) 2019/03/15(金) 21:30

あ、そういうこと。

完全手動で行う場合は、
1.転記元シートをコピー
2.白紙のシートに貼り付け
3.白紙のシートで列の順番が親シートと同じ順番になるように並び替え
4.必要な行をコピー
5.親シートに貼り付け
でよく行います。

1〜3を自動記録すれば、若干の手直しで自動化マクロが完成します。
(ななし) 2019/03/16(土) 09:29


コメント返信:

[ 一覧(最新更新順) ]


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