こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA ソートについて

win7、Excelは2013を使用しています。

VBAでソートのコーディングをしたいのですが、
画像の様に、途中で空白のセルを順番指定して並べ替りできますか?
下記の ここに空白セルを指定する のところに空白セルを指定したいのですが、
そもそもそういう事が出来るものなのでしょうか.....
よろしくお願い致します。

Sub ソート()
With ActiveSheet.Sort.SortFields
.Clear
.Add key:=Range("D2"), SortOn:=xlSortOnValues, _
Order:=xlAscending, CustomOrder:= _
"A,D,H,G,F,D,B,ここに空白セルを指定する,R" _
, DataOption:=xlSortNormal
End With

With ActiveSheet.Sort
.SetRange Range(Cells(2, 4), Cells(9, 4))
.Apply
End With
End Sub

投稿日時 - 2018-04-05 16:54:55

QNo.9485392

困ってます

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

>下記の ここに空白セルを指定する のところに空白セルを指定したいのですが、
>そもそもそういう事が出来るものなのでしょうか.....

ブランクはソートリストで指定出来ないので、

1.ソートする範囲内にブランクセルがあったら「データとして存在しない値」に置換する。
2.ソートを行なう。
3.元々ブランクセルだったセルをブランクセルにする。

と言う処理が必要です。

上記を踏まえて修正すると、以下のようになります。

Sub ソート()
For Each rg In Range(Cells(2, 4), Cells(9, 4))
If IsEmpty(rg) Then rg.Value = "@@@"
Next
With ActiveSheet.Sort.SortFields
.Clear
.Add key:=Range("D2"), SortOn:=xlSortOnValues, _
Order:=xlAscending, CustomOrder:= _
"A,D,H,G,F,D,B,@@@,R" _
, DataOption:=xlSortNormal
End With

With ActiveSheet.Sort
.SetRange Range(Cells(2, 4), Cells(9, 4))
.Apply
End With
For Each rg In Range(Cells(2, 4), Cells(9, 4))
If rg.Value = "@@@" Then rg.ClearContents
Next
End Sub

「元のシート内には"@@@"と言うデータが無い」と言う前提で「@@@をブランクセルの代わりにする」のです。

なお「ブランクセルの判断」に「IsBlank()」を使っているので「見た目は空白だけど、式とかが入っているセル」は「ブランクではない」と判断されます。

例えば「=IF(エラー判定,何らかの式,"")」のように「エラーなら空白にする」と言うような式で空白になったセルは、思い通りには並びません。「ニセのブランク」として、先頭に並んでしまいます。

投稿日時 - 2018-04-05 17:50:46

お礼

chie65535様

ご回答いただき、ありがとうございます。

>1.ソートする範囲内にブランクセルがあったら「データとして存在しない値」に置換する。
>2.ソートを行なう。
>3.元々ブランクセルだったセルをブランクセルにする。

目から鱗でした。

"@@@"だとなぜか上手くいかなかったので、"空白"にしてみたら、
希望通りの処理が出来ました。

丁寧に分かりやすく教えて頂いたので、
アレンジするポイントも分かりやすく、大変有難かったです。

投稿日時 - 2018-04-06 14:31:08

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)