エクセルVBAで列の並び替えをする方法とは?

このQ&Aのポイント
  • エクセルVBAを使って、日々更新されるデータの列の並び替えを効率化する方法について教えてください。
  • デイリーで提出する資料に必要な項目だけを抜き出し、配列を整理するために、エクセルVBAで列の並び替えを行いたいです。知識が不足しているため、どのように対応すればいいかわかりません。
  • エクセルVBAを使って、日々更新されるデータの中から必要な配列を抜き出し、列の並び替えをする方法を教えてください。これにより、手作業での作業量を軽減することができます。
回答を見る
  • ベストアンサー

エクセルVBAで、列の並び替えをしたいです。

いつも大変お世話になっております。 初心者につき、ご教示いただけますと幸いです。 A列~BQ列までを使用したデータが 日々更新されるのですが、 デイリーでお客様へ提出する資料で必要な項目は限られており また、配列も異なる(前後している)仕様となっているため、 日々、手作業で必要な配列の抜き出しと列の配置替えをしています。 これをVBA(マクロ)で設定しておけば、 日々の作業が軽減できるかと考えておりますが、 記憶マクロで作ってはみたものの 知識不足のため、 日々更新され、範囲(行)が異なってしまうデータに対し そこにどう対応して良いかが分かりません。 お教えいただけますと幸いです。 ※A列は項番・BQは必須項目のため、Nullはありませんが、 他の項目にはNullもあります。 よろしくお願い致します。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.3

複写先は同じブックの別シート、 行の並べ替えや削除などは行わず、 単に、指定した列を指定した順番にコピーするだけなら 次のようなコードはいかがでしょうか。 求める仕様が↑と異なるのであればコメントしてください。 Option Explicit Sub ColCopy()  Dim MyCols As Variant  Dim iSh As Worksheet  Dim oSh As Worksheet  Dim ColCounter As Long    Const iShName = "Sheet1"  '複写元シート名  Const oShName = "Sheet2"  '複写先シート名  Const ColCount = 4     '複写する列数  MyCols = Array(1, 7, 2, 9) '複写する列番号とその順番    With ThisWorkbook   Set iSh = .Sheets(iShName)   Set oSh = .Sheets(oShName)  End With    For ColCounter = 1 To ColCount   iSh.Columns(MyCols(ColCounter - 1)).Copy oSh.Columns(ColCounter)  Next ColCounter End Sub

aka_ao
質問者

お礼

うまく仕様に合わせることができました。 とても助かりました。 ありがとうございます!

aka_ao
質問者

補足

VBAのコード自体がよくわからないのですが、 例えば、A~BQ列までのデータを、A・T・V・G・BQ・・・といったように 列の配置が異なるので、入れ変えたいのですが、 ご教示いただいたコードで、それは可能なのでしょうか? 可能な場合、どのへんを変更すると、配列を操作できますでしょうか。 ご面倒おかけしますが、お手ほどきのほど、よろしくお願い致します。

その他の回答 (6)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.7

>A列からBQ列を1行目を基準に降順で並び替え 「昇順で並び替え」の書き間違いです。m(__)m

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.6

>列の並び替えをしたいです。 できますよ Sub 列の並び替え()   Dim LR As Long   '作業行を挿入    Rows(1).Insert   '一行目の作業行に並び順を設定   Range("A1").Value = 1   Range("T1").Value = 2   Range("V1").Value = 3   Range("G1").Value = 4   Range("BQ1").Value = 5   '最終行を求める   LR = Cells(Rows.Count, "A").End(xlUp).Row   'A列からBQ列を1行目を基準に降順で並び替え   Range("A1:BQ" & LR).Sort _   Key1:=Range("A1"), Order1:=xlAscending, _   Header:=xlNo, Orientation:=xlLeftToRight   ActiveSheet.Sort.SortFields.Clear   '一行目に挿入した作業行を削除   Rows(1).Delete End Sub

aka_ao
質問者

お礼

ご教示、ありがとうございます! とても勉強になりました!

  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.5

>例えば、A~BQ列までのデータを、A・T・V・G・BQ・・・といったように >列の配置が異なるので、入れ変えたいのですが、 MyCols = Array(1, 7, 2, 9) '複写する列番号とその順番 このコードが複写する列と複写する順番です。 この場合、 複写先の1列目には、複写元の1列目が 複写先の2列目には、複写元の7列目が 複写先の3列目には、複写元の2列目が 複写先の4列目には、複写元の9列目が複写されます。 >A・T・V・G・BQ・・・ ならば MyCols = Array(1, 20, 22, 7, 69,....)  といった記述になります。

aka_ao
質問者

お礼

ありがとうございました!!

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

すでにご指摘の、原データは保存し、コピーデータで処理するのは、必須でしょう。 ーー しかし、 この質問者の、質問の説明程度では、したいこと、や問題点の詳細が、読者には、判らないと思うので、処理の要点の説明や、コード例が書けないと思う。 ーー データ模擬実例(サンプル)を挙げて(10レコードぐらい最低必要か)、そのデータの場合、最終完成形ではどうなってほしいのか、文章で説明すべきでしょう。  普通は、仕事の処理に当たって、仕様書というようなものを作ると思うが、文章化することによって、考えや、すべきことが明確になるものと思うよ。 ーー 質問者は毎日仕事で苦労しているから、状況は頭に入っているが、内容に関しては、(VBAコード作成のスキルはあっても)読者は、何も知らないのだよ。 多分ポイントは1,2点にしか過ぎない、と思うが、そのポイントが説明できないのが、素人だよね。 ーー 質問表現の中の、例えば>日々更新され、範囲(行)が異なってしまうデータに対し・・ なぜ範囲を考える必要があるのか?今あるデータを対象に、ある列や複数列で、データをソートすれば済まない状況は何? 修正ソートキーというものを自作しないとならない場合はあるが、そんなけーしかな。

aka_ao
質問者

お礼

列の配列を並び替える・・ため、データソートとは異なる質問になります。 →データソートは、行の並び替えですよね?(こちらの知識不足でしたら申し訳ありません!) ご指摘の「説明がわかりにく」点も、大変申し訳ありません。 確かにその通りだと反省致します。 ご不快と感じるようでしたら、スルーいただいて構いませんので、お許しください。 申し訳ございません。

  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.2

>直で並び替えができると最善かと考えていたんですが・・・ 「最善」に思える手段が、実は「最悪」なのです。 「並び替えて提出」の場合、提出した後に「元に戻す処理」が必要になります。 「元に戻す処理」をしないと「2重に並び替えが起きて、訳が判らない状態」になります。 また「並び替える際に、どこかの列を削除」したりすれば「元に戻す事は不可能」になります。 なので、もし並び替えを行なうとしても「元データを別シートにコピーして、別シートを並び替える」と言う処理が必要です。 間違って「元に戻すのを忘れたまま、並び替えをする」と、データがグチャグチャになりますし、間違って「原本」を並び替えしてしまうと、取り返しが付かなくなります。 なので「コピーして、複製したのを並び替え」をする必要がありますが「複製したのを並び替え」するのであれば「別シートに参照式を書く」のと何も変わりませんし、並び替えする手間が増えるだけです。 >それも作ってはみましたが、 >(式が入ったままをお客様へ提出はできないので) であれば「参照式を使った提出用シート」全体を「コピー」して「形式を指定して貼り付け」の「値」で、シートごと別の「提出専用ブック」に「貼り付け」して、その「提出専用ブック」を客先に提出しましょう。 つまり、原本ブックに「元データ」「参照式を使った提出用原本シート」の2つのシートを作り、それとは別の提出用ブックに「値で貼り付けした提出用本番シート」を作る訳です。 「並び替える」は、確かに「目的地までの最短距離」に見えますが、こういう場合は「急がば回れ」した方が「処理は簡単」になり、事故も減ります。

aka_ao
質問者

お礼

細かなご指摘、ありがとうございます。 確かに、直操作は危険なことでした。うかつな考えだったと反省です。 直ではなく、シートにコピーしたものを直で動かす・・・方法だと、ご指南いただいた関数式を入れる・・・と、あまり変わらないのでしょうか? なにせ、いつ時点でどこまでのデータ量に増えるかがわからないため、 式を設定しておく・・という手段だと、足りなくなった時に「対応忘れ」る可能性があるもので・・・。 (なぜかうちには、スキルの低いお爺様もいて、その方が処理をする機会もあるため、なるべく手作業をはぶきたい!というのが正直です。)

  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.1

>日々、手作業で必要な配列の抜き出しと列の配置替えをしています。 そういう場合は「元データが入っているシート」と別に「提出用シート」を作ります。 そして、提出用シートには「元データの入っているシートを参照する式」を使って「提出すべきデータのみ、並びを変えて表示」するのです。 例えば、元データがSheet1、提出用シートがSheet2だとして 元データのA列を、提出用シートのA列に 元データのB列を、提出用シートのB列に 元データのC列を、提出用シートのD列に 元データのD列を、提出用シートのE列に 元データのF列を、提出用シートのC列に 元データのG列を、提出用シートのF列に というように表示したいなら 提出用シートのA1に「=Sheet1!A1」と入力して下方向にコピー 提出用シートのB1に「=Sheet1!B1」と入力して下方向にコピー 提出用シートのD1に「=Sheet1!C1」と入力して下方向にコピー 提出用シートのE1に「=Sheet1!D1」と入力して下方向にコピー 提出用シートのC1に「=Sheet1!F1」と入力して下方向にコピー 提出用シートのF1に「=Sheet1!G1」と入力して下方向にコピー と言う作業をすれは、列の順番・並びが変わった「提出用シート」が簡単に出来上がります。 そして、元データを更新すれば、自動的に、提出用シートの値も更新されます。 この時「元データは変にいじらない」のがコツです。 元データをいじると、提出を行なった後に、毎回「元の順番に戻す処理」が必要になってしまいます。 そして、この様に「元データを参照して、提出用シートを別に作る」ようにすると、2回目以降は「元データを更新するだけ」で、何もする必要はありません。元データが更新されると提出用シートも自動更新されます。

aka_ao
質問者

お礼

改善案のご教示、ありがとうございます。 リンク式を入れた提出用のフォーマットを作っておく・・という方法ですよね? それも作ってはみましたが、 (式が入ったままをお客様へ提出はできないので) お客様提出用を別で作成しなくてはいけなくなることと、 人によっては、コピー&ペースト(値貼付)がうまくできない人もいるため 直で並び替えができると最善かと考えていたんですが・・・

関連するQ&A

  • Excel のVBA ループ処理について

    マクロの歴が浅く、いまひとつ処理のロジックがわかりません。どなたかご教示下さい。 A列には番号が振ってあり、B列にはデータがあります。 ここで、番号で分けられているデータは7項目ある状態で、A列の番号をキーにして、ループ処理をさせたいと思っています。 データを上から順番に見ると、A1には番号1があり、1のデータはB1からB7まで書き込まれている配列になっています。この配列が、番号がnまで続く時のループ処理がわかりません。つまりA1の番号の下、A2からA7までは空白で、A8に番号2があり、この2のデータがB8からB14まで番号1と同様のデータが並んでいる配列です。 間に空白の無い場合の処理はわかるのですが、この様な場合、どういう処理を行えばよろしいのでしょうか?

  • エクセルVBA、列のコピーについて

    VBAについて助けてほしいことがございます! VBA初心者なので、ひょっとしたらレベルの低い質問かもしれず申し訳ないのですが、VBAに詳しい方がいらっしゃれば教えて欲しいことがあります。 下記の前提を含めた作業内容をVBAのコードとしてまとめる事は出来るのでしょうか? 1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 【作業内容】 「ID」の項目の列には、「番号」の列の文字をコピーして貼りつける(キー項目は上書きせずにIDのまま)。 【前提】 ・キー項目の列は固定されていない(B列が番号の時もあれば、住所の時もある)ので、文字を基準にコピー作業をする ・「キー項目が空欄にぶつかったら、検索を終了」という事をループに入れる(キー項目数は変動するため) ・2列目以降の全てのデータをに張り付ける」という事をコードに入れる(2列目以降のデータの列数も変動する且つ途中に空欄も含むため)

  • エクセルVBAでの並び替えについて

    エクセルでデータの並び替えの方法が分からなくて質問します。たとえばBの列の100~999、A100~A999、B100~B999のようなデータが縦に入っているものとします。この中には150-1、150-2のようなデータも混ざってます。これをそのままエクセルで並び替えをしても100~999までは上手にできるのですがその後に150-1とかきてA100~が始まります。例えばこのデータを100~始まり149、150-1,150-2、152,153、154のように上桁から基準に並び替えを行いたいのですがいい方法はありませんか?現在はマクロを使ってVBAでSORTの引数を触ったりしたのですが上手にいきません。基本的にVBAで行っているのでVBAでお願いします。初心者なのでよろしくお願いします。

  • エクセル2000のマクロについて・・・

    あるエクセルで作られたデータが日々メールにて送られてきます。 そのデータを見ながら必要なところを販売管理のソフトに打ち込む作業をしています。 ですがその打ち込む作業でその中の決まった列が不必要になります。 そこでマクロを組んで瞬時に必要な列だけを残して表示させたいの ですがどうすればよいのでしょう? 補足が必要ならば御願いします。

  • データベースの並び替えキーと列の指定方法

    シートに売上データ表があります。A列~AG列2行目に列項目、3行目以降にデータが入っています。これを基に並び変えや、データ抽出をしたいのですが、使用目的によって、並び替えキー項目や削除したい列項目が変わってきます。その為、マクロを組んでも、毎回指定した列を変更しなければならず、困っています。例えばA列1行目~C列1行目に列番号(A,D,F)や、列項目名を入力したら、その列を削除したり、その項目名順に並び替えをする様な事は出来ないのでしょか? 検索・抽出では、同じ列項目名+空白1行の表に検索したい条件を入れれば、その都度抽出出来るのですが。

  • Excel VBAで2列セットでソートする方法

    現在、ExcelVBAマクロにおいてsheet1から    A   B   C   -------------- 1│ a   1   あ 2│ b   2   い 3│ a   2   う 4│ b   1   え という配列のデータをコピーしてきてsheet2にBでソートして    A   B   C   -------------- 1│ a   1   あ 2│ b   1   え 3│ a   2   う 4│ b   2   い となるようなマクロを作成しております。 aとbが混在で扱いにくいのでマクロでないオートフィルターでaとbを切り替えて使うという状況です。 これではデータ上使い勝手が悪いので    A   B   C   -------------- 1│ a   1   あ 2│ a   2   う 3│ b   1   え 4│ b   2   い このような配列に変更したいのですが、どのようなマクロを組めばよろしいでしょうか?

  • Excelの並び替えの修正は可能でしょうか?

    Excelのデータ並び替えで、失敗をしてしまい、とても困っています。 顧客データをセルごとに項目を決めて、入力していったのですが、1つのセル(たとえばA列のみ)を並び替えを行い、他のセルの項目と合致しないデータにしてしまいました。 例: A列勤務先B(顧客氏名)C(住所)D(電話番号)E(E-mail) ーというカテゴリ分けをし、データを入力します。 A列の勤務先というデータのみを50音別に並び替えをしてしまいました。 他のBCDE列はAとつながる同列のデータのはずが、Aのデータと分断されてしまったという状況です。 Aの列とBCDE列とのデータを合致させる方法はないのでしょうか? 保存データは並び替えを行ってしまった後のもので、(随時、更新保存しています)以前のデータに戻すことができません。 データ全体を並び替えしなければいけないところを、1つの列だけ並び替えをしてしまった場合の修正方法がもしあれば、お教えください。とても困っています。 (おそらく、無理だろうなぁ・・・と諦めモードですが) 並び替えを失敗しないコツ???などもあればお教えください。 どうぞよろしくお願いいたします。

  • 配列の並び替え

    下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。   A B C D E←列      1  1 2 3 4 5←配列番号 2  4 9 8 6 2 3  1 5 7 10 3      ↑ 行    ↓     A B C D E 1  5 4 3 2 1 2  2 6 8 9 4 3  3 10 7 5 1

  • エクセルVBA 長さ0の文字列をNullに

    エクセル2000です。 アクセスから出力されたデータをエクセルに貼り付けた場合、問題がおきることがあります。 調べてみたら、アクセスでは、同じ空白でも、レコードが作られてからまだ一回もデータが入っていない状態と、何かデータが入ったことはあるが、削除されて今は空白になった状態をそれぞれ「Null値」と、「長さ 0 の文字列」との 2 種類に区別しているようです。 そのためなのか、それをコピーしてくるとエクセル側でも何もデータが入ってないのに「空白」とはみなされないセルができてしまい、マクロの動きをおかしくしてしまうことがあります。(今日、マクロが想定しない動きをして、その原因がわからず往生しました) やむをえず以下のようなマクロをつくりましたが、Usedrangeが広いとこれもけっこう時間がかかります。 Sub Null化() '長さ0の文字列をNullに   With Application     .ScreenUpdating = False     .Calculation = xlCalculationManual       For Each c In ActiveSheet.UsedRange         If c.Value = "" And Not IsNull(c) Then           c.ClearContents         End If       Next c     .Calculation = xlCalculationAutomatic     .ScreenUpdating = True   End With End Sub 最初から、「長さ 0 の文字列」セルを一度に選択する方法があれば簡単なのですが、そのような方法はありますか? あるいは他のもっとよい方法などがあればご教示くださいませ。  (o。_。)oペコッ

  • Excelで1列のデータを5列に振り分けする

    Excel2003でA列に1行にあるデータ(半角英数字)を 次のシートに、1行ずつコピーして、それを5列に振り分けするというマクロを作りたいです。 (ただし、コピーは2つずつの時もあります。) 元データ ●A列 B列 C列  1  2  3  4  5  ・  ・ 加工後 ●A列 B列 C列 D列 E列   1   1   2   2   3   3   4   4   5   5   上記のような感じです。ただデータは数字のみでなくて、英数字です。 Excelのマクロは全くの初心者で大変困っています。 どうぞよろしくお願いたします。