• 締切済み

エクセルを用いて商品データを処理しています。

エクセルを用いて商品データを処理しています。 ある特定の列に「-(ハイフン)]が含まれるものがあり、 その行を毎回手作業 検索などで見つけて その後 その行をコピーしたりしてなど下記処理を行っているのですが、 この作業をVBAなどで簡単に行える方法を教えて下さい。 ・行数は毎回不定。 ・列の数は固定で特定文字が含まれる列も毎回同じ。 ・特定の列には半角英数で製品の管理番号が入っており、  例えば0001とか00466など入っていて、その中で0001-0023みたいに[-]で  くくられたものを探して、その行をコピーしてから  上の行(元々の行)の特定文字が入っていた箇所に前の製品番号(0001)、  コピーして挿入した次の行にはうしろの製品番号の0023を列に入れ  それ以外の内容はもともとの行の内容をコピーしたものにする。 列の項目は、左から管理番号,商品名,管理番号,数量・・・固定項目で30項目ぐらい それぞれの行に半角8桁,全角半角混在,半角英数と一部に-くくり,半角・・・ 行数は処理するカテゴリによって増減あり。 このC列の管理番号に含まれる[-]でのくくりをバラバラにして処理みたいな感じです。 この繰り返しを行う方法です。 もちろん条件書式などで色つけしたりして探してはいるのですが、 コピーして書き換えて・・・の処理が多いので大変困っているのでお願い致します。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

質問の表現が判りにくい。 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)
回答No.3

一例です。 因みに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)
回答No.2

マクロを利用しないでも以下のような操作で簡単にハイフン入りの文字列を分割することができます。 エクセルのバージョンが明記されていないので、Excel2007で説明すると、データベース上にカーソルを置いて、「データ」「フィルタ」で該当の列の▼をクリックし「数値フィルタ」「ユーザー設定フィルタ」で「-」「を含む」にして該当データをすべて抽出します。 フィルタされたデータ範囲を選択して「コピー」、そのデータの下に「貼り付け」し、ハイフンの行だけを選択して、Ctrl+Hで置換ダイアログを出して、「検索する文字列」に「-*」、置換後の文字列には何も入力せず「すべて置換」し、続けて「検索する文字列」に「*-」と入力し「すべて置換」をクリックします。 上記の操作を新しいマクロの記録で記録すれば、マクロでハイフン入りのデータを、ボタン一発で2つに分割することができます。 2つに分割したデータを上下に並べたい場合は、補助列に連続番号を入力して、最後にこの補助列で並べ替える操作を行ってください(必要に応じて処理後に補助列を削除する)。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

こんな感じでどうでしょうか? 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

関連するQ&A

  • エクセルのマクロでデータを左につめていく

    お世話になります。エクセル2002でマクロを作成しようと思っています。 毎回同じ処理をしているので、良いサンプルがあったら教えてください。 やりたいこと  A列からF列にランダムにデータが入力されています。  このデータをA列、B列、C列と、左に詰め表示させたいです。  ※G列以降にもデータが入力されていますが、処理したい列範囲はA列~F列です。  ※行数は、都度変わります。(UsedRange.Rows.Countで値を取得) イメージ(処理前)  -  : 空白セル  *** : データが入力されているセル     A列   B列  C列  D列  E列   F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 - -   -  *** *** *** 4行目 ***  -   -   -   -   -  5行目 *** *** -   *** -   -  イメージ(処理後)     A列  B列  C列   D列  E列  F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 *** *** *** - -   - 4行目 ***  -   -   -   -   -  5行目 *** *** *** -   -  -

  • Excelで行番号に応じての処理

    よろしくお願いします。 C列に3行ごとに規則正しくみっちり1000行ほどの文字列があります。 1 品番 2 商品名 3 備考 4 品番 5 商品名 6 備考 7 品番 自動的に2つの処理をしたいのですが、わからなくて困っています。 いずれもC列をD列にコピーするときの処理です。 1) 行番号が3の倍数のときにはコピーせず(空白)、1と2との時はコピー。 ※品番と商品名だけをコピー 2) 品番だけ、フォントを変えたい よろしくお願いします。※Excel2007です

  • EXCELで、画像のような表があり、2、3、4、6、7、8、10、11

    EXCELで、画像のような表があり、2、3、4、6、7、8、10、11行目をフィルタで抽出したいのですが、どのようにすればできますか? やりたい事は項目行(1月第○週)と項目行との間で、B列~D列にデータが入っていたら、その行とその上の項目行をフィルタで抽出したいです。 項目行(1月第○週)以外のデータが入っている行は作業用の列でCOUNTIFで抽出できるのですが、項目行(1月第○週)の抽出ができません。 項目行(1月第○週)と項目行の間の行数が固定であれば、項目行にIF(COUNTIF(B3:D5,"〇"),1,"")という関数をかければ、できると思うのですが、項目行(1月第○週)と項目行の間の行数は2行の場合もあれば、7行の場合もあり固定ではありません。 全体の行数は5000行程あり、手動でやるには限界があります。 どうすれば出来るでしょうか? アドバイスお願いいたします。

  • エクセルの並べ替えについて

    エクセルでの並べ替えについて教えてください。 Aという製品の製造番号をA列に上から順に入れていきます Bという製品の製造番号はB列に・・・・ Cという製品の製造番号はC列に・・・・ (以下省略) それぞれの製品の数は、バラバラなので A列は3行目まで、B列は10行目まで、C列は5行目まで・・のように使う行数はバラバラです。 ここで、関数等使用して行数の多いもの(又は少ないもの)の順に並べ替える方法はあるのでしょうか? 上の例でいうと、(多いもの順)=B列→C列→A列の順に並べかえることができるのかどうかということです。 つまり

  • エクセルの関数について

    A列に顧客番号があります。 毎日売上の集計を行った結果をC列にコピーします。 C列も顧客番号で、D列以降に日々の売上額が集計されています。 A列とC列は同じ顧客番号のため 行を合わせたいと思っています。 ※A列に顧客番号を置いているのは特定の顧客のみコピーしているため。 コピー後でも良いので、A列とC列の顧客の行を合うように関数などを組んで処理できないでしょうか?

  • Excel VBA等での処理方法

    下記のような2行の表を、1行に組みなおす場合にどのようなこーどが書けばよいか教えてください。お願いいたします。 下記のように表1から表2のように組みなおしたいのですが。A列には必ずしも数字が入っているとは限りません。また、行数も特定されていません。

  • エクセルシートの文字列加工について

    エクセルのシートのA列に"全角ひらがな漢字"の文字列と"半角英数"の文字列を含むセルが縦に並んでいます。約200行。 ■この中から、"全角ひらがな漢字"の文字列を右となりのB列に、"半角英数"の文字列をさらに右となりのC列に、それぞれコピーしたいのですが、関数・マクロなどでいい方法がありましたら教えて下さい。 ■それから、半角英数文字列のC列から、""で囲まれた文字列のみをさらにD列にコピーしたいのです。 文字列の長さが統一されていれば、比較的簡単なのですが、今回は文字列の長さが不規則です。よろしくお願いします。

  • エクセルで2つの項目を下から規定数のデータでグラフ

    15枚のシートに同じ書式の表がありそのシート上に任意の2列の列データを下から30個指定してグラフ化したいのです。 表に空白セルは無く、データ数が30個以下の場合は全数でグラフ化したい。 製品A、製品B・・・というように製品名のシートが15枚あります。 この表の2列のデータを下から30個でグラフ化したく。列は固定することも可です。 データ数や項目行やデータの開始行は下記の様にコード中で指定でも問題なく使用できると思いますが、もし可能なら添付の図のように決まったセルから指定できれば最高です。 コード中での指定の場合表がずれた場合に不都合になってしまいますが、今のところ表の位置を合わせることもできそうですので必須条件ではありません。 Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 5 '1つ目データ格納列 Const ColNum2 = 7 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号

  • EXCEL 複数シートにおけるマッチング処理

    悩んでいます、添付画像のような3つのEXCELファイルがあり、結果1のような表にマッチング処理したいのですがなかなか考えがまとまりません。おそらく関数では難しくVBAで処理するのだろうかと思いますが経験が浅く手詰まり状態です。恐れ入りますがご指南のほどよろしくお願いします。 1.A列がキー項目となります。 2.表1、2、3とも列数は固定です。 2.表1は行が一意です。(マスター) 3.表2、3は行が複数行存在します。(必ず1行以上は存在します) 4.キー項目に関して表2、3は行数がイコールの場合もありますし異なる場合もあります。 5.上記4の場合、結果1または結果2のように表示したいのです。 5番の要件で苦慮しています。どうかよろしくお願い致します。

  • エクセル、変動する印刷範囲の設定

    変動するデータを自動的に範囲設定して印刷したいです。 エクセル2007を使用しています。 sheet1を元データとして、sheet2で元データの必要項目だけ選んで表を作成しています。 sheet2は5000行×15列の表で罫線も引いてます。 元データは毎回変動するので、データの入っているところだけ自動的に印刷できるようにしたいです。 行数が毎回変動します。列は15列で固定ですが、印刷は12列迄で固定です。 すいませんが、教えてください。

専門家に質問してみよう