Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

Excel スプレッドシートの行内の並べ替えを行う方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Excel スプレッドシートの行内の並べ替えを行う方法はありますか。

-- RF

SpacerHey, Scripting Guy! AnswerScript Center

RF さん、こんにちは。これは難しい問題ですね。しかし、このコラムを執筆している Scripting Guy は、ワシントン州民として難しい問題を敬遠するようなことはしません。ですから、本気でこの問題を解決するつもりです。ただし、2013 年に。

これについて不思議に思われている方のために説明すると、数年前、公立学校が基本的な読み、書き、計算のできない生徒を卒業させていることを憂慮したワシントン州議会は、WASL (標準の学力テスト) に合格しないと、高校を卒業できないことを定めた法案を通過させました。WASL に合格しないと卒業できないという法案が最初に適用されるのは、2008 年度卒業予定の学年です。

結局、生徒の大半がこのテストの数学で不合格になりました (読解や作文で不合格になった生徒もいましたが、数学の結果が群を抜いて悪かったのです)。残念な話ですが、これこそがこのテストの目的でした。つまり、最低レベルの学力を身に付けていない生徒を特定することです。確かに、厳しいハードルですが、学校がよりよい成果を挙げるためのいい薬になるでしょう。それに、絶望的に聞こえるかもしれませんが、実際はそうでもありません。生徒は、合格するまで何度でもテストを再受験できるのですから。

: 正直なところ、このコラムを執筆している Scripting Guy は、特に標準の学力テストの強い支持者というわけではありませんが、決まりは決まりです。また、公平な情報公開を期してお話しておくと、Scripting Guy の息子は WASL を受験し、すべての科目に合格しています。

さて、ワシントン州は、この状況にどのように対応したでしょうか。ワシントン州は、同州がとり得た唯一の手段に出ました。結局、WASL の全科目に合格する必要はないことを宣言し、読解と作文の科目に合格すればよいとしたのです。一時はおびただしい数の生徒が WASL に不合格となっていましたが、一夜明けると、まるで魔法のように、そのほとんどが WASL に合格しているのです。システムは、うまく行きました。

もちろん、建前では、2013 年度卒業予定の生徒は、同試験の数学にも合格する必要があります。不合格になったら、高校を卒業できません。今度は、本気です。

もちろん、気が変わらなければ、という話ですが。

さいわい、Scripting Guy は 2013 年まで待つほど辛抱強くはありませんから、次に、この問題を解決するスクリプトをご紹介しましょう。

Const xlAscending = 1
Const xlNo = 2
Const xlSortRows = 2

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1, 1) = "C"
objWorksheet.Cells(1, 2) = "D"
objWorksheet.Cells(1, 3) = "B"
objWorksheet.Cells(1, 4) = "A"

Set objRange = objExcel.ActiveCell.EntireRow
objRange.Sort objRange, xlAscending, , , , , , xlNo, , , xlSortRows

では、このスクリプトのしくみはどうなっているのでしょうか。ワシントン州民を怖がらせるつもりはありませんが、最初のコードは、数式のようですね。でも、心配しないでください。このコードには算術計算は含まれていません。単に、次の 3 つの定数に値を代入しているだけです。

xlAscending: データを昇順 (A から Z の順) に並べ替えるために使用します。必要ならば、降順 (Z から A の順) にデータを並べ替えることはできるでしょうか。もちろんです。この場合は、定数 xlDescending を使用して、値 2 を代入します。

xlNo: データに見出しの行が含まれないことを示すために使用します (列ではなく行を並べ替える方法を説明しているので、これは言うまでもないことです)。

xlSortRows: 選択したセルを列ではなくて行で並べ替えるようにスクリプトに指示します。

定数を定義したら、Excel.Application オブジェクトのインスタンスを作成し、Visible プロパティを True に設定します。この設定により、画面上に表示される Excel の実行インスタンスが作成されます。次に、以下の 2 行のコードを使用して、新しいブックを作成し、そのブックの最初のワークシートにバインドします。

Set objWorkbook = objExcel.Workbooks.Add
Set objWorksheet = objWorkbook.Worksheets(1)

さて、Scripting Guy が思うには、データの並べ替えは実際に並べ替えるデータがなければあまり意味がありません。したがって、次のコード ブロックを使用して、C、D、B、A という値をセル A1 〜 D1 (つまり、スプレッドシートの 1 行目の先頭から 4 つのセル) に挿入します。

objWorksheet.Cells(1, 1) = "C"
objWorksheet.Cells(1, 2) = "D"
objWorksheet.Cells(1, 3) = "B"
objWorksheet.Cells(1, 4) = "A"

: このコラムを執筆している Scripting Guy は、ワシントン州の高校に通ったにもかかわらず、このコードによって実際にスプレッドシートの最初の 4 セルにデータが挿入されることを突き止めることができました。しかも、ほぼ自力で、ほんの少しの助けを得るだけで、突き止められたのです。

ここからがおもしろいところです。データを並べ替える前に、並べ替えの対象となる全データを含む範囲を作成する必要があります。行 1 のデータを並べ替えるので、次のコードを使用して行 1 を範囲として設定します。

Set objRange = objExcel.ActiveCell.EntireRow

ご覧のとおり、単純なコードです。ActiveCell を明示的に変更しない限り、既定では、ActiveCell はスプレッドシートの最初のセルになります。ActiveCell と EntireRow メソッドの両方を参照することで、簡単に行 1 のすべてのセルを選択できます。

いい質問ですね。複数の行を並べ替える場合はどうすればよいでしょうか。この場合は、各行を個別に並べ替える必要があります。つまり、各行のデータ専用の範囲を作成する必要があります。その方法ですか。方法の 1 つは、新しい行の処理を始めるたびに ActiveCell を変更することです。このための簡単な方法は、次のとおりです。

intNewRow = objExcel.ActiveCell.Row + 1
strNewCell = "A" & intNewRow
objExcel.Range(strNewCell).Activate

ここでは、現在の ActiveCell の行に 1 を追加しています。現在、行 1 がアクティブであれば、intRow は 2 になります。次に、行番号の前に文字 A を付加します。これにより、strNewCell 変数の値は A2 になります。A2 にする理由ですか。A2 は、行 2 のセルであるためです。行 2 のセルを特定することで、Activate メソッドを使用して、アクティブ セルを次の行に移動することができます。

もちろん、これを行う方法は他にもあります。もっとよい方法があれば、どうぞその方法をご利用ください。そうでない場合は、この方法をご利用ください。

さて、どこまで説明したでしょうか。そうでした。行データの並べ替えでした。該当の行を含む範囲を作成したら、次のコマンドを使用して、データを並べ替えることができます。

objRange.Sort objRange, xlAscending, , , , , , xlNo, , , xlSortRows

確かに、おかしな見た目のコードですね。コンマや空のパラメータなどがあって。これは、ここでは使用しませんが、Excel がさまざまな並べ替えオプション (並べ替えの優先キーにする列を指定できる機能など) を提供しているからです。ただし、Sort メソッドに渡すパラメータは特定の順序で指定する必要があるため、これらの項目を省略することはできません。省略したら、パラメータの順序が変わり、あらゆる問題につながります。すべてが必要な場所に収まるようにするために、無視する各オプションに空のプレースホルダを挿入します。それが、まさにこのコードで行われていることです。

: その他のオプションの詳細および Excel でのデータの並べ替えのその他の例については、Excel データの並べ替えに関する Office Space の記事 (英語) を参照してください。

ここで重要なのは、並べ替えの対象とするデータ範囲 (objRange) を指定し、次のことを指示するために、3 つの定数を使用していることです。この指示とは、データを昇順で並べ替える、見出し行は使用しない、列ではなく行内でデータを並べ替えることの 3 つです。このスクリプトを実行したら、実際にデータは並べ替えられるでしょうか。試してみて結果をご覧になってください。

これでご質問の回答になっているとよいのですが、RF さん。ワシントン州については、ホーマー シンプソンのセリフがぴったりでしょう。「何かが難しいとしたら、それはする価値のないことだ」。高校生だけでなく、私たちすべてに当てはまる重要な教えです。


ページのトップへページのトップへ