Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2804 / 13644 ツリー ←次へ | 前へ→

【65757】ソートの並べ替え基準の指定方法 kei 10/6/25(金) 11:11 質問[未読]
【65777】Re:ソートの並べ替え基準の指定方法 りん 10/6/27(日) 9:50 回答[未読]
【65788】Re:ソートの並べ替え基準の指定方法 kei 10/6/28(月) 9:51 お礼[未読]
【65804】Re:ソートの並べ替え基準の指定方法 りん 10/6/28(月) 20:28 発言[未読]
【65859】Re:ソートの並べ替え基準の指定方法 けい 10/7/1(木) 15:19 質問[未読]
【65860】Re:ソートの並べ替え基準の指定方法 Jaka 10/7/1(木) 16:23 発言[未読]
【65869】Re:ソートの並べ替え基準の指定方法 けい 10/7/2(金) 20:06 質問[未読]
【65879】Re:ソートの並べ替え基準の指定方法 Jaka 10/7/5(月) 11:36 発言[未読]
【65883】Re:ソートの並べ替え基準の指定方法 けい 10/7/5(月) 14:21 質問[未読]
【65884】Re:ソートの並べ替え基準の指定方法 Jaka 10/7/5(月) 15:16 発言[未読]
【65886】Re:ソートの並べ替え基準の指定方法 けい 10/7/5(月) 16:28 お礼[未読]

【65757】ソートの並べ替え基準の指定方法
質問  kei  - 10/6/25(金) 11:11 -

引用なし
パスワード
   お世話になります。
データの位置がはっきりしないシートでのソートの仕方について
教えてください。
データの範囲はあるタイトル文字を探した後に、そのタイトルから2行下が
データなので、行を変数kとして範囲を設定することができました。
(データのみ範囲)
列はAからE列までと変わりませんが、件数は増減するので、
.End(xlDown)で範囲設定をしました。

次に、ソートの基準のセルを設定したいのですが、これもまたセルを変数で
設定しなければならないので、Cellsで指定しようとしましたが、エラーに
なりました。

Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
Key1:=Range(Cells(k,"A")), Order1:=xlAscending, _
Key2:=Range(Cells(k,"E")), Order2:=xlAscending, Header:=xlGuess

何か方法がないか教えてください。
よろしくお願いいたします。

【65777】Re:ソートの並べ替え基準の指定方法
回答  りん E-MAIL  - 10/6/27(日) 9:50 -

引用なし
パスワード
   kei さん、こんにちは。

>データの範囲はあるタイトル文字を探した後に、そのタイトルから2行下が
>データなので、行を変数kとして範囲を設定することができました。
>(データのみ範囲)
>列はAからE列までと変わりませんが、件数は増減するので、
>.End(xlDown)で範囲設定をしました。

>次に、ソートの基準のセルを設定したいのですが、これもまたセルを変数で
>設定しなければならないので、Cellsで指定しようとしましたが、エラーに
>なりました。

Keyのところの、Rangeが余計ですね。

  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
   Key1:=Cells(k, "A"), Order1:=xlAscending, _
   Key2:=Cells(k, "E"), Order2:=xlAscending, Header:=xlNo

これでいかがでしょうか?

【65788】Re:ソートの並べ替え基準の指定方法
お礼  kei  - 10/6/28(月) 9:51 -

引用なし
パスワード
   ▼りん さん:

ご回答ありがとうございました。
Rangeが必用なのかと思っていました。
Rangeを外したら、うまくソートができました。

無事解決です。
どうもありがとうございました。


>kei さん、こんにちは。
>
>>データの範囲はあるタイトル文字を探した後に、そのタイトルから2行下が
>>データなので、行を変数kとして範囲を設定することができました。
>>(データのみ範囲)
>>列はAからE列までと変わりませんが、件数は増減するので、
>>.End(xlDown)で範囲設定をしました。
>
>>次に、ソートの基準のセルを設定したいのですが、これもまたセルを変数で
>>設定しなければならないので、Cellsで指定しようとしましたが、エラーに
>>なりました。
>
>Keyのところの、Rangeが余計ですね。
>
>  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
>   Key1:=Cells(k, "A"), Order1:=xlAscending, _
>   Key2:=Cells(k, "E"), Order2:=xlAscending, Header:=xlNo
>
>これでいかがでしょうか?

【65804】Re:ソートの並べ替え基準の指定方法
発言  りん E-MAIL  - 10/6/28(月) 20:28 -

引用なし
パスワード
   kei さん、こんばんわ。

>Rangeを外したら、うまくソートができました。
Range コレクションのヘルプを見ていただけばわかりますが、

1 つのセルまたはセル範囲を表す Range オブジェクトを取得するには、Range(arg) プロパティを使用します。引数 arg には、範囲の名前を指定します。

ということなので、

  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
   Key1:=Range("A" & k), Order1:=xlAscending, _
   Key2:=Range("E" & k), Order2:=xlAscending, Header:=xlNo

こうなります。

【65859】Re:ソートの並べ替え基準の指定方法
質問  けい  - 10/7/1(木) 15:19 -

引用なし
パスワード
   ▼りん さん:

先日はソートに関するご回答をありがとうございました。
上手くいって喜んでいましたが、一つ問題が起こりました。

範囲を指定してからソートをしていますが、VBAに限らず、
1行しかないデータはソートをかけると下段が空白であった場合次の文字が
出てくるところまでを再下段としてみてしまうようです。
これによって、同じかたまりではないデータまでもソートをしてしまい
おかしなことになってしまいました。
1行しかない場合はソートをしないという方法はないでしょうか。
範囲は何行になるか決まっていません。
複数シートがあり、1行のところもあれば、4行のところもあれば
まったくない場合もあります。
2行以上の時だけ、範囲を指定してソートにできたらよいのですが。

  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
   Key1:=Range("A" & k), Order1:=xlAscending, _
   Key2:=Range("E" & k), Order2:=xlAscending, Header:=xlNo

何を直すか、又は加えるものがあればよいか教えてください。
よろしくお願いいたします。


>kei さん、こんばんわ。
>
>>Rangeを外したら、うまくソートができました。
>Range コレクションのヘルプを見ていただけばわかりますが、
>
>1 つのセルまたはセル範囲を表す Range オブジェクトを取得するには、Range(arg) プロパティを使用します。引数 arg には、範囲の名前を指定します。
>
>ということなので、
>
>  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
>   Key1:=Range("A" & k), Order1:=xlAscending, _
>   Key2:=Range("E" & k), Order2:=xlAscending, Header:=xlNo
>
>こうなります。

【65860】Re:ソートの並べ替え基準の指定方法
発言  Jaka  - 10/7/1(木) 16:23 -

引用なし
パスワード
   これで範囲の行数がわかるから、判定材料にしてください。

Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).rows.count

【65869】Re:ソートの並べ替え基準の指定方法
質問  けい  - 10/7/2(金) 20:06 -

引用なし
パスワード
   ▼Jaka さん:

こんばんは。
データの範囲指定について、不思議なことがありまして
質問させてください。

  Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).Sort _
   Key1:=Range("A" & k), Order1:=xlAscending, _
   Key2:=Range("E" & k), Order2:=xlAscending, Header:=xlNo

この1番上のコードで範囲指定をしていますが、
これはキーボードでいうShift + Ctr + ↓
と必ずしも同じ意味にはならないのでしょうか?

データの中身に空白があったりすると範囲を途中でやめてしまっていたり
また空白行以上の範囲まで囲ってしまったりするパターンもあり
キーボードの操作と違う結果になってしまうことがあるます。

何かプログラム的にこんなことがありえるということがありましたら
教えてください。
よろしくお願いいたします。


>これで範囲の行数がわかるから、判定材料にしてください。
>
>Range(Cells(k, "A"), Cells(k, "E").End(xlDown)).rows.count

【65879】Re:ソートの並べ替え基準の指定方法
発言  Jaka  - 10/7/5(月) 11:36 -

引用なし
パスワード
   >これはキーボードでいうShift + Ctr + ↓
>と必ずしも同じ意味にはならないのでしょうか?
え〜と、どういった状況でのShift + Ctr + ↓なのかわからないのでなんともいえませんが、
「キーボードでいうShift + Ctr + ↓」という操作は、ほとんど特定パターンでしか試されたことが無いのでは?

Shift + Ctr + ↓は曲者で、E列K行のセルの状態やその下のセル、さらにその下のセルの状態で結果が変わりますから

、その辺りを理解していないで使うと苦労すると思います。
時と場合によりけりで、使いますし、使う場合は未然チェックが面倒ですね。

例えば、以下のパターンで、Shift + Ctr + ↓ を押してみてください。
法則が解りにくいでしょ。

パターン1
  A
1 データ
2 空白

パターン2
  A
1 データ
2 データ
3 空白

パターン3
  A
1 空白
2 データ
3 データ

パターン4
  A
1 データ
2 データ
3 データ

パターン5
  A
1 空白
2 空白
3 データ
4 データ

ひょっとして、A1〜E1を選択してとかの Shift + Ctr + ↓?
だったら、止めた方がいいです。
状況でまちまちなので。

【65883】Re:ソートの並べ替え基準の指定方法
質問  けい  - 10/7/5(月) 14:21 -

引用なし
パスワード
   ▼Jaka さん:

ご返信ありがとうございます。

>ひょっとして、A1〜E1を選択してとかの Shift + Ctr + ↓?
>だったら、止めた方がいいです。

はい、このようにA1〜E1を選択して Shift + Ctr + ↓というような
プログラムを書いてみたら、思ったような結果が出ませんでした。

なので最初の行の上に空白行を挿入してからCurrentRegionを使って
使われている領域として範囲指定することにしました。

どうもありがとうございました。
重ねてお聞きして申し訳ありませんが、この範囲を指定した後に
F列にIfでB列の中身を見てからグループ名のようなものを出すという
作業があるのですが、下に向かって空白行になるまで処理を繰り返す
というプログラムを作っています。

セルではなく、行全体が空白になるまで繰り返すという文を
Doのところに書きたいのですが、そのように書いたらできますか?

  Do Until Cells(i, "B").Value = ""

これをセルではなく行が空白でなくなるまでにしたいのですが、
いろいろテストしてみましたが、うまくできません。
ご回答お願いいたします。


>>これはキーボードでいうShift + Ctr + ↓
>>と必ずしも同じ意味にはならないのでしょうか?
>え〜と、どういった状況でのShift + Ctr + ↓なのかわからないのでなんともいえませんが、
>「キーボードでいうShift + Ctr + ↓」という操作は、ほとんど特定パターンでしか試されたことが無いのでは?
>
>Shift + Ctr + ↓は曲者で、E列K行のセルの状態やその下のセル、さらにその下のセルの状態で結果が変わりますから
>
>、その辺りを理解していないで使うと苦労すると思います。
>時と場合によりけりで、使いますし、使う場合は未然チェックが面倒ですね。
>
>例えば、以下のパターンで、Shift + Ctr + ↓ を押してみてください。
>法則が解りにくいでしょ。
>
>パターン1
>  A
>1 データ
>2 空白
>
>パターン2
>  A
>1 データ
>2 データ
>3 空白
>
>パターン3
>  A
>1 空白
>2 データ
>3 データ
>
>パターン4
>  A
>1 データ
>2 データ
>3 データ
>
>パターン5
>  A
>1 空白
>2 空白
>3 データ
>4 データ
>
>ひょっとして、A1〜E1を選択してとかの Shift + Ctr + ↓?
>だったら、止めた方がいいです。
>状況でまちまちなので。

【65884】Re:ソートの並べ替え基準の指定方法
発言  Jaka  - 10/7/5(月) 15:16 -

引用なし
パスワード
   空白と言うのが微妙ですが、

Do Until Application.CountA(Cells(i, "B").EntireRow) = 0

とか?
因みに ="" は、空白でないと見ます。

【65886】Re:ソートの並べ替え基準の指定方法
お礼  けい  - 10/7/5(月) 16:28 -

引用なし
パスワード
   ▼Jaka さん:

何度もありがとうございました。
勉強になり助かりました。

ありがとうございます。

>空白と言うのが微妙ですが、
>
>Do Until Application.CountA(Cells(i, "B").EntireRow) = 0
>
>とか?
>因みに ="" は、空白でないと見ます。

2804 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free