2009年09月

Excelの操作を解説した某サイトをたまたま見ていたら、こんなことが書いてありました。
「エクセルの並び替えで注意をしなければいけないのは、・・・縦方向に並び替えはできるが、横方向に並べ替えはできない」うんぬん。

あれ・・・?できるのに。たしかにわかりづらいですが。

たとえばこんな表があったといたします:

イメージ 1

売上データについて、縦方向に商品別・横方向に取引先別に集計がされています。
縦方向はC列の売上数順でソートされていますが、横方向は1行めの取引先名順になっちゃってます。
これを2行目の売上数順で左から右にソートしたいといたします。

まず並べ替えをする範囲全体を選択:

イメージ 2

次にメニューのデータ→並べ替えを選択して「並べ替え」の画面を表示させます。
そして左下にある「オプション」というボタンをクリック。
すると、さらに「並べ替えのオプション」という画面が表示されます(図はExcel2002)。

イメージ 3

ここで「方向」の項目を「列単位」に変更してOK。

※ちなみにExcel2007の場合は下のような画面です。同じように「オプション」をクリックします。

イメージ 4

「並べ替え」の画面に戻ると「最優先されるキー」の表示が変わっています。
表の2行目で並べ替えたいので「行2」を選択、多い順にしたいので「降順」を選択してOK。

イメージ 5

横方向の並べ替え完了です:

イメージ 6

ところで、これをVBAでやる時にひとつ注意することがあります。
上の「列単位」は、SortメソッドのOrientationというオプションで指定します。
これについてマイクロソフトは次のように説明しています。

Orientation 省略可能です。XlSortOrientation クラスの定数を使用します。並べ替えの方向を指定します。
使用できる定数は、次に示す XlSortOrientation クラスの定数のいずれかです。
xlSortRows 既定値。行単位で並べ替えます。
xlSortColumns 列単位で並べ替えます。
(2002のヘルプより)

ところが上の操作をマクロの記録機能でトレースしてみると・・・
列単位の並べ替えは「xlSortColumns」ではなく「xlLeftToRight」という定数で記録されます。
行単位の並べ替えは「xlSortRows」ではなく「xlTopToBottom」。
まあ、そっちの方がわかりやすいですがw

いちおうxlSortRows・xlSortColumnsという定数も存在はしていて、値が割り当てられています。
ところが、その値がおかしい:

イメージ 7

どうも逆に割り当てられている模様。それで別の定数を作ったってことなのかもしれません。
実はこの間違い、以前から知られてるんですがMSDN見たらいまだに同じ説明になってました:


直さねーのかしら(^ω^;)
とりあえず、xlTopToBottom・xlLeftToRightを使っておけば間違いないようです。

知らなかったので覚え書きまで。

ワークシートにはNameとCodeNameという名前を表すプロパティが二つあります。

イメージ 1

Nameはシートのタブにふつうにつけた名前。

イメージ 2

CodeNameはプロパティウィンドウに表示されている通りオブジェクト名です。
当然ながら、Nameの方はユーザーが自由に変更できてしまいます。
なのでコード内でシートを識別させるときはCodeNameを使うことが多いです。

このCodeNameというプロパティ、VBEを開いてプロパティウィンドウで手作業で変更することはできますが:

イメージ 3

実行時にコードから変更するのはできないことになってます:

オブジェクトのコード名を返します。値の取得のみ可能です。文字列型 (String) の値を使用します。
・・・デザイン時に、このプロパティの値を変更してコード名を変更することができます。
実行時に、このプロパティの値をコードで変更することはできません。(ヘルプより)

試しにこんなコードを実行させてみると:
Sheet1.CodeName="shSample"
こんなエラーが:

イメージ 4

ところが、コードから変更させたいケースに遭遇。

どうにかならんのかしら?と調べてたらわかりました。
CodeNameは確かに変更することができません。
が、オブジェクト名としてVBComponentsのNameプロパティからアクセスすることができるという。
こう書きます:
ThisWorkbook.VBProject.VBComponents("Sheet1").Name = "shSample"
実行結果:

イメージ 5

おお。なせばなる。
Excel2002と2007で動作確認できました。VBAって深いです。

↑このページのトップヘ