- ベストアンサー
エクセルのマクロについて
エクセルのデータ処理で困っています。 A列とB列に8000行記入されており、A列とB列の内容をA列にまとめる処理を行おうとしています。 具体的には、元のデータA1、B1、A2、B2を新たにA1、A2、A3、A4に整理する処理です。 マクロを使えば容易に処理できると思うのですが、当方エクセルに詳しくなく困っています。 お詳しい方、処理方法などをご教授していただけないでしょうか。 よろしくお願いいたします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#4さんは邪道だと言っていますが,実際には配列を使うのが定番です。 Sub Test2() r = Cells(Rows.count, 1).End(xlUp).Row '行数確認 a = Range(Cells(1, 1), Cells(r, 2)) 'A列B列読み込み ReDim aa(1 To r * 2, 1 To 2) '作業用配列確保 '書き出し用配列の処理 j = 0 For i = 1 To r j = j + 1 aa(j, 1) = a(i, 1) j = j + 1 aa(j, 1) = a(i, 2) Next i Range(Cells(1, 1), Cells(r * 2, 1)) = aa '配列書き込み Range(Cells(1, 2), Cells(r, 2)).ClearContents 'B列消去 End Sub
その他の回答 (7)
- imogasi
- ベストアンサー率27% (4737/17069)
元データはSheet1にあるとして、結果はSheet2に実現するとします。 質問は、データを1列データ化したいということと捉えて Sheet1の最終行は lr1 = ws1.Range("A100000").End(xlUp).Rowで求まる。 最終行までSheet1の毎1行ごとに繰り返す。 標準モジュールに(このVBAのコードを書く場所に関しては、Googleで照会すること) 検索語「vba コードを書く場所」 http://officetanaka.net/excel/vba/beginner/10.htm 他にGoogle検索結果の次の記事も読めばよい。 Sub test01() Set ws1 = Worksheets("Sheet1") '元データシート Set ws2 = Worksheets("Sheet2") '結果を出すシート j = 2 '結果シートセルの行ポンターを2にセット lr1 = ws1.Range("A100000").End(xlUp).Row 'シート1の最下行 MsgBox lr1 '確認用 For i = 2 To lr1 ws2.Cells(j, "A") = ws1.Cells(i, "A") j = j + 1 ws2.Cells(j, "A") = ws1.Cells(i, "B") j = j + 1 Next i End Sub 例データSheet1 A列 B列 項目1 項目2 あ a い b う c え d お e 結果 Sheet2 A列 項目 あ a い b う cd お e え 質問の意図を間違えていたら無視してください。 結果は別シートに出すことが、VBAコードが簡単になるので初心者には、お勧め。 シート名を質問者が、別の名前にしている場合は、上記コードのSheet1の部分を->現実のシート名に、上記コードの関係個所を兼行すること。Sheet2も同じ。 データは第1行目が項目見出し、第2行目以下は実データがあるとする。
お礼
他のかたをベストアンサーを選んだあとに、リロードしてご記入いただいたことに気がつきました。 VBAの記載方法、別シートへの書き出し、最終行の決定、セルへの代入と丁寧にご教示いただきありがとうございました。
- Java_Sharp
- ベストアンサー率50% (4/8)
あー、回答しようと思っていた答がaokiiさんから、すでに出ていますので、ちょっと丁寧に書いてみます。 まず、エクセルに詳しく無い方は、マクロを使わないほうが良いと思います。後で改良しようとしても大変だから。 丁寧にaokiiさんの方法を書いてみます。鍵は、「並び替え」という機能です。 1)まず、ちょっとした仕掛けをわかりやすさのために創ります 見やすさのために1列開けて、D列E列F列を使います。 D1に「No.」、E1に「並び替えキー」、F1に「内容」と入力します。列タイトルになります。 2)次にA列とB列を一緒にしちゃいましょう。どうせ一列にするので。 2-1)A1からA8000までを選択して、F2からF8001にコピーします。 2-2)B1からB8000までを選択してF8002からF16001にコピーします。 これで、F列2行から8001行までの前半にA列の値が並び、D列8002行から16001行までの後半がB列の値が並んでいます。 3)仕掛けに必要な数値を入れていきます 3-1)D2に「1」を入力し、D3に「2」を入力し、其の上でD1D2セルを選択して、右下の■部分をマウス左ボタンクリックしたままびゃーと下向きにドラッグし続けます。数字が小さく出ると思いますが、それが16000になるまで下向きにドラッグしてそこでクリックを外して下さい。オートフィルという操作で、一度に数値入力できます。D2からD16001までのセルが埋まりました。 3-2)今度は、E2に「1」E3に「3」を入力し、同様にオートフィルしてみて下さい。今度は、15999まで。セルで言うとE2からE8001までが奇数で埋まります。E8001の値は「1599」その左隣D8001の値は「8000」です。 3-3)次に、E8002に「2」E8003に「4」を入力し、下向きに同様にオートフィルを16000に達するまでして下さい。E8002からE16001までが偶数で埋まります。E16001の値が「16000」その左隣D16001の値も同じ「16000」です。 あと、2ステップです。 4)まず、テーブル定義をします。 今、入力したセルのどれか、例えばD1のセルを選択しておきます。 ホーム > テーブルとしての書式設定 をクリックします。好みで、色やレイアウトのスタイル選択して下さい。後でいくらでも変更できます。 「テーブルとして書式設定」というポップアップが表示されます。 テーブルに変換する範囲というのが、「=$D$1:$F$16001」になっていて、「先頭行をテーブル見出しとして使用する」にチェックが入っていることを確認します。 「OK」ボタンをクリックして下さい。 鮮やかに、レイアウトが変更されましたね。 色がついた範囲を「テーブル」といいます。 すべての準備が完了しました。 5)E1「並べ替えキー」のセルの右下に下三角▼ボタンがあるのでクリックして下さい。 表示されたメニューから「昇順」を選んで下さい。 「テーブル」の様子がガラッと変わったともいます。内容の列(F列)に求めるものが表示されていると思います。 もとに戻したいときは、D1「No.」のセルの右下に下三角▼ボタンから「昇順」を選ぶと、元の状態に戻すことができます。
お礼
すみません、ベストアンサーを選んだあとに気がつきました。 画像まで貼って丁寧に教えていただきありがとうございます。 確かに並べ替えやソート機能は便利ですね。
- kagakusuki
- ベストアンサー率51% (2610/5101)
Sub QNo9271965_エクセルのマクロについて() Const FirstRow As Long = 1 '処理を開始する最初の行の行番号 Dim buf As Variant, i As Long, j As Long, myColuns As Variant, LastRow As Long, n As Long myColuns = Array("A", "B") '処理対象となる列の列番号 n = UBound(myColuns) For i = 0 To n buf = buf & Range(myColuns(i) & FirstRow).Value With Range(myColuns(i) & Rows.Count).End(xlUp) If LastRow < .row Then LastRow = .row End With Next i If LastRow <= FirstRow And buf = "" Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If With Application .ScreenUpdating = False .Calculation = xlManual End With For i = LastRow To FirstRow Step -1 For j = 0 To n Range(myColuns(0) & FirstRow + (n + 1) * (i - FirstRow) + j).Value _ = Range(myColuns(j) & i).Value Next j Next i For i = 1 To n Range(myColuns(i) & FirstRow & ":" & myColuns(i) & LastRow).Clear Next i With Application .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub
お礼
ベストアンサーを選んだあとに気がつきました、すみません。 動かしていませんが、終了時に終了コメントが出る予感がしました。 本格的なものを教えて頂き、ありがとうございました。
- Prome_Lin
- ベストアンサー率42% (201/470)
こんなのは、許されないと思いますが・・・ Sub Test() r = Cells(Rows.Count, 1).End(xlUp).Row ReDim a(r - 1) ReDim b(r - 1) For i = 0 To r - 1 a(i) = Cells(i + 1, 1).Value Cells(i + 1, 1).Value = "" b(i) = Cells(i + 1, 2).Value Cells(i + 1, 2).Value = "" Next i l = 0 For i = 0 To r - 1 l = l + 1 Cells(l, 1).Value = a(i) l = l + 1 Cells(l, 1).Value = b(i) Next i End Sub 列「A」と列「B」の値を、すべて配列変数に入れて、その後、その配列変数を使って、書き出しています。 一応、簡単な説明です。 r = Cells(Rows.Count, 1).End(xlUp).Row ReDim a(r - 1) ReDim b(r - 1) 配列変数を、必要な個数、用意しています。 For i = 0 To r - 1 a(i) = Cells(i + 1, 1).Value Cells(i + 1, 1).Value = "" b(i) = Cells(i + 1, 2).Value Cells(i + 1, 2).Value = "" Next i 配列変数にそれぞれ、値を入れた後、そのセルを空白にしています。 For i = 0 To r - 1 l = l + 1 Cells(l, 1).Value = a(i) l = l + 1 Cells(l, 1).Value = b(i) Next i あとは、「a」と「b」を順番に書き出しています。 結果は、出ていますが、どう見ても、邪道ですし、何より、スマートではありませんね。
お礼
代入して書き出す操作を繰り返す方法もあるということで勉強になりました。補足説明まで丁寧に教えていただきありがとうございました。
- waltzingmatilda
- ベストアンサー率66% (4/6)
質問の意味がよく分からないのですが A列に「あいうえお」 B列に「イロハニホ」 となってるのを A列に「あイいロうハえ二おホ」 というようにまとめるって事ですか?
補足
おっしゃる通りです。 説明が分かりづらくでお手数をおかけしました。
- tsubu-yuki
- ベストアンサー率46% (179/386)
> 当方エクセルに詳しくなく ならなおさら、マクロに手を出すのはどうかと思いますけどね。 トラブったら誰がフォローするんでしょ? さておき。 Sub samp() For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 Cells(i, 2).Cut Cells(i + 1, 1) Rows(i).Insert Next Rows(1).Delete End Sub 下から順にB列をA列に移動して1行増やす。 これを一番上まで繰り返すだけです。 考えるのが面倒だったので最後は手抜きです。
お礼
下から上方向というのが、末行を確認しないため、簡易で済むポイントのようですね。 教えていただきありがとうございました。
- aokii
- ベストアンサー率23% (5210/22062)
マクロは面倒なので、 別シートを作り、A列に上から1,3,5...と奇数の番号を付け、 A列のデータをコピーして別シートのB列に貼り付け、 貼り付けたデータの最下行の次のA列の行に2,4,6...と偶数の番号を付け、 B列のデータをコピーして別シートのB列の次のデータとして貼り付け、A列の順にデータを並べ替えてはいかがでしょう。
お礼
確かに並び替えで対応できますね。 教えていただきありがとうございました。
お礼
説明のおかげで、命令と仕事の関係が何となくですが理解できました。 最初に試したところスムーズに処理が終わりました。 最初に試したということもあり、ベストアンサーにさせていただきました。 他の皆様も親切に教えていただき、ありがとうございました。