- ベストアンサー
マクロデータ加工:番号に合わせて行を挿入し移動
- マクロを使用して、指定された番号に合わせて行を挿入し、データを加工する方法を知りたい。
- 左の状態から右の状態にデータを加工するマクロについて教えてください。
- マクロを使用して、データの行を移動させて、黒の番号がない場合は行を空白にする方法を知りたい。
- みんなの回答 (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
- ベストアンサー率47% (774/1618)
作ってみました。 次の場合動作保証はしません。 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
- imogasi
- ベストアンサー率27% (4737/17069)
私が勝手にデータを決めてやってみた例を参考に上げる。 ただし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 (略)
補足
最初のやつ、どの区切りで分けるのか、そこでまず分かりません。タイトルというのは1R、2R・・・となっています。 ちなみに他の方法を考えて質問したので、そちらができればそちらの回答をお願いできますでしょうか? 「指定した行数を挿入する マクロ」 https://okwave.jp/qa/q9342454.html
- tsubu-yuki
- ベストアンサー率46% (179/386)
C列をコピーしてA列に張り付けるだけですが、 そんなに難しいですか?
補足
ちゃんと添付を見てください。説明もちゃんと読んでください。右の方は黄色い部分を空ける必要があるということです。コピペするだけなら質問しませんよ。
- tsubu-yuki
- ベストアンサー率46% (179/386)
逆に、A列を削除しながら上にあげていくほうが 初心者には簡単な気がします。 ぜひ、補足ください。
補足
A列を上げる? 黄色い部分を空けるにはどうしたらいいんですか? 今勉強中ですが、初歩レベルでこの程度だとむずかしくでわかりません。至急必要なので、サンプルを作っていただきたいです。
お礼
一応できました。実際に使うにはちょっと修正しないといけないっぽいですが、ありがとうございます。