• 締切済み

エクセルを並替えコード変換したものをCSVにしたい

画像のような、取引先別に横長に管理しているデータがあります。 それを取引先の品目ごとに縦に並び替え、 さらに、対応するコードにできるようなマクロを作成したいのですが、 並び替えと、コード変換が上手くいきません。 何か良い方法があれば、ご教授よろしくお願いいたします。

  • aape
  • お礼率0% (0/5)

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.5

> それを取引先の品目ごとに縦に並び替え、 > さらに、対応するコードにできるようなマクロを作成したいのですが、 > 並び替えと、コード変換が上手くいきません。 つまり、 「構想以外は何もできていないから作ってくれ」 という事ですね(笑)。 さておき。 ピボットテーブルの逆の発想ですね。 逆の順番(下から上へ)でピボットテーブルを作るのは簡単なんですけどね。 単純に出来るように書いてみました。 が、内容が解らず、メンテナンスが困難だと思ったら、 マクロは使わない方が無難です。 とらぶった時やレイアウトが変わった時に触れないと意味が無いですから。 条件として ・「集計表」シート(元のシート)はA1セルから表が始まっていること ・「コード」シートには、    A:Bセルに取引先コード表(A列にコード、B列に名前)    D:Eセルに商品コード表(D列にコード、E列に商品名)  をそれぞれ用意すること ・↑の取引先名称・商品名は空白(スペース)も含めて一字一句相違が無いこと が現状のコードの「最低条件」です。 エラー処理を全く考慮していないので、 これらの条件を守られていないとエラーで止まります。 これらの条件をクリアすると、データを加工し、並べ替え、CSVファイル作成まで 一気に終わらせることが可能です。 ちなみに、縦100件・横50件=5000件のデータで10秒ほどかかってしまいます。 Sub test() Dim ASH As Worksheet, BSH As Worksheet, CSH As Worksheet Dim i As Long, j As Long, k As Long Application.DisplayAlerts = False For Each BSH In Worksheets If BSH.Name = "リスト" Then BSH.Delete End If Next Set ASH = Worksheets("集計") Set BSH = Worksheets.Add(after:=Worksheets(Worksheets.Count)) BSH.Name = "リスト" Set CSH = Worksheets("コード") k = 1 For i = 2 To ASH.Cells(ASH.Rows.Count, 1).End(xlUp).Row For j = 2 To ASH.Cells(1, ASH.Columns.Count).End(xlToRight).Column If ASH.Cells(i, j) > 0 Then BSH.Cells(k, 1) = ASH.Cells(i, 1) BSH.Cells(k, 2) = ASH.Cells(1, j) BSH.Cells(k, 3) = ASH.Cells(i, j) k = k + 1 End If Next Next With BSH .Activate For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row CSH.Activate .Cells(i, 1) = CSH.Cells(Range("B:B").Find(what:=.Cells(i, 1).Value, lookat:=xlPart).Row, 1) .Cells(i, 2) = CSH.Cells(Range("E:E").Find(what:=.Cells(i, 2).Value, lookat:=xlPart).Row, 4) Next End With With BSH .Activate .Sort.SortFields.Add Key:=Range("A:A"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .Sort.SortFields.Add Key:=Range("B:B"), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal With .Sort .SetRange Range("A1", Range("A1").SpecialCells(xlLastCell)) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With ActiveWorkbook.SaveAs Filename:="c:\共有用\リスト.csv", _ FileFormat:=xlCSV, _ CreateBackup:=False Set ASH = Nothing: Set BSH = Nothing: Set CSH = Nothing Application.DisplayAlerts = True End Sub 繰り返しますが、メンテナンス出来そうにないなら使わない方が無難です。 万が一データが壊れても私は責任を取れませんので。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんにちは! 元データはSheet1にあり、B1セル以降右側に品目が列挙、A2セル以降2行目から取引先があるとします。 Sheet2にSheet1の単なる並び替え、Sheet3にSheet2のコード表示 としての一例です。 Alt+F11キー → メニュー → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, j As Long Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Set wS3 = Worksheets("Sheet3") Application.ScreenUpdating = False wS2.Cells.ClearContents wS3.Cells.ClearContents With wS2.Cells(1, 1) .Value = "取引先" .Offset(, 1) = "品目" .Offset(, 2) = "数量" End With For i = 2 To wS1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column With wS2.Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = wS1.Cells(i, 1) .Offset(, 1) = wS1.Cells(1, j) .Offset(, 2) = wS1.Cells(i, j) End With Next j Next i wS2.Cells.Copy wS3.Cells(1, 1) With wS3.Cells(1, 1) .Value = "取引先コード" .Offset(, 1) = "品目コード" End With For i = 2 To wS3.Cells(Rows.Count, 1).End(xlUp).Row With wS3.Cells(i, 1) If .Value = "取引先A" Then .Value = "A000" Else .Value = "B001" End If .Offset(, 1) = Replace(.Offset(, 1), "品目", "1000") End With Next i Application.ScreenUpdating = True End Sub 'この行まで ※ コード表示については質問通り2種類だけしか考慮していません。 仮にもっとデータがある場合はコード表を作成し、それを参考にしなければなりません。 この程度ですが参考になりますかね?m(_ _)m

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

取引先や品目に対応したコードの表が別に用意されているとして説明します。 初めの表がシート1に有るとしてA1セルは空白の状態でお示しのようにあるとします。 そこでシート2には並び替えた表を表示させるとしたら例えばA2セルに次の式を入力してC2セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>COUNTIF(Sheet1!$A:$A,"?*")*5,"",IF(COLUMN(A1)=1,INDEX(Sheet1!$A:$A,ROUNDUP(ROW(A1)/5,0)+1),IF(COLUMN(A1)=2,INDEX(Sheet1!$1:$1,MOD(ROW(A1)-1,5)+2),IF(COLUMN(A1)=3,INDEX(Sheet1!$B:$F,ROUNDUP(ROW(A1)/5,0)+1,MOD(ROW(A1)-1,5)+1),"")))) これで並べ替えを行った表が表示されます。 コードの表にするためにはシート3にコードの表が有るとします。 A列には取引先名が例えば取引先Aのように、B列には対応するコード番号が例えばA100のように、また、C列には品目名が、D列には対応するコード番号がそれぞれ入力されているとします。 そこでコードに変換した表ですがシート2のE列からG列に表示させるとしたらシート2のD2セルには次の式を入力してG2セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF($A2="","",IF(COLUMN(A1)=1,VLOOKUP($A2,Sheet3!$A:$B,2,FALSE),IF(COLUMN(A1)=2,VLOOKUP($B2,Sheet3!$C:$D,2,FALSE),IF(COLUMN(A1)=3,$C2,""))))

noname#192382
noname#192382
回答No.2

並べ替えは次のマクロをコピーして使ってください。コード変換は並べ替えの前に実行するのがよいです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2013/1/31 ユーザー名 : ' ' Dim mygyos1 As Integer, mygyos2 As Integer, myretus1 As Integer, i As Integer For mygyos1 = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row mygyos2 = (mygyos1 - 2) * 5 + 1 myretus1 = 2 For i = 1 To 5 Sheets("Sheet2").Cells(mygyos2, 1) = Sheets("Sheet1").Cells(mygyos1, 1) Sheets("Sheet2").Cells(mygyos2, 2) = Sheets("Sheet1").Cells(1, myretus1) Sheets("Sheet2").Cells(mygyos2, 3) = Sheets("Sheet1").Cells(mygyos1, myretus1) mygyos2 = mygyos2 + 1 myretus1 = myretus1 + 1 Next Next MsgBox (Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row) End Sub

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

コードでB001となっているのになぜA000なのですか?

aape
質問者

補足

判りづらくてすいません。 取引先AのコードがA000 取引先BのコードがB001 になります。

関連するQ&A

  • EXCELからCSVを作るときに文字コード変換

    sys-jisで作成したEXCELからCSVを作るときに文字コードをutf-8またはeuc-jpに自動変換できるようにすることは可能でしょうか。 あわせて、データが入っているセルには、””が自動で入れることは可能でしょうか。 その場合の方法について教えていただけないでしょうか。 よろしくお願いいたします。

  • Excelでテキスト変換マクロ

    あるデータ内のテキストの一斉変換マクロ(パッチのようなイメージ) を作成したいです。 データ内にあるコード番号のそれぞれにある名称が対応しています。 たとえば 001 → A 002 → B という感じです。 このようなデータの一斉変換マクロの作り方について アドバイスいただきたくて質問させてもらいました。 データは1つだけではなく、随時追加されていくので 一度だけの変換ではなく、パッチのような感じで適時利用できる形を考えています。 この関数を使えばいい、とかこのサイトが参考になるとか いろいろご回答いただければ助かります。 よろしくお願いいたします。

  • CSVをExcelに変換したい

    お世話になります。 CSVファイルをExcelファイルに変換する場合、CSVファイルをExcelで開いて拡張子を「xls」もしくは「xlsx」を指定して保存すればよいかと思いますが、PCにExcelがインストールされてない環境の場合、Excelに変換することは不可能でしょうか。 今回、Accessにてツールを作成し、CSV(カンマ区切り)のデータを読み込もうとしておりますが、そのデータの中には単語の中にカンマが含まれているものがある為、普通にCSVをインポートしようとすると、ズレてしまいます。 なので、インポートする前準備としていったんExcelに変換したいと考えているのですが。。そのPCにExcelがインストールされてないと、やはり変換することは出来ないでしょうか。 もしくは、カンマ区切りのCSVファイルをタブ区切りに変換したりすることは出来ますでしょうか。 ご教授の程、宜しくお願い致します。

  • コード変換について

    はじめまして VB初心者です。 以下のような処理を行いたいのですがご教授願います。 項目A(漢字10文字)があります。 項目Aの中には外字で作成した漢字が埋もれています。 項目Aを参照し、そこにある外字コードを判断し 別の外字コードに変換したい。 ロジック的には1文字(2バイト)を読み込み 外字をバイナリ判定して別のコードに置き換えする 処理をしたい。 当方vb6.0ですが 定義の方法、ロジックなど教えていただければ幸いです。

  • 文字コード変換について

    お世話になります。フォームのデータをcsvファイルで 蓄積するcgiを作成しました。csvファイルはeucコード で保存されています。このcsvファイルを、nkfコマン ドみたいに、s-jisコード変換して別ファイルを作成することは出来るのでしょうか?よろしくお願いいたし ます。 環境 OS redhat9

    • ベストアンサー
    • CGI
  • CSVファイルの文字コード変換について

    CSVファイルをアップロードし、文字コードをSJISからEUC-JPに変換したいのですが、文字化けが発生します。 ソースは以下のようになっています。 $i=0; $file = fopen($file_path,"r"); while ($data = fgetcsv($file, $file_size, ',')) { for ($j=0; $j < count($data); $j++) { $Array[$i][$j] = mb_convert_encoding($data$j], "EUC", "auto"); }$i++; } PHP5を使用しており、エクセルとテキストエディターでCSVファイルを作成してみましたが結果はどちらも同じでした。 どなたかご教授願います。

    • 締切済み
    • PHP
  • フィリピンの貿易品目のPSCCコードを教えてください。

    祝・初めての投稿です。 フィリピンの貿易産業省のHPに入ると、 貿易相手国別、品目別に取引量が出てくるのですが、 品目別の場合だと、PSCCコードというものが必要になります。 サイト内を探したのですが、コードについて詳しく載っていません。 どなたか、どの品目がどのコードなのか、一覧表みたいなものを 知っている方いませんか? お手数かけますが、よろしくお願いします。

  • CSVのデータ変換ツール

    こんなツールあるのか教えてください。 会社の取引先が多数に及び、その取引先単位で全く異なるCSVフォーマットでデータを送付してきます。毎回社内の統一化されたフォーマットへコピペで取り込んでいるのですが、あまりに非効率的なので便利なツールを探しています。 データは、取引先毎に列の並びが全く異なっていて、明細行が複数に分かれている場合もあり、統一性があまりないため取引先単位で読み込みルールを一度定義し、次回からはツールの使用のみで自動フォーマット変換ができることが望ましいです。Vectorでツールを探してみたのですが、複数行に渡るデータを変換できるツールや、列順を変更できるツールというのは見つかりませんでした。そんなツール存在しない、というのであれば自社で開発するしかないと思うのですが。。。

  • コード変換表をExcelで作成したい

    画像のような変換表を作りたいです。 C23に文字を入力すると、表に対応するコードがC24に表示されるようにします。 例えば、C23に「A」と入力すると、「01000001」と表示します。 VLOOKUPなどで簡単にできるかな?と思ったのですが、うまくいきません。

  • ★エクセルマクロコード教えていただけますでしょうか

    マクロのコードを組みたいと考えておりますが、 ほとんど初心者のため、お詳しい方の力を貸していただきたい次第でございます。 m(__)m ○オートフィルターーでデータをソートし、そのソートごとのシートを自動作成。  その後、そのシートを各フォルダに保存したい。 あるデスクトップ上にあるエクセルシート「管理DB」の「sheet1」にある管理データ A列(グループa~e)、B列(登録日)、C列(ステータス)によって構成されているシートで、 1.A列「グループ」「a」でオートフィルター 2.その中でB列、「登録日」が「2012年9月」以前のものをオートフィルター 3.その中で、さらに「ステータス」が「在庫中」のものをオートフィルター 4.3段階のオートフィルター後にできた結果を、別のエクセルシートとして作成。 5.そのエクセルシートをデスクトップにある「フォルダX本部」に保存。 1~5の一連の作業をグループがなくなるまで繰り返したいと考えています。 1.A列「グループ」「b」でオートフィルター 2.その中でB列、「登録日」が「2012年9月」以前のものをオートフィルター 3.その中で、さらに「ステータス」が「在庫中」のものをオートフィルター 4.3段階のオートフィルター後にできた結果を、別のエクセルシートとして作成。 5.そのエクセルシートをデスクトップにある「フォルダY本部」に保存。 ※一連の作業の中で、グループ名と、シートの保存先が変わる以外、この作業の繰り返し。 以上の作業を実行するマクロを組むことは可能でしょうか。 また、マクロのコードを教えていただけると幸いです。 マクロについてお詳しい方、何卒よろしくお願いいたします。

専門家に質問してみよう