マクロデータ加工:番号に合わせて行を挿入し移動

このQ&Aのポイント
  • マクロを使用して、指定された番号に合わせて行を挿入し、データを加工する方法を知りたい。
  • 左の状態から右の状態にデータを加工するマクロについて教えてください。
  • マクロを使用して、データの行を移動させて、黒の番号がない場合は行を空白にする方法を知りたい。
回答を見る
  • ベストアンサー

マクロ データ加工 番号に合わせて行を挿入し移動

添付の左の状態から右の状態に加工するマクロが知りたいです。 A列:A7から1~18まで番号、空白1行、1~18まで番号、空白1行…繰り返し 左のB列:B1のみ見出し、B2からタイトル、1~いずれかのの番号(9だったり16だったりいろいろ)、タイトル、1~いずれかのの番号、タイトル…繰り返し 左のC列とD列:B列の番号に該当する氏名(漢字)と生年月日(数字8桁) 右の状態にするには最初の1~4行を下げる、赤の番号と黒の番号を合致するように移動し、黒の番号がないときはその行を18まで空白行にする、タイトル、番号を合わせて移動…という繰り返しになります。(黄色の部分を空白行にして調整するかんじです。黄色の塗りは必要ありません。)この手順でなくても結果が同じになれば良いです。 黒の番号は通常は連番ですが、まれに途中の番号がぬけている(例1、2、3、6、7)場合がありますが、その際には抜けている行(例4、5)を空白行にしてもらえると助かります。

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

  • ベストアンサー
回答No.5

何か色々勘違いなさっているようで。 ま、その辺りは置いといて。 ついでにマルチポストの   https://okwave.jp/answer/new?qid=9342454 にも対応できていると思いますよ。 図のA列は邪魔なので列削除しといてください。 つまり「見出し」及び「番号」がA列に来るようにしてください。 Sub Sample()   j = 18   For i = Cells(Rows.Count, 1).End(xlUp).Row + 1 To 2 Step -1     If IsNumeric(Cells(i - 1, 1)) = False Then       j = 18     Else       If Cells(i - 1, 1) < j Then         Do Until Cells(i - 1, 1) = j           Rows(i).Insert           Cells(i, 1) = j           j = j - 1         Loop       End If       j = j - 1     End If   Next End Sub 初心者向けに難しい命令を使わずに書いてみました。 無駄は多いですが、いかがですか? 「タイトル」の直下行が「1」以外だとうまく動きませんが、 例示にそのパターンが無いので無視します。 ま、少し考えれば回避できますので、そこは自力で学習なさってください。

その他の回答 (4)

  • SI299792
  • ベストアンサー率48% (713/1474)
回答No.6

作ってみました。 次の場合動作保証はしません。 A列が1から始まる連番でない。 A列に数字以外がある。 B列が1行目から始まっていない。 B列に空白がある。 B列の番号が順番通りでない。(抜けはあってもいいが、昇順に並んでいて、重複がないこと) B1以外に見出しがある。タイトルが2行以上ある。 ' Option Explicit ' Sub Macro1()   Dim ey As Long   Dim oy As Long   Dim iy As Long   Dim A As Integer   Dim B As String '   Application.ScreenUpdating = False   ey = Cells(Rows.Count, "A").End(xlUp).Row   Range("G1:G" & ey) = Range("A1:A" & ey).Value   Columns("H:J").ClearContents   oy = [A1].End(xlDown).Row   Cells(oy - 2, "H") = [B1]   iy = 3 '   For oy = oy To ey     A = Cells(oy, "A") '     If A = 1 Then       Cells(oy - 1, "H") = Cells(iy - 1, "B")     End If '     B = Cells(iy, "B")     If A = Val(B) Then       Cells(oy, "H").Resize(1, 3) = Cells(iy, "C").Resize(1, 3).Value       iy = iy + 1     End If   Next oy End Sub

honeybeans
質問者

お礼

一応できました。実際に使うにはちょっと修正しないといけないっぽいですが、ありがとうございます。

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

私が勝手にデータを決めてやってみた例を参考に上げる。 ただしA列の赤字の番号は、なぜ、A7から始まり、B3からの番号データとづれているのかわからず、無視した。 またタイトルは各ブロックでそのタイトル文字列が違うのだろうが例データを書くなら、別の文字列にしたら(手抜きしすぎ)。 私は各タイトルのカタマリ(の切れ目)に注目しての、処理ロジックを考えた。 基本的に左(B列から)のものを右(H列から)に移すだけのタイプだ。 上下の行順序はこの課題では、変えて無いようだ。 ーー (ここから下記データ部分を自分のシートにコピペして、データー区切り位置で各列の表にできないかやってみて) 例データ B,C,D列で 見出し タイトル1 1 a1 DoB 2 a2 DoB 3 a3 DoB 4 a4 DoB 5 a5 DoB 6 a6 DoB 7 a7 DoB 8 a8 DoB 9 a9 DoB タイトル2 1 b1 DoB 2 b2 DoB 3 b3 DoB 4 b4 DoB 5 b5 DoB 6 b6 DoB 7 b7 DoB 8 b8 DoB 9 b9 DoB 10 b10 DoB 11 b11 DoB 12 b12 DoB 13 b13 DoB 14 b14 DoB 15 b15 DoB 16 b16 DoB タイトル3 1 c1 DoB 2 c2 DoB 3 c3 DoB 4 c4 DoB 5 c5 DoB 6 c6 DoB タイトル4 1 d1 DoB 2 d2 DoB タイトル5 1 e1 DoB 2 e2 DoB タイトル6 1 f1 DoB 2 f2 DoB 3 f3 DoB ーーー コード 標準モジュールに Sub test04() Set sh1 = Worksheets("Sheet1") lr = sh1.Range("c100000").End(xlUp).Row '--見出し sh1.Range("h5") = sh1.Range("B1") '見出し 初期の空白4 行の空白のあと第5行目に '---タイトルリスト t = Array("タイトル1", "タイトル2", "タイトル3", "タイトル4", "タイトル5", "タイトル6", "") '--タイトル行 k = 6 '初期の空白4 行を含む。次は6行目 f = 2 'B列で最初のタイトル行の位置 '-- m = 1 'タイトル2から '--- For i = 3 To lr If sh1.Cells(i, "B") = t(m) Then MsgBox i sh1.Range("B" & f & ":D" & (i - 1)).Copy sh1.Range("H" & k) ' 次のタイトル部分の用意 k = k + (i - f + 1) k = k + 8 f = i m = m + 1 End If Next i '--- p2: sh1.Range("B" & f & ":D" & lr).Copy sh1.Range("H" & k) End Sub ーー 結果 上記のデータで実際実行してください。一部を挙げます。 (4行空白) 見出し タイトル1 1 a1 DoB 2 a2 DoB 3 a3 DoB 4 a4 DoB 5 a5 DoB 6 a6 DoB 7 a7 DoB 8 a8 DoB 9 a9 DoB (略) タイトル4 1 d1 DoB 2 d2 DoB タイトル5 1 e1 DoB 2 e2 DoB == 小生自身、不満足な点は、タイトルを目視で広い、配列に持って行っていること。 特徴がわかればプログラムで、配列に収納できると思う。 何かB列の「タイトル」行で、それらの行を拾えるような、特徴的な文字列の一部にはないのか? 表設計でタイトル列と番号列は別列に分ける設計にすべきだとおもう。 ーー コード作成に手間のかかる課題だが、回答者にとって、他の質問などの勉強には為にならない課題だと感じた。 丸投げ的に回答を求めるのでなく、処理ロジックを考えて自分で試行してみること。 タイトル2 1 b1 DoB 2 b2 DoB 3 b3 DoB 4 b4 DoB (略)

honeybeans
質問者

補足

最初のやつ、どの区切りで分けるのか、そこでまず分かりません。タイトルというのは1R、2R・・・となっています。 ちなみに他の方法を考えて質問したので、そちらができればそちらの回答をお願いできますでしょうか? 「指定した行数を挿入する マクロ」 https://okwave.jp/qa/q9342454.html

回答No.3

C列をコピーしてA列に張り付けるだけですが、 そんなに難しいですか?

honeybeans
質問者

補足

ちゃんと添付を見てください。説明もちゃんと読んでください。右の方は黄色い部分を空ける必要があるということです。コピペするだけなら質問しませんよ。

回答No.2

逆に、A列を削除しながら上にあげていくほうが 初心者には簡単な気がします。 ぜひ、補足ください。

honeybeans
質問者

補足

A列を上げる? 黄色い部分を空けるにはどうしたらいいんですか? 今勉強中ですが、初歩レベルでこの程度だとむずかしくでわかりません。至急必要なので、サンプルを作っていただきたいです。

関連するQ&A

  • マクロ データ加工 番号に合わせて行を挿入し移動

    添付の左の状態から右の状態に加工するマクロが知りたいです。 A列:A7から1~18まで番号、空白1行、1~18まで番号、空白1行…繰り返し 左のB列:B1のみ見出し、B2からタイトル、1~いずれかのの番号(9だったり16だったりいろいろ)、タイトル、1~いずれかのの番号、タイトル…繰り返し 左のC列とD列:B列の番号に該当する氏名と生年月日 右の状態にするには最初の1~4行を下げる、赤の番号と黒の番号を合致するように移動し、黒の番号がないときはその行を18まで空白行にする、タイトル、番号を合わせて移動…という繰り返しになります。(黄色の部分を空白行にして調整) この手順でなくても結果が同じになれば良いです。 黒の番号は通常は連番ですが、まれに途中の番号がぬけている(例1、2、3、6、7)場合がありますが、その際には抜けている行(例4、5)を空白行にしてもらえると助かります。

  • 行を挿入するマクロ

    画像の右の表を左の表のように自動で整えたいです。 A、b、c…グループがあって、それぞれ連番があります。 1から18行したら次のグループの連番を1から開始となるように、詰まっている部分に空白行を挿入したいです。グループごとの番号は画像のように11で終わるとは限らず、1~18のうちのいずれかの数です。

  • 行挿入マクロをご教示ください

    A列の5行目から1000行ほどK列までデータが入っています。 A列からK列をB列優先でソートを行うと、B列にところどころ同じ番号が2行あったり、3行あったり、また4行とバラバラで、出てきます。 この場合、同じ番号が2行以上あるセルの上に空白の行1行を挿入し、同じ番号行分を合計して整理したいと考えています。 2行以上ある行の上に空白行を1行挿入するようなマクロをご教示ください。 どなたか、よろしくお願いします。

  • excelのマクロで条件による行の挿入

    列AとBがあり列Aに学校のクラス名A組、B組、C組・・・(20クラスほど)と氏名が 入るエクセルシートがあるのですが 先頭行はA組から始まり5行区切りで数え、(A組も5行のうちに入る) その5行内に次のB組が入らないように空白行を挿入したいです もし、5行以内にB組がない場合、次の5行でまたB組があるか判定しなければ氏名5つ あれば空白をいれてというのを20クラスぶん作るマクロは可能でしょうか? VBAの知識がさっぱりないので途方にくれています。 元のデータの例   マクロ実行後 列A   列B      列A   列B A組           A組   氏名1 111      氏名1 111  氏名2 222      氏名2 222 B組           空白行挿入 氏名3 333      空白行挿入 氏名4 444      B組 氏名5 555      氏名3 333 氏名6 666      氏名4 444 氏名7 777      氏名5 555 C組 氏名6 666              氏名7 777              空白行挿入              空白行挿入              空白行挿入              空白行挿入              C組  

  • エクセルで1行ごとに空白行を挿入し、挿入した空白行に色をつけたいです

    タイトルの通りです。 エクセル(2000)で、データはシート毎に件数が違います。 各シート毎にそれぞれ1行毎、空白行を挿入し、挿入した空白行のA列~G列までに薄いグレーの色をつけるマクロを入れたいのですが、うまくいきません。 詳しい方、教えて下さい。

  • セル移動マクロを教えて下さい。

    エクセルで最終行の次の行(新規入力となる行)の左4つ目のセルに移動するマクロを作りたいのですが、出来るでしょうか。 例えば列Aに1から3000までのNOが入っているとします。 B列からD列までは他のデータに使用しているため新規入力データE列の行から右に入力しています。 NO125の行までデータ入力している場合、ボタンをクリックすれば、A列のNO126(新規入力行のA列)にセルが移動するマクロです。 よろしく、お願いいたします。

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • 特定の行だけ、隣に移動したい

    C(住所)を左隣のBヘ D(電話番号)を右隣のEへ移動させたいです。 C4、D4は必ず住所電話番号になりますが それ以降の、この場合は(9、26、32列)の住所電話番号の場所は そのつど変更します。 行単位の指令ではなく、○○県があった時、左に移動 ○○○ー○○○ーなど電話番号っぽい数列があったとき、右に移動という風に コピペではない方法で、することはできるのでしょうか?

  • 特定の文字の上に行を挿入したい。

    特定の文字の上列に空白の1行を挿入したいのですが、どうしてもわかりません。 B列に1900~2350まで10刻みで(1900・1910・1920・・・) 数字が60000行、繰り返しで入っております。 1900と2230の上列に1行、空白の行を挿入したいのですが、 マクロで1発挿入できないでしょうか? 宜しくお願いします。

  • エクセル:データが入った最終行の行番号の取得

    お世話になります。 A列にいろいろデータが入っているとして、データが入っている一番下(最終行)の行番号をB1のセルに表示させるにはどういう計算式で出来るでしょうか? A列のデータは数値だけでなく文字列も含みます。また途中空白セルもあります。 A1~A20にデータが入っているときはB1に20と表示させる。 よろしくお願いします。

専門家に質問してみよう