色々探してみたのですが、わからず大変困っています。宜しくお願い致します。
やりたいこと:下記のデータから、共通する部分を除外して特定セルに貼付けたい。
<補足説明>
共通部分が1ヵ所の物と、2か所の物がありますので、出来れば両方抽出したいですが、もし2か所あると不可な場合は、共通部分1ヵ所のみの抽出でお願い致します。
※共通部分は最大2か所迄で、位置はランダムです。
※データ数は1~3000です。
※商品名の列はH列、抽出した文字列はV列に貼り付けます。
説明文も入れてくださると大変助かります。
【元データ】
セルH2:ボールペン あいう
セルH3:バッグA ブラック abc
セルH4:バッグA オレンジ abc
セルH5:バッグA レッド abc
セルH6:シャツB ブラック アイウ S
セルH7:シャツB ブラック アイウ M
セルH8:シャツB ブラック アイウ L
セルH9:シャツB ブルー アイウ S
セルH10:シャツB ブルー アイウ M
セルH11:シャツB ブルー アイウ L
【下記のようにしたい】 ※V列の文字列は半角スペースで区切りたいです。
セルH2:ボールペン あいう セルV2:
セルH3:バッグA abc セルV3:商品選択 ブラック オレンジ レッド
※もしくは、ブラック オレンジ レッド
セルH4: セルV4:
セルH5: セルV5:
セルH6:シャツB アイウ セルV6:商品選択 ブラック ブルー改行改行商品選択1 S M L
※もしくは、ブラック ブルー改行改行S M L
セルH7: セルV7:
セルH8: セルV8:
セルH9: セルV9:
セルH10: セルV10:
セルH11: セルV11:
※最終的には、下記のようにしたいです。
セルH2:ボールペン あいう セルV2:
セルH3:バッグA abc セルV3:商品選択 ブラック オレンジ レッド
セルH4:シャツB アイウ セルV4:商品選択 ブラック ブルー改行改行商品選択1 S M L
No.4ベストアンサー
- 回答日時:
No.3です。
補足を読みました。
最初の質問とはサンプルがかなり異なるようですが・・・
いずれにしてもSheet1のH列データは最後が「色」になっているという前提です。
尚、色の前のスペースは半角でも全角でも対応できるようにしています。
そして、Sheet3を作業用のSheetとして使用していますので、
最低3Sheetあり、Sheet3は全く使用していないSheetにしてください。
標準モジュールに↓のコードをコピー&ペーストしてマクロを実行してみてください。
Sub Sample2()
Dim i As Long, k As Long, str As String, lastRow As Long, c As Range
Dim wS2 As Worksheet, wS3 As Worksheet
Set wS2 = Worksheets("Sheet2")
Set wS3 = Worksheets("Sheet3")
Application.ScreenUpdating = False
With Worksheets("Sheet1")
lastRow = wS2.Cells(Rows.Count, "H").End(xlUp).Row
If lastRow > 1 Then
Range(wS2.Cells(2, "H"), wS2.Cells(lastRow, "H")).ClearContents
Range(wS2.Cells(2, "V"), wS2.Cells(lastRow, "V")).ClearContents
End If
.Range("H:H").Replace what:=" ", replacement:=" ", lookat:=xlPart
For i = 2 To .Cells(Rows.Count, "H").End(xlUp).Row
If InStr(.Cells(i, "H"), " ") > 0 Then
str = Left(.Cells(i, "H"), InStrRev(.Cells(i, "H"), " ") - 1)
Set c = wS3.Range("A:A").Find(what:=str, LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
wS3.Cells(Rows.Count, "A").End(xlUp).Offset(1) = str
End If
End If
Next i
For k = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To .Cells(Rows.Count, "H").End(xlUp).Row
If InStr(.Cells(i, "H"), wS3.Cells(k, "A")) > 0 Then
If wS3.Cells(k, "B") = "" Then
wS3.Cells(k, "B") = Trim(Replace(.Cells(i, "H"), wS3.Cells(k, "A"), ""))
Else
wS3.Cells(k, "B") = wS3.Cells(k, "B") & " " & Trim(Replace(.Cells(i, "H"), wS3.Cells(k, "A"), ""))
End If
End If
Next i
Next k
End With
lastRow = wS3.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS3.Cells(2, "A"), wS3.Cells(lastRow, "A")).Copy wS2.Range("H2")
Range(wS3.Cells(2, "B"), wS3.Cells(lastRow, "B")).Copy wS2.Range("V2")
wS2.Columns.AutoFit
wS3.Cells.Clear
Application.ScreenUpdating = True
End Sub
今度はどうでしょうか?m(_ _)m
どうもありがとうございます。
最後に色の選択肢を付けているデータは、うまく行きました。
選択肢の無いデータも混在しているのですが、それは手作業で除いてからマクロを実行しようと思います。
おかげで随分楽になります。
大変助かりました。どうもありがとうございました。
No.3
- 回答日時:
こんばんは!
規則性がなかなか見つからないのですが・・・
H列のデータは半角スペースで区切られていて、
商品 → 色 → 商品名? → サイズ の順になっているという前提です。
(H2のように全角スペースの場合は、一つの商品と判断しています)
元データがSheet1にあり、Sheet2に表示するようにしてみました。
VBAになってしまいますが、一例です。
Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面(カーソルが点滅しているところ)に
↓のコードをコピー&ペースト → Excel画面に戻りマクロを実行してみてください)
(Alt+F8キー → マクロ → マクロ実行です)
Sub Sample1() 'この行から
Dim i As Long, c As Range, r As Range
Dim wS1 As Worksheet, wS2 As Worksheet, myArray
Set wS1 = Worksheets("Sheet1")
Set wS2 = Worksheets("Sheet2")
Application.ScreenUpdating = False
wS2.Range("A:C").ClearContents
For i = 2 To wS1.Cells(Rows.Count, "H").End(xlUp).Row
myArray = Split(wS1.Cells(i, "H"), " ")
Select Case UBound(myArray)
Case 0
Set c = wS2.Range("A:A").Find(what:=myArray(0), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) = myArray(0)
End If
Case 1
Set c = wS2.Range("A:A").Find(what:=myArray(0), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
With wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Value = myArray(0)
.Offset(, 1) = myArray(1)
End With
Else
Set r = wS2.Range("B:B").Find(what:=myArray(1), LookIn:=xlValues, lookat:=xlWhole)
If r Is Nothing Then
c.Offset(, 1) = myArray(1)
Else
c.Offset(, 1) = c.Offset(, 1) & " " & myArray(1)
End If
End If
Case 2
Set c = wS2.Range("A:A").Find(what:=myArray(0) & " " & myArray(2), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
With wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Value = myArray(0) & " " & myArray(2)
.Offset(, 1) = myArray(1)
End With
Else
If InStr(c.Offset(, 1), myArray(1)) > 0 Then
c.Offset(, 1) = myArray(1)
Else
c.Offset(, 1) = c.Offset(, 1) & " " & myArray(1)
End If
End If
Case Else
Set c = wS2.Range("A:A").Find(what:=myArray(0) & " " & myArray(2), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
With wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Value = myArray(0) & " " & myArray(2)
.Offset(, 1) = myArray(1)
.Offset(, 2) = myArray(3)
End With
Else
If InStr(c.Offset(, 1), myArray(1)) = 0 Then
c.Offset(, 1) = c.Offset(, 1) & " " & myArray(1)
End If
If InStr(c.Offset(, 2), myArray(3)) = 0 Then
c.Offset(, 2) = c.Offset(, 2) & " " & myArray(3)
End If
End If
End Select
Next i
For i = 2 To wS2.Cells(Rows.Count, "A").End(xlUp).Row
If wS2.Cells(i, "C") <> "" Then
wS2.Cells(i, "B") = wS2.Cells(i, "B") & vbCrLf & wS2.Cells(i, "C")
End If
Next i
wS2.Range("C:C").Clear
wS2.Columns.AutoFit
Application.ScreenUpdating = True
End Sub 'この行まで
※ Sheet名がある場合はコード内の「Sheet1」・「Sheet2」の部分を実際のSheet名に変更してください。
※ サンプル数が少ないので、ご希望通りの動きになるかどうか判りません。m(_ _)m
プログラムを組んで頂きまして大変感謝しております。
早速確認してみたのですが、誠に残念ながら、思った結果にはなりませんでした。
質問の仕方が悪かったようで大変申し訳ございません。文字列の例が悪かったようですので、下記に実際のデータの1例を用い、やりたい事をもう一度記載してみました。
そもそも出来ないのかもしれないのですが、全部手作業の現状より少しでも簡略化したく相談させていただいた次第です。
宜しくお願い致します。
下記1例ですが、「[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 」が共通の部分、それ以外は1行ごとに違う値となっており、共通部分の文字列とそれ以外の文字列に分けて表示したいのです。共通部分はsheet2の同じセルに、それ以外の部分はsheet2のV列の同じ行に表示(この例ですとH2~H8迄の共通部分以外の文字列をV2にまとめて表示※半角スペース区切り)する方法はありますか。
また、共通部分以外の文字列は、全部の行に表示するのではなく、最初の行のみに表示(この例ですとV2にのみ表示)し、他の行は削除したいです。削除が難しいようなら、H3~H8のデータを空白にしてもOKです。
※この例では「それ以外の文字列」は最後尾にありますが、いつも最後尾とは限りません。また、ご指摘のようにスペースも半角・全角混在しており、2つ以上スペースが連続する場合やスペース自体がないデータもあるかもしれません。ですが、スペースは全て半角スペースに置換する事は可能ですので、スペースは半角のみで連続して2つ以上存在する事はない、としていただいて大丈夫です。ただし、[PEE CLU]のように分けない部分にもスペースが含まれることはあります。
※選択肢は必ずあるわけではなく、選択肢のないデータも混在しています。
<元データ>(sheet1)
セルH2:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ネイビー
セルH3:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ワイン
セルH4:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ダークグリーン
セルH5:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ピンク
セルH6:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 オレンジ
セルH7:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ダークブラウン
セルH8:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工 ブラック
セルH9:ALICE【アリス】ショルダーバッグ ブラック ※選択肢の無いデータ
セルH10:【SALE】[DEL SSE]≪クラブトート≫A4サイズトート ブロンズ
セルH11:【SALE】[DEL SSE]≪クラブトート≫A4サイズトート ワイン
セルH12:【SALE】[DEL SSE]≪クラブトート≫A4サイズトート オレンジ
<マクロ実行後データ>(sheet2)
セルH2:[PEE CLU]≪ディリーリュック/≫2WAYリュックサック★撥水加工
セルH3:ALICE【アリス】ショルダーバッグ ブラック ※選択肢が無い為、ブラックを含む全文字列
セルH4:【SALE】[DEL SSE]≪クラブトート≫A4サイズトート
セルV2:ネイビー ワイン ダークグリーン ピンク オレンジ ダークブラウン ブラック
セルV3:空白 ※選択肢が無い為
セルV4:ブロンズ ワイン オレンジ
※H3行~H8行・H11行~H12行迄は、削除。削除が難しい場合は、H3~H8およびH11~H12のセルの値を空白セルにする。
※この例では共通部分以外の文字列は1つしかありませんが、2個の場合もあります。
No.2
- 回答日時:
>※共通部分は最大2か所迄で、位置はランダムです。
1つのセルに複数の要素があるので分類要素を区分けする必要があります。
要素の境界に特定の文字が有るときは区切り記号として切り分けられます。
提示の様子では区切り記号として空白文字が使えます。
処理結果はH列、I列、J列、K列の最大4項目に分けられます。
大分類はH列で良いと思いますが、中風類の位置が不揃いようですから手作業の前処理が必要になります。
>※商品名の列はH列、抽出した文字列はV列に貼り付けます。
処理後の情報を1つのセルに纏めると次の段階で応用するときにまた面倒な処理になるでしょう。
文字列を切り出して位置を入れ替える処理はお勧めできません。
>※最終的には、下記のようにしたいです。
細かく分けた品目を大きな括りにまとめるのはどのような意味があるのか疑問です。
在庫管理や売上管理等に使う場合は細かく分けた品目毎に数量を把握して集計で纏めれば良いので品目を大きな括りにすることは逆効果のように感じます。
希望の処理はできないことではありませんが工夫しないと無駄な労力が掛かりそうです。
回答ありがとうございます。
>処理結果はH列、I列、J列、K列の最大4項目に分けられます。
すみません。簡略化して記載しましたので、文字列は最大4項目とは限りません。それより多い場合もあります。
>処理後の情報を1つのセルに纏めると次の段階で応用するときにまた面倒な処理になるでしょう。
「商品選択 ブラック ブルー改行改行商品選択1 S M L」 の場合
次の処理は特にありません。
「ブラック ブルー改行改行S M L」の場合
「商品選択 ブラック ブルー改行改行商品選択1 S M L」への変換が必要です。
>細かく分けた品目を大きな括りにまとめるのはどのような意味があるのか疑問です。
質問の仕方が悪かったようで、申し訳ございません。商品登録の際にどうしても必要な作業となります。
CSVファイルにオプション設定を、V列のデータ形式で指定すると、同様の商品の色違いやサイズ違いの場合は、商品選択肢のある1ページのみが自動作成されますが、オプションを指定しないと、選択肢の数だけ複数ページ(商品選択肢のないページ)が作成されてしまいます。
難しそうですか?もうちょっとだけ募集させてください。全部自動は無理でも、一部自動でも助かります。最終的に欲しいと指定したものは、別シートに作成で構いません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelのセル内の特定の文字列を別のセルへ抽出したいです 2 2022/07/06 16:10
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) エクセルの書式設定の表示形式で設定した文字を文字列としてコピーしたい 1 2022/12/21 10:41
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) excelで可視セルのみ置換 3 2022/08/04 11:02
- Excel(エクセル) マクロ セルの選択 5 2022/08/12 22:47
- Excel(エクセル) Excel 数式を使用した条件付き書式が、一つのセルにしか反映されない 3 2022/06/08 23:20
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- Excel(エクセル) Excelにの以下の設定方法について教えてください! C列にデータ入力の設定をしています。(出、入を 3 2022/06/22 01:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【エクセル】IF関数 Aまたは...
-
エクセルで指定したセルのどれ...
-
エクセル 足して割る
-
Excelで数式内の文字色を一部だ...
-
貼り付けで複数セルに貼り付けたい
-
対象セル内(複数)が埋まった...
-
エクセル オートフィルタで絞...
-
【Excel】 セルの色での判断は...
-
セルをクリック⇒そのセルに入力...
-
excelのCOUNTIF関数で、『範囲=...
-
エクセルのセルの枠を超えて文...
-
EXCEL VBA セルに既に入...
-
セルの高さ(行高)を求めるには?
-
Excelでのコメント表示位置
-
エクセルの一つのセルに複数の...
-
(Excel)数字記入セルの数値の後...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
EXCELのセルの中の半角カンマの...
-
公共建築工事 共通仮設費率 エ...
-
エクセルでオブジェクトを常に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
【エクセル】IF関数 Aまたは...
-
対象セル内(複数)が埋まった...
-
エクセル 足して割る
-
Excelで数式内の文字色を一部だ...
-
貼り付けで複数セルに貼り付けたい
-
Excelでのコメント表示位置
-
セルをクリック⇒そのセルに入力...
-
EXCEL VBA セルに既に入...
-
excelのCOUNTIF関数で、『範囲=...
-
【Excel】 セルの色での判断は...
-
エクセル オートフィルタで絞...
-
エクセルのセルの枠を超えて文...
-
(Excel)数字記入セルの数値の後...
-
Excelで、「特定のセル」に入力...
-
エクセルの一つのセルに複数の...
-
複数のセルのいずれかに数字が...
-
excelの特定のセルの隣のセル指...
-
数式を残したまま、別のセルに...
-
ハイパーリンクの参照セルのズ...
おすすめ情報