- 締切済み
エクセルを用いて商品データを処理しています。
エクセルを用いて商品データを処理しています。 ある特定の列に「-(ハイフン)]が含まれるものがあり、 その行を毎回手作業 検索などで見つけて その後 その行をコピーしたりしてなど下記処理を行っているのですが、 この作業をVBAなどで簡単に行える方法を教えて下さい。 ・行数は毎回不定。 ・列の数は固定で特定文字が含まれる列も毎回同じ。 ・特定の列には半角英数で製品の管理番号が入っており、 例えば0001とか00466など入っていて、その中で0001-0023みたいに[-]で くくられたものを探して、その行をコピーしてから 上の行(元々の行)の特定文字が入っていた箇所に前の製品番号(0001)、 コピーして挿入した次の行にはうしろの製品番号の0023を列に入れ それ以外の内容はもともとの行の内容をコピーしたものにする。 列の項目は、左から管理番号,商品名,管理番号,数量・・・固定項目で30項目ぐらい それぞれの行に半角8桁,全角半角混在,半角英数と一部に-くくり,半角・・・ 行数は処理するカテゴリによって増減あり。 このC列の管理番号に含まれる[-]でのくくりをバラバラにして処理みたいな感じです。 この繰り返しを行う方法です。 もちろん条件書式などで色つけしたりして探してはいるのですが、 コピーして書き換えて・・・の処理が多いので大変困っているのでお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
質問の表現が判りにくい。 A列 B列 C列 xx 0001-0023 yy の行(B列で-が入った行)があれば A列 B列 C列 xx 0001 yy xx 0023 yy のように行を増やす、と説明すれば仕舞いではないですか。 ーーー 行をインサートするのも良いが、ForNextなどで繰り返すと、処理している行の行番号が変わるので、ロジックがやや面倒になり、別シートにアウトプットするほうが良いかなと思う。 下行から上行に処理していけば避けられるかもだが。 例データ Sheet1 A列 B列 C列 xx1 0001 yy1 xx2 0002 yy2 xx3 0003-0012 yy3 xx4 0004 yy4 xx5 0005 yy5 xx6 0006-0003 yy6 xx7 0007 yy7 xx8 0008 yy8 結果 Sheet2 xx1 0001 yy1 xx2 0002 yy2 xx3 0003 yy3 xx3 0012 yy3 xx4 0004 yy4 xx5 0005 yy5 xx6 0006 yy6 xx6 0003 yy6 xx7 0007 yy7 xx8 0008 yy8 ーーーー 標準モジュールに Sub test01() Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("Sheet1") '原シート Set sh2 = Worksheets("Sheet2") 'アウトプットシート d1 = sh1.Range("A65536").End(xlUp).Row 'Sh1最下行 k = 2 'Sh2は2行目から For i = 2 To d1 p = InStr(sh1.Cells(i, "B"), "-") 'B列に-あるか If p <> 0 Then '-があれば sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = "'" & Mid(sh1.Cells(i, "B"), 1, 4) sh2.Cells(k, "C") = sh1.Cells(i, "C") k = k + 1 sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = "'" & Mid(sh1.Cells(i, "B"), 6, 4) sh2.Cells(k, "C") = sh1.Cells(i, "C") k = k + 1 Else 'なければ sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, "B") sh2.Cells(k, "C") = sh1.Cells(i, "C") k = k + 1 End If Next i End Sub ーーー sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, "B") sh2.Cells(k, "C") = sh1.Cells(i, "C") の部分は列数が多くて羅列が面倒なときは For Next の繰り返しで表現できる(ーのあるB列以外は)。 For j=1 to c sh2.Cells(k, j) = sh1.Cells(i, j) Next j
- mu2011
- ベストアンサー率38% (1910/4994)
一例です。 因みにC列の書式は文字列を前提にしています。 Sub example01() For i = Cells(Rows.Count, "C").End(xlUp).Row To 1 Step -1 aPos = InStr(Cells(i, "C"), "-") If aPos Then preTxt = Left(Cells(i, "C"), aPos - 1) postTxt = Mid(Cells(i, "C"), aPos + 1, 99) Cells(i, "C").EntireRow.Copy Rows(i).Insert Cells(i, "C").Value = preTxt Cells(i + 1, "C").Value = postTxt End If Next Application.CutCopyMode = False End Sub
- MackyNo1
- ベストアンサー率53% (1521/2850)
マクロを利用しないでも以下のような操作で簡単にハイフン入りの文字列を分割することができます。 エクセルのバージョンが明記されていないので、Excel2007で説明すると、データベース上にカーソルを置いて、「データ」「フィルタ」で該当の列の▼をクリックし「数値フィルタ」「ユーザー設定フィルタ」で「-」「を含む」にして該当データをすべて抽出します。 フィルタされたデータ範囲を選択して「コピー」、そのデータの下に「貼り付け」し、ハイフンの行だけを選択して、Ctrl+Hで置換ダイアログを出して、「検索する文字列」に「-*」、置換後の文字列には何も入力せず「すべて置換」し、続けて「検索する文字列」に「*-」と入力し「すべて置換」をクリックします。 上記の操作を新しいマクロの記録で記録すれば、マクロでハイフン入りのデータを、ボタン一発で2つに分割することができます。 2つに分割したデータを上下に並べたい場合は、補助列に連続番号を入力して、最後にこの補助列で並べ替える操作を行ってください(必要に応じて処理後に補助列を削除する)。
- nattocurry
- ベストアンサー率31% (587/1853)
こんな感じでどうでしょうか? 1行目が項目行で、データは2行目から、という前提で作りました。 データの最初の行が2行目以外の場合は、For から始まる行の To の後ろの 2 を変更してください。 Sub test() Dim r As Long Dim c As String c = "C" '最終行から2行目まで上方向に1行ずつ処理 For r = Cells(Rows.Count, c).End(xlUp).Row To 2 Step -1 Cells(r, c).Select '←この命令を削除するとスピードアップします 'もし - があったら If InStr(Cells(r, c).Value, "-") > 0 Then Rows(r + 1).Insert '下に空行を挿入 Rows(r).Copy Rows(r + 1) '下に行全体をコピー 'その行の列Cのセルを、- の左側だけにする With Cells(r, c) .Value = Left(.Value, InStr(.Value, "-") - 1) End With '下の行の列Cのセルを、- の右側だけにする With Cells(r + 1, c) .Value = Mid(.Value, InStr(.Value, "-") + 1) End With End If Next r End Sub