エクセルデータの改列の方法について

このQ&Aのポイント
  • エクセルデータで複数の列に分割する方法を教えてください。
  • A列のセルに「aaa」と「スペース」で区切られた数列のグループを分割する方法を教えてください。
  • 50個の数字の列を含む100以上のエクセルファイルを少ない作業で分割したいです。
回答を見る
  • ベストアンサー

エクセルデータの改列の方法について

エクセルデータの改列の方法について エクセルデータでA列のセルに以下のように「aaa」と「スペース」で区切られた数列のグループを、 ___A__B__ 1|aaa|1 2|465|2 3|231|3 4|124|4 5|221|5 6|・ 7|・  ・(数は不明) ・ 10|3|84 11|スペース 12|aaa|1 13|556|2 14|245|3 15|111|4 16|232|5 17|・ 18|・ ・(数は不明) ・ 28|2|78 29|スペース 30|aaa|1 31|255|2 ・ ・ 以下のようにaaaを頭とする複数の列に分割するにはどうしたらいいでしょうか。 ___A__B__C__D・・・ 1|aaa|__|aaa|__・・・ 2|465|1|556|1・・ 3|231|2|245|2・・ 4|124|3|111|3・・ 5|221|4|232|4・・・ 6| ・ 7| ・ 各ファイル50ブロックの数字の列があり、更にファイルも100以上ありますので、 贅沢ですが、できれば作業が少ない方が。。と思っています。 どなたか教えていただけたら幸いです。 よろしくお願いします。

  • eth30
  • お礼率40% (6/15)

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

ツールメニューのマクロのセキュリティを中にしてエクセルを再起動する (Excel2007を使っていたときはExcelのオプションで行う) 空の新規ブックを一冊用意する ALT+F11を押す 現れた画面で挿入メニューから標準モジュールを挿入する 現れたシートに下記をコピー貼り付ける Sub macro1()  Dim h As Range  Dim s As String  Dim r As Long  '実際には「aaa」じゃないのは次の行を直す  Set h = Cells.Find(what:="aaa", after:=Cells.SpecialCells(xlCellTypeLastCell), LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows)  If h Is Nothing Then Exit Sub  s = h.Address  r = Cells.SpecialCells(xlCellTypeLastCell).Row  Do   Set h = Cells.FindNext(h)   If h.Address = s Then Exit Do   Range(h, Cells(r, h.Column + 1)).Insert shift:=xlShiftToRight  Loop  Cells.SpecialCells(xlCellTypeBlanks).Delete shift:=xlShiftUp  ActiveWorkbook.SaveAs Filename:=Application.Substitute(ActiveWorkbook.Name, ".xls", "r1.xls")  ’マクロの動作が確認できたら,次の行の先頭の ' を消去する ' activeworkbook.close false End Sub ファイルメニューから終了してエクセルに戻る 作業ブックをとりあえず保存し,まだ開いたままにしておく さっきのブックは開いたまま,目的のブックをWクリックして開き,目的のシートを開く 目的のシートを開いたまま,さっき登録したマクロを実行する 2003までならツールのマクロのマクロで。 2007ではExcelのオプションから開発タブを表示して開発タブのマクロで。 2003までのエクセルを使っているなら,ツールバーにユーザー設定ボタン(ピースマークのアイコン)を追加してマクロを登録してクリックして実行させる Excel2007を使っているなら,画面上端のクイックアクセスツールバーのカスタマイズでマクロを登録してクリックして実行させる

eth30
質問者

お礼

ありがとうございます。 マクロ機能は初めてですが、おしえていただいた通り入力したところ、 一瞬で完了しました。 感激です。 ありがとうございました。

その他の回答 (4)

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

#4です imogasi方式(作業列を使う抜き出し問題の私の唱える1方法)の応用でやってみた。 例データA1以下 B列は作業列 aaa 1 1 1 2 1 3 1 4 1 4 1 5 1 6 1 aaa 2 s 2 d 2 f 2 g 2 h 2 aaa 3 23 3 45 3 23 3 B列の式は =COUNTIF($A$1:A1,"aaa") これを下方向に式複写 結果上記B列 ーー D列D1に =IF(ROW()>COUNTIF($B$1:$B$100,COLUMN()-3),"",INDEX($A$1:$A$100,MATCH(COLUMN()-3,$B$1:$B$100,0)+ROW()-1)) この式を下方向に式複写。aaaから次のaaaまでのデータの最多行数分(X行とする)+アルファ行数を式複写する。 COLUMN()-3はD列から結果を出すやり方のためこうする。 他シートのA列から結果をだすことも式を少し修正すれば出来る。 D1:Dxまでを範囲指定して、セル範囲の右下で+ハンドルを出し、右方向に引っ張って式の複写をする。 結果 aaa aaa aaa 1 s 23 2 d 45 3 f 23 4 g 4 h 5 6 ーーー シート上で空白と見えるセルも式が入っている結果であることはわかりますね。作業列を使うことと、これがいやなところ。

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

こういうセルの組み換えの問題はaaaガ現れる行が不定の場合関数では複雑になる。 関数では苦戦するのは当たり前。 VBAでやるのが良い・出来ないとどうしようもないが。 下記は泥臭いやり方ではあるが、行数が少なく意味がわかりやすいかと 標準モジュールに Sub test01() d = Range("A65536").End(xlUp).Row 'A列最終行捕そく c = 2 'C列=2+1列から右に出す For i = 1 To d If Cells(i, "A") = "aaa" Then 'セルの値がaaaなら c = c + 1 '列を右に移す j = 1 '行を(C列の)第1行目に移す Cells(j, c) = "aaa" 'C列(第1行目)にaaaセット j = j + 1 Else Cells(j, c) = Cells(i, "A") 'C列にデータをセット j = j + 1 '次に備え1行下をポイント End If Next i End Sub

eth30
質問者

お礼

お礼が遅くなり申し訳ありませんでした。 無事解決することができました。 教えていただいた方法もVBAの参考書と見比べながら解読してみました。 親切に教えていただき、ありがとうございました。

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

こんばんは! 参考になるかどうか判りませんが・・・ ↓の画像で説明します。 作業用の列を1列設けています。 作業列C2セルに =IF(A2="","",COUNTIF($A$2:A2,"aaa")) という数式を入れ、オートフィルで下へずぃ~~~!っとコピーします。 そして、E2セルに =IF(COUNTIF($C$2:$C$10000,INT(COLUMN(B1)/2))<ROW(A1),"",INDEX($A$2:$A$10000,SMALL(IF($C$2:$C$10000=INT(COLUMN(B1)/2),ROW($A$1:$A$9999)),ROW(A1)))) F2セルに =IF(E2="","",INDEX($B$2:$B$10000,SMALL(IF($A$2:$A$10000=E2,ROW($A$1:$A$9999)),COUNTIF(E$2:E2,E2)))) どちらも配列数式になりますので、この画面からコピー&ペーストしただけではエラーになると思います。 各セルに貼り付け後、F2キーを押す、または貼り付けセルでダブルクリック、または数式バー内で一度クリックします。 編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定します。 そして、E2・F2セルを範囲指定し、2列毎に右方向にコピーしていきます。 最後に今コピーした行全てを範囲指定し、最後の列のフィルハンドルで下へコピーすると 画像のような感じになります。 尚、数式は10000行目まで対応できるようにしていますが、 データ量が多い場合は配列数式ですので表示されるまで時間がかかるかもしれません。 以上、参考になれば良いのですが 的外れなら読み流してくださいね。m(__)m

eth30
質問者

お礼

ありがとうございます。 早速参考にさせていただきながら取り組みましたが、E2とF2のセルの範囲設定がうまくいかず、試行錯誤中です。 もう少しがんばってみます。 画像もつけていただいて、ありがとうございます。

回答No.1

aaaは記載されているものとして記載しますね。 マクロ登録→検索→「aaa」→ENTER でaaaの位置がactiveになるはずです。 その行を右クリックして行を挿入してください マクロ終了ボタンを押す VBA使えるんですかね? 上記のマクロを開き 右クリックした位置に関数を割り当てて、全体をループ文で構成してください。 出来ない場合は マクロ登録→検索→「aaa」→ENTER→マクロ終了→行挿入 を複数回繰り返して下さい。

eth30
質問者

お礼

ありがとうございます。やはりマクロですよね。 勉強します。。 ちなみに、記載に間違いがありました。申し訳ありません。 __A__B__C__D・・・ 1|aaa|1|aaa|1・・・ 2|465|2|556|2・・ 3|231|3|245|3・・ 4|124|4|111|4・・ 5|221|5|232|5・・・ 6| ・ 7| ・ でした。

関連するQ&A

  • エクセルへのデータ貼り付けについて

    メモ帳のテキストデータからエクセルへのデータ貼り付けをする際の質問です。 メモ帳のデータが、 aaa bbb のように2語をスペースで区切っているようなデータです。 これをそのままエクセルに貼り付けると、1列に「aaa bbb」とデータが貼り付けられるのですが、 これをA列に「aaa」、B列に「bbb」と、スペースを区切りとして各列にコピーしたいと考えています。 どのような方法で可能でしょうか?

  • エクセルで列にあるユニークなデータの個数が知りたい

    おはようございます。 エクセルでA列に以下のようなデータがあるとします。 この中で何種類のデータがあるのかを知りたいのです。 この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5という答えが欲しいのです。 ただし、A列に入るデータは非常に多岐(800種類以上)に渡ります。 また、印刷を前提としてるためソートなどはできません。 さらに1枚のシートにこのようなデータがいくつかあるので、その決まった範囲内で個数を抽出する必要があります。 なにとぞ皆様のお知恵をお貸しくださいませ。 よろしくお願いします。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE

  • エクセルの文字処理

    以前に同じ様な質問があったかも知れませんが、探しきれなかったので教えてください。 A1~A4の4つのセルに以下のスペースが入った文字列が入っていた場合 A1|AAA A2|AAA BBB A3|AAA BBB CCC A4|AAA BBB CCC DDD    A   B   C   D  1|    AAA 2|AAA BBB 3|AAA BBB CCC 4|AAA BBB CCC DDD という具合にしたいのです。 条件は  ・セル内にスペースで区切られない文字列があった場合には、B列に入れる  ・それ以外はスペースで区切って、A列B列C列D列に入れる  ・文字数は3文字固定ではなく全角半角が混在 以上です。すいません宜しく願いします。

  • エクセルでA列に

    エクセルでA列に AAA  BBB   (前にスペースが1文字)   CCC  (前にスペースが2文字) とあった場合に、 スペースが1文字ならば1つ右の列に、2文字ならば2つ右の列に、 さらに、前のスペースをなくして A列  B列  C列 AAA      BBB           CCC という形に簡単にできる方法ってありますか?

  • エクセルで2列のデータを1列にする方法について質問です

    エクセルで2列のデータを1列にする方法について質問です エクセルで2列のデータを1列のデータにするときに A B 1 a 2 b 3 c   4 d 5 e ↓ A B a 1 b 2 c 3 d 4 e 5 となるようにするにはどうすればいいでしょうか?

  • Excel2002:複数条件のデータの個数の集計

    苦手な集計について質問させてください。 [A] [B] [1] AAA aaa [2] BBB bbb [3] AAA aaa [4] AAA bbb [5] BBB ccc 上記のようなデータで[A]と[B]のAND条件でみたときの個数を集計したいと思います。 例えば上記であれば、 [A]AAAかつ[B]aaa・・・2個 [A]BBBかつ[B]bbb・・・1個 [A]AAAかつ[B]bbb・・・1個 [A]BBBかつ[B]ccc・・・1個 になります。[B]のデータは[A]のデータに依存せず、[A]の各値にまたがっています。([B]bbbは[A]AAAと[A]BBBの場合があります) 実際のシートでは、全パターンを網羅したリストがA列とB列、集計対象がD列とE列にあります。 上記の例でいえば、以下のようになっています。 [A] [B] [C] [D] [E] [1] AAA aaa AAA aaa [2] AAA bbb BBB bbb [3] BBB bbb AAA aaa [4] BBB ccc AAA bbb [5] BBB ccc つまり[A]列と[B]列が組み合わせパターン、[D]列と[E]列が集計元データです。 ちなみにパターン数が414個、集計元データは29000個程度です。 そして最終的な各パターンの個数を[C]列に表示させたいと思います。 VLOOKUPやピボットテーブルを考えましたが、ピンと来ません。 適切なやり方を教えてください。よろしくお願いします。

  • エクセルでA列とB列のデータを統合するには?

    エクセルでA列とB列のデータを統合することはできるでしょうか?よろしくおねがいします。 A列^^^^^B列 1,^^^^^^Tokyo 2,^^^^^^Osaka 3,^^^^^^Nagoya 下のようにしたいのです。「^^」はスペースをあらわします。 A列^^^^^^^B列(データはなし) 1^^Tokyo 2^^Osaka 3^^Nagoya エクセル2002です。

  • EXCELでのデータベースの作成方法について

    AAAというEXCELファイルがあります。 その中にシート「AAA-a」を作成します。 次に「AAA-b」を作成します。というようにどんどん増えていくとします。 次にBBBというEXCELファイルを作成し、その中のA1セルにAAAファイルの「AAA-a」シート名を読み込みそこに「AAA-a」シートまでのハイパーリンクをつけたいです。 A2セルにも「AAA-b」のハイパーリンクというようにどんどん自動で増やしていきたいのですがどうやればいいかわかりません。 多分マクロが一番いいかと思うのですがわかる方がいましたら教えてください。 よろしくお願いします。

  • 他のExcelファイルのデータを、抽出して表示

    あるフォルダにあるExcelファイルのデータの中から、特定のデータだけ持ってくるマクロを考えています。 持ってくる側のExcelファイルのデータは    A    B    C  -------------------------- 1| AAA  123  あいう  … 2| AAA  456  えお   … 3| BBB  789  あいう  … 4| CCC  012  あいう  … という風になっており、A列の単語で指定して、B列のデータを持ってくる…というマクロです。 ("AAA"という単語で指定した場合、"123"と"456"のデータが抽出される) Excelデータの場所と、単語は入力して指定できるようにしたいです。 ご教示頂けると幸いです。

  • エクセルVBAの文字列の部分一致について

    在庫管理のため、バーコードハンディターミナルで収集したCSV形式のログデータを、別のエクセルファイルに転記するマクロを組もうとしています。 ログファイルには、以下のようにバーコードのコード番号に対して在庫数が入力してあります。 AAA01,10 AAA02,15 BBB01,5 BBB02,7 AAA01とAAA02は同じ種類なので、在庫数は転記先のエクセルファイルの同じセル内に数値を加算します。 この時、同じ文字列(ここではAAAまたBBB)が含まれるコードの在庫数をコピーするマクロはどのようにしたらよいのでしょうか?

専門家に質問してみよう