エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その83です。
キューバ屈指の外人向けリゾート地、バラデロにて。
バラデロ4日目のお昼。
いよいよ、マタンザス経由の高速バスで、ハバナに帰ります。
本当は、列車で帰りたかったのですが…。列車が運行していないということで、あえなく断念。
荷物を持って、バスターミナルに向かいます。
バラデロ、表通りから、見えた通りをちらっと撮影。
お土産屋。
リゾートらしい建物。
公民館のような建物。
公民館のような建物。別の角度から。
絵を売っているよう。
露出の多い女性陣。とにかく暑い!
振り返ってみました。
バスターミナルは、左側の木々の向こうです。もうすぐ。
ということで、バスに乗り込み、ハバナへ。
この写真は、、もう、バスの中からの風景。
塾長のキューバ旅行記、最初から読みたい方はこちらから
今日は、小ネタ。
表示されていないシート上での並べ替えをするには?という件。
何かというと。
Excel 2003までのバージョンでも動くSortメソッドは、以下のような形になる。
(以下のサンプルは、Excel 2003までのバージョンのエクセルて、自動記録をしながら並べ替えの操作をすると、容易に得られる)
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortTextAsNumbers
以下、途中改行を取り除き、今回の話に大きく関係しそうにない引数を取り除き、整形してみた。
Range(“A2:K18”).Sort _
Key1:=Range(“C2”), _
Order1:=xlAscending, _
Header:=xlGuess
このとき、「この作業対象のシート以外のシートが表示されていたとしても、並べ替えがされるようにしたい」というニーズがある。
例えば、この並べ替え対象の表は、「Sheet1」というシートにある。
そして、表示されているシートは、「Sheet2」だ。
さて、どうするか。
以下では、エラーが発生して動かない。
Sub sample1()
Worksheets(“Sheet1”).Range(“A2:K18”).Sort _
Key1:=Range(“C2”), _
Order1:=xlAscending, _
Header:=xlGuess
End Sub
以下で、動くようになる。
Sub sample2()
Worksheets(“Sheet1”).Range(“A2:K18”).Sort _
Key1:=Worksheets(“Sheet1”).Range(“C2”), _
&nbs
p; Order1:=xlAscending, _
Header:=xlGuess
End Sub
よくよく考えれば分かることなのだが。
実は、IBMで社内講師をしていたころも、
その後、IT系のベンチャーで働いていたころも、
そのあとも、かなり長いこと、
こんな簡単な問題とは気がつかず、
そういうことはできないものと思って、あきらめていた。
ある日、ふと、「?」と思ってsample2の方法でやってみたら、
「あっさり動いた。。なんだ」と思ったというわけ ヾ(´ー`)ノ
ちなみに、以下の書き方でも、問題回避できる。
(※並べ替え対象の列のタイトルが”社員区分”だったと仮定)
Sub sample3()
Worksheets(“Sheet1”).Range(“A2:K18″).Sort _
Key1:=”社員区分”, _
Order1:=xlAscending, _
Header:=xlGuess
End Sub
ここで、整理してみる。
以下、Excel 2003までの Sort メソッドについてのヘルプから、引用。
要は、並べ替えする対象の列を、その列のタイトルとなる文字列か、セルで指定すればよい、ということ。
この解決策に気がつくまでは、以下のような回避策を実施していた。
この問題の解決策としてはもはや不適切…というか、ベストにはほど遠いが、手法自体は応用が効くものとも思うので、ご紹介。
Sub sample4()
Dim w As Worksheet
Set w = ActiveSheet
Worksheets(“Sheet1”).Activate
Range(“A2:K18”).Sort _
Key1:=Range(“C2”), _
Order1:=xlAscending, _
Header:=xlGuess
w.Activate
End Sub
いろいろ参考にしてください。