• ベストアンサー

エクセルのマクロについて

エクセルのデータ処理で困っています。 A列とB列に8000行記入されており、A列とB列の内容をA列にまとめる処理を行おうとしています。 具体的には、元のデータA1、B1、A2、B2を新たにA1、A2、A3、A4に整理する処理です。 マクロを使えば容易に処理できると思うのですが、当方エクセルに詳しくなく困っています。 お詳しい方、処理方法などをご教授していただけないでしょうか。 よろしくお願いいたします。

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8012/17124)
回答No.5

#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

savagegarden
質問者

お礼

説明のおかげで、命令と仕事の関係が何となくですが理解できました。 最初に試したところスムーズに処理が終わりました。 最初に試したということもあり、ベストアンサーにさせていただきました。 他の皆様も親切に教えていただき、ありがとうございました。

その他の回答 (7)

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

元データは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行目以下は実データがあるとする。

savagegarden
質問者

お礼

他のかたをベストアンサーを選んだあとに、リロードしてご記入いただいたことに気がつきました。 VBAの記載方法、別シートへの書き出し、最終行の決定、セルへの代入と丁寧にご教示いただきありがとうございました。

回答No.7

あー、回答しようと思っていた答が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.」のセルの右下に下三角▼ボタンから「昇順」を選ぶと、元の状態に戻すことができます。

savagegarden
質問者

お礼

すみません、ベストアンサーを選んだあとに気がつきました。 画像まで貼って丁寧に教えていただきありがとうございます。 確かに並べ替えやソート機能は便利ですね。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

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

savagegarden
質問者

お礼

ベストアンサーを選んだあとに気がつきました、すみません。 動かしていませんが、終了時に終了コメントが出る予感がしました。 本格的なものを教えて頂き、ありがとうございました。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

こんなのは、許されないと思いますが・・・ 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」を順番に書き出しています。 結果は、出ていますが、どう見ても、邪道ですし、何より、スマートではありませんね。

savagegarden
質問者

お礼

代入して書き出す操作を繰り返す方法もあるということで勉強になりました。補足説明まで丁寧に教えていただきありがとうございました。

回答No.3

質問の意味がよく分からないのですが A列に「あいうえお」 B列に「イロハニホ」 となってるのを A列に「あイいロうハえ二おホ」 というようにまとめるって事ですか?

savagegarden
質問者

補足

おっしゃる通りです。 説明が分かりづらくでお手数をおかけしました。

回答No.2

> 当方エクセルに詳しくなく ならなおさら、マクロに手を出すのはどうかと思いますけどね。 トラブったら誰がフォローするんでしょ? さておき。 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行増やす。 これを一番上まで繰り返すだけです。 考えるのが面倒だったので最後は手抜きです。

savagegarden
質問者

お礼

下から上方向というのが、末行を確認しないため、簡易で済むポイントのようですね。 教えていただきありがとうございました。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

マクロは面倒なので、 別シートを作り、A列に上から1,3,5...と奇数の番号を付け、 A列のデータをコピーして別シートのB列に貼り付け、 貼り付けたデータの最下行の次のA列の行に2,4,6...と偶数の番号を付け、 B列のデータをコピーして別シートのB列の次のデータとして貼り付け、A列の順にデータを並べ替えてはいかがでしょう。

savagegarden
質問者

お礼

確かに並び替えで対応できますね。 教えていただきありがとうございました。

関連するQ&A

  • エクセルのマクロで

    エクセルのマクロでこんな処理はできるでしょうか? 元データ表に A列からC列まである数値が5000行にわたって入っています。 例     A B C 1行目 1 4 6 2行目 4 7 8 3行目 5 6 4 4行目 7 8 2 ・ ・ 今、1行目と2行目の間に新たな行を挿入し、 C1セルの値を新たに挿入した行のA列からC列に貼り付けたい。 同様に現時点での2行目と3行目の間に新たな行を挿入し 今度はC2セルの値をその行に貼り付けます。 上の例で言うとこうなります。これを最後の行まで繰り返します。     A B C 1行目 1 4 6 2行目 6 6 6 3行目 4 7 8 4行目 8 8 8 5行目 5 6 4 6行目 4 4 4 7行目 7 8 2 8行目 2 2 2 ・ ・ 元データは5000行あるので、都合1万行になるということです。 このような処理はできるでしょうか? お教えいただけたら幸いです。よろしくお願いします。

  • エクセルのマクロを知りたい

    エクセルで,たくさんのデータが入力された【シートa】があります。 新しく【シートb】を作成して,そこに空白の表(1)~(10)までを作成します。 (ちなみに表(1)は1行から始まり100行まで,表(2)は101行から始まり200行まで・・・・といった感じです) 【シートb】の表(1)には,【シートa】でA列に「1」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。同様に,表(2)には,【シートa】でA列に「2」が入力されているデータを抽出して,それをB列の昇順に並べて記入しなさい。・・・というのを表(10)まで続けます。 上記のような命令をボタン一つで操作できるようなマクロを教えて欲しいのです。 お願いします。

  • Excel 2007 マクロ 同列のデータの重複チェック

    Excel 2007 マクロ 同列のデータの重複チェック A列で重複しているデータをチェックします。 重複しているデータについて、B列にフラグをつけます。 フラグはどの行とどの行が重複しているのかわかるようにしたいです。 そのため重複している行同士ごとにフラグをつけます。 上記の内容はマクロで実現できるのでしょうか。 元データと完成形の画像を添付します。 よろしくお願いします。

  • EXCELの「行列を入れ替える」マクロについてどなたか教えていただけないでしょうか?

    EXCELの「行列を入れ替える」マクロについてどなたか教えていただけないでしょうか? 下記のようにならんだDATAがあります。   A列   B列  C列  D列  E列 (1行)2002/12/17 15240 15280 15220 15220 (2行) (3行) (4行) (5行)2002/12/18 15250 15250 15210 15210 (6行) (7行) (8行) (9行)2002/12/19 15220 15310 15220 15310 (10行) (11行) (12行) (13行)2002/12/20 15220 15260 15210 15230 (14行) (15行) (16行) (17行)2002/12/24 15300 15310 15270 15310 (18行) (19行) (20行) (21行)2002/12/25 15300 15340 15300 15600  . . . . . . . . . . . . . . . . . . . . . . . と,このようにDATAは日付の横に数値が4つずつ横に並んでおりますが、この4つの数値をその4つ目の数値の真横のF列から縦に4つ並べたいのですが、一気にできるマクロがないものでしょうか?下記のようにです。   A列   B列 C列 D列 E列  F列 2002/12/17            15240                  15280                  15220                  15220 2002/12/18            15250                  15250                  15210                  15210 2002/12/19            15220 15310 15220 15310                   . . .                    といった感じに一気にマクロで処理してしまいたいのです。DATAはかなりの行数あり、すべて3行の間隔があります。日付の横に4つの数値が規則的に並んでいるというものです。何回でもマクロボタン一発で4つの横に並んだ数値のみを縦に並べた4つの数値にしたいのです。つたない説明で大変申し訳ありませんが、どなたかわかる方お教えくださいませ。

  • EXCELのマクロで困ってます。

    EXCELのマクロで困ってます。 今EXCELでデータを処理しているのですが、 データが膨大にあり、処理するのにすごく時間がかかっています。 そこでマクロで何とかできないかと思っています。 EXCELに詳しい方のマクロ作成方法について教えてください。 質問内容は 画像の まずはB列の:の後ろにC列、D列、E列の文字を挿入し、それを次の列、次の列と進めていきたいのですが 可能でしょうか? それに開始ボタンと終了ボタンを作って 3人で作業したいと思っています。(後の二人はあまりマクロを知らないので簡単に動作させたい) コピペでは間に合わなく、ホントに困ってます。 よろしくお願いいたします。

  • Excelマクロでセルの比較

    Excelマクロでセルの比較 まだマクロ初心者なので、詳しいことがわからなくて困っております。 例)●前提として何行目まであるかは変化します     (A列)(B列) (1行目) 35  35 (2行目) 26  26 (3行目) 13  13 (n行目) 12  12 ※n=最終行 【やりたいこと】 このようにシートに入力されていたとして、 「A1=B1?」⇒「A2=B2?」⇒「A3=B3?」⇒「An=Bn?」と比較を進めていき不一致の有無を出す。 もし不一致がなければ、そのまま通過しその次のマクロを実行していく。 不一致があった場合には、不一致の行を別ファイルに出力してファイル保存し、ファイルを閉じる。 マクロを実行している元のファイルは、保存せずにファイルを閉じる) 行の長さが変化するため、その変化にも対応した処理を実行したいと思っております。 本やサイトで調べてみたのですが、基礎知識がないためうまく処理をさせるマクロを作ることが出来ませんでした。 このようなマクロが可能なのかもわかりませんが、出来ましたらこのマクロを教えていただけますでしょうか。 宜しくお願いいたします。

  • エクセル・マクロについて教えてください

    こんにちは。エクセルのマクロについて教えてください。 エクセルの表で毎日20000~30000行くらいのデータがあり、フィルタを掛けてやるのもいいですが、業務効率を考えて、マクロを使用したいと思っています。 実行したい内容は、C列(担当)は8と721以外は削除、F列(地域)は渋谷と品川以外は削除、G列(コード)は1000未満と空白行は削除、H列(数量)は0以下を削除 簡易記録マクロで記録してみましたが、毎回データの内容が異なるため、H列のマイナスが削除されていなかったり等、実行したい結果が得ることができませんでした。 マクロも少し勉強していますが本やネットでも検索したりしましたが、うまくできませんでした。ご教授ください。

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

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

  • エクセルのマクロでデータを左につめていく

    お世話になります。エクセル2002でマクロを作成しようと思っています。 毎回同じ処理をしているので、良いサンプルがあったら教えてください。 やりたいこと  A列からF列にランダムにデータが入力されています。  このデータをA列、B列、C列と、左に詰め表示させたいです。  ※G列以降にもデータが入力されていますが、処理したい列範囲はA列~F列です。  ※行数は、都度変わります。(UsedRange.Rows.Countで値を取得) イメージ(処理前)  -  : 空白セル  *** : データが入力されているセル     A列   B列  C列  D列  E列   F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 - -   -  *** *** *** 4行目 ***  -   -   -   -   -  5行目 *** *** -   *** -   -  イメージ(処理後)     A列  B列  C列   D列  E列  F列 1行目 項目1 項目2 項目3 項目4 項目5 項目6 2行目 ***  ***  -   ***  *** - 3行目 *** *** *** - -   - 4行目 ***  -   -   -   -   -  5行目 *** *** *** -   -  -

  • EXCELのマクロについて

    EXCELのマクロについて質問させてください。 一覧シートから、職種別の各シートへ集計(貼り付け)が出来るような プログラムを作成したいのでやってみたところ、私の知識では上手く出来ませんでした。 お力をお借り出来ると幸いです。 具体的には、一覧シートへ入力後(毎月入力) 『A』 『B』 『E』と分かれた職種別の各シートへ職種別かつ氏名の昇順でソートが掛かった状態で 貼り付け?集計?が出来るようにしたいです。 一覧シートのB列には「A・B・E」のどれかの職種が入力されており 氏名はD列E列へ記載しています。(漢字、カナ表示) A~AD列までデータを記入していますので、全て各シートへ集計出来ると嬉しいのですが・・・ 行は8行目から記載してます。 上記のようにプログラムを組む事は可能でしょうか。 具体的なプログラムも載せて頂けると嬉しいです。 宜しくお願い致します。

専門家に質問してみよう