🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら

Q&A

解決済

2回答

835閲覧

データの加工をして別シートに移したい

LifeGrow

総合スコア1

0グッド

0クリップ

投稿2021/02/17 13:52

編集2021/02/18 21:35

##前提
ところどころ「"」「,」だったり余分なものが入っています。
例で5行まで書いたのですが、何行か分かりません。
c列は必要な番号があったり、いらない空白があったりしています。

###実現したいこと
①のデータを③に加工して別シートにコピーしたいです。

B列をコピーC列に番号がない場合、E列の最初の番号とF列の最初の番号をコピーして1行
C列に番号があれば、C列とD列をコピーして1行

E列にカンマ区切りの番号が複数ある場合
B列コピーE列の1番目の番号をコピー、F列の1番目の番号をコピーして1行
B列コピーE列の2番目の番号をコピー、F列の2番目の番号をコピーして1行
説明が下手ですが、図を見たほうが早いですかね。。。

上記を繰り返すと②のようなデータができると思うのですが、
その②のデータで番号の重複箇所があれば削除して最終的には③にして別シートにコピーしたいです。
→裏で③のような形にしてから別シートにコピーしたいです。
お手数ですが、わかる方教えて頂けないでしょうか。

①データ
A B     C D E F
1 91232310 '12145,       リンゴ
2 92311232 , '12124,12124, パイナップル,パイナップル
3 93232535 12359, オレンジ '12124,       バナナ
4 95345626 , '12445,12329, ブドウ,キュウイ
5 95233250 ,, '14393,12325,14393, スイカ,バナナ,スイカ


1 91232310 12124 リンゴ
2 92311232 12124 パイナップル
3 92311232 12124 パイナップル
4 93232535 12359 オレンジ
5 93232535 12124 バナナ
6 95345626 12445 ブドウ
7 95345626 12329 キュウイ
8 95233250 14393 スイカ
9 95233250 12325 バナナ
10 95233250 14393 スイカ

③データを加工して以下のようにしたい
1 91232310 12124 リンゴ
2 92311232 12124 パイナップル
3 93232535 12359 オレンジ
4 93232535 12124 バナナ
5 95345626 12445 ブドウ
6 95345626 12329 キュウイ
7 95233250 14393 スイカ
8 95233250 12325 バナナ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

地道に1行ずつ下記の処理を当てていく形になりそうです。

ところどころ「"」「,」だったり余分なものが入っています。

例で5行まで書いたのですが、何行か分かりません。
c列は必要な番号があったり、いらない空白があったりしています。

Replaceで不要なデータを指定して削除。
複数回使うと思うのでReplaceだけ回す自作関数を作っておけば今後も流用出来ます。

B列をコピーC列に番号がない場合、E列の最初の番号とF列の最初の番号をコピーして1行

C列に番号があれば、C列とD列をコピーして1行

if文でC列の文字列の長さが0("")か判別して分岐。

E列にカンマ区切りの番号が複数ある場合

inStr関数なら先頭の指定文字位置を検索できるのでLeft関数でコピー。
残りの文字列をMid関数(末尾はLen関数で取得)で取得して文字列の長さをif文で判定して分岐。
Trueなら再度inStr関数を使い抜き出す。

②のデータで番号の重複箇所があれば削除して最終的には③にして別シートにコピーしたいです。

→裏で③のような形にしてから別シートにコピーしたいです。

ソートして上下比較したりなど方法は色々ありますが下記の記事が一番近いのでは?
重複削除してコピー(AdvancedFilter)

投稿2021/02/18 00:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

VBA

1Sub sample() 2 3 Dim ①, ②, ③, 行, A列, B列, C列, D列, E列, F列, データ, キー, 連番, i 4 5 Set ① = Worksheets("元シート") 6 Set ② = CreateObject("Scripting.Dictionary") 7 Set ③ = Worksheets("結果シート") 8 9 '①シートの使用されている範囲を1行ごとに処理 10 For Each 行 In ①.UsedRange.Rows 11 12 '各列の値を取得 13 A列 = 行.Columns("A") 14 B列 = 行.Columns("B") 15 C列 = 行.Columns("C") 16 D列 = 行.Columns("D") 17 E列 = 行.Columns("E") 18 F列 = 行.Columns("F") 19 20 '余分なものを除去 21 C列 = Replace(C列, ",", "") 22 E列 = Replace(E列, "'", "") 23 24 'カンマで分割 25 E列 = Split(E列, ",") 26 F列 = Split(F列, ",") 27 28 'C列が番号だったらB列, C列, D列を②に入れる(重複した場合は入れない) 29 If IsNumeric(C列) Then 30 データ = Array(B列, C列, D列) 31 キー = Join(データ, vbTab) 32 If Not ②.Exists(キー) Then ②.Add キー, データ 33 34 End If 35 36 'E列が番号だったらB列, E列, F列を②に入れる(重複した場合は入れない) 37 For i = 0 To UBound(E列) 38 If IsNumeric(E列(i)) Then 39 データ = Array(B列, E列(i), F列(i)) 40 キー = Join(データ, vbTab) 41 If Not ②.Exists(キー) Then ②.Add キー, データ 42 End If 43 Next 44 DoEvents 45 Next 46 47 '②から取り出して③シートに出力 48 For Each データ In ②.Items 49 連番 = 連番 + 1 50 ③.Cells(連番, "A") = 連番 51 ③.Cells(連番, "B") = データ(0) 52 ③.Cells(連番, "C") = データ(1) 53 ③.Cells(連番, "D") = データ(2) 54 Next 55 56 57End Sub 58 59

投稿2021/02/18 00:17

編集2021/02/18 03:55
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LifeGrow

2021/02/18 21:22

ありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問