dポイントプレゼントキャンペーン実施中!

在庫管理のデータで1万件ほどあります。
データの中に下記のようにいくつかの列があります。

[商品名] [種別1] [種別2]・・・
CC123  A01   BB281
RT426  A02   BB456

と続いていくのですが、種別2にあるデータを種別1にあるデータに変換をしたいです。
具体的には、
種別2にあるデータ”BB281”を列を変えずに種別1にある”A02”に変換したいのです。

[商品名] [種別1] [種別2]・・・
CC123  A01   A02
RT426  A02   BB456

修正後は上記のようになるといいのですが、やり方がわからず・・。
同じ種別1の列にあるものは
ActiveSheet.Columns(2).Replace What:="B111", Replacement:="C6505"
と書いて済ませていたのですが、違う列にするときはどうしたらよいか教えてください!

よろしくお願いします。

A 回答 (4件)

行数が変わるので別シートに出力します。


元がSheet1で出力がSheet2です。
1行目が項目名とします。Sheet2も項目名だけは先に入力しておいて下さい。

[商品名] [種別1] [種別2]・・・
なのでデータは種別2より右もあるのでしょうが、それは考慮していません。
Sheet2にも出力しません。ここが必要でご自分でコードを修正できなければ、下記2点を補足して下さい。
1.横にどこまで項目をつけるのか。
2.データが変換により2行になった時、その右部分はどうするのか。

Sub Sample()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim i As Long, j As Long
Dim w_find As Variant
Dim w_rep As Variant
Dim cnt As Integer
w_find = Array("BB281", "BB501", "ZA441", "ZA551", "1322A")
w_rep = Array("A02", "A02", "Z23", "Y12", "C11")
Application.ScreenUpdating = False
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
j = 1
With sh1
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
j = j + 1
sh2.Range("A" & j).Value = .Range("A" & i).Value
sh2.Range("B" & j).Value = .Range("B" & i).Value
'変換コードがあるかチェック
For cnt = 0 To 4
If .Range("C" & i).Value = w_find(cnt) Then
'あった時
j = j + 1
sh2.Range("A" & j).Value = .Range("A" & i).Value
'入れ替えたもの
sh2.Range("B" & j).Value = w_rep(cnt)
Exit For
End If
Next cnt
'なかった時
If cnt = 5 Then
sh2.Range("C" & j).Value = .Range("C" & i).Value
End If
Next i
End With
Application.ScreenUpdating = True
sh2.Select
End Sub
    • good
    • 0
この回答へのお礼

jmuinyさま
ありがとうございます!!!
前後のスクリプトのせいで、一瞬だめかと思いましたが、少し直したら
いけました!!!すごいですーーー!
ありがとうございます!
こんな説明不足な質問に根気よく付き合っていただいて本当に助かりました。
ありがとうございました!
もちろん!ベストアンサーで^^

お礼日時:2016/11/05 18:37

5つ限定ならIF文が長くなりますが、それでいいなら書けます。


コードをお望みならその5つのパターンを具体的にして下さい。

それとちょっと気になるのですが、
[種別1] [種別2]・・・
となっていますが、種別3以降もこの処理の対象になるのですか?
つまり
[商品名] [種別1] [種別2] [種別3]
CC123  A01   ZZZ   BB281
のようなものがありますか?あったらどのように表示したいのでしょうか、という質問です。
3行にする??
そこまで考えると結構複雑になってしまいます。

要件がきちんと決まって理解できたらコードを作成します。
    • good
    • 0
この回答へのお礼

jmuinyさま、お返事が遅くなってしまってごめんなさい!
お礼を書いたはずだったんですが、確認画面で終わらせてしまったようです、ごめんなさいー!

5つのパターンは以下の通りです。
BB281→A02
BB501→A02
ZA441→Z23
ZA511→Y12
1322A→C11

そして変換したいBB281たちのデータは必ず種別2に入っていて、
変換後のデータは種別1に必ず入っています。

こんな感じなのですが、十分な説明になっていますでしょうか。
ほんとにごめんなさい。もしお時間あればよろしくお願い致します!

お礼日時:2016/11/05 06:48

>種別2にある「BB281」は種別1にある「A02」と内容がほぼ同じなので


これは、内容がわかっている人だけに通じる事ですよね。

何をもってほぼ同じとすればいいのでしょう。
変更したい番号の対応表を作成して、それを元に入れ替えていく方法にしないと無理です。

つまり
A列__B列
BB281_A02
CC111_A03
のような表を作成する必要があるという事です。

変更が3つくらいまでなら、IFでやってしまってもいいと思いますが。
替えたいものはいくつあるのですか?
    • good
    • 0
この回答へのお礼

そうですよね(>_<)内容を知らない人にはわからない説明でした。
すいませんー!

変換したいものは多くなくいのですが、全部で5つになります。
Ifでいけそうでしょうか?

お礼日時:2016/11/04 13:07

「BB281」が「A02」になる条件は何ですか?


この変換だけの固定なら

IF Range("C" & i).Value = "BB281" Then
Range("C" & i).Value = "A02"
End if

を繰り返すだけでいいですが、他にも変換したいものがあるのですよね。
その規則がわかりません。
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます!
そしてすばらしいご指摘・・・そうですよね、規則がわからないですよね。
すいません。自分自身、整理しなければいけないデータが多すぎて混乱していました。
もう一度整理して、訂正させてください。

何をしたいかというと、
種別2にある「BB281」は種別1にある「A02」と内容がほぼ同じなので
「A02」と一緒にしてしまいたい、というのがやりたいことです。

つまり、
[商品名] [種別1] [種別2]・・・
CC123  A01   BB281
RT426  A02   BB456

の状態を

[商品名] [種別1] [種別2]・・・
CC123  A01   
CC123  A02
RT426  A02   BB456

としたい、ということでした・・・。
素人説明で恐縮です。よい方法があればぜひ教えてください。

お礼日時:2016/11/04 09:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!