[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ブランクを含まず昇順ソート』(ひよこ)
別件に関連しての質問となります。
A列の1〜3000行目を昇順でソートする場合、
ブランクが上の行にきてデータが下になってしまいます。
たとえば1〜100行までデータがあって、
1〜3000行までを昇順ソートする場合
100行までを昇順データ、
101〜3000行までをブランクにする方法はどうしたら良いでしょうか?
都度実施なら設定すればOKですが、マクロでやりたいので・・・・
お願いします。
条件分岐で、
セル=空白ならば無視、
空白でないならばソート。
別の考え方で、データのある範囲のみを昇順ソートするマクロの方が簡単でしょうか。
データがA2〜A100まであるなら、2行目から100行目までをマクロで昇順ソートする。
という方法でもかまいません。
データは2行目からありますが何行あるかは毎回違ってきます。
あるいは、
最初の質問のソート方法でソートされた後、
空白部分と空白でない部分をごっそり入れ替えるという処理を
追加されてはいかがでしょうか?
その都度手作業であれば簡単ですが・・・
マクロの一部でやるとなると、どう範囲を指定したら良いでしょうか?
こんにちは
データのある範囲、 Sub test() Range("A2", Range("A" & Rows.Count).End(xlUp)).Sort Range("A2"), xlAscending, header:=xlYes End Sub A2 には項目名が入っているものとしてます。 (ウッシ)
by素人です
>A列の1〜3000行目を昇順でソートする場合、ブランクが上の行にきてデータが下になってしまいます。 どうやってソートしていますか? 2003までなら、標準機能のソートの場合、空白が下になりますけど。 標準機能のソートだったら、マクロ記録でもすれば、コードの原型が作れますよ。 エクセルのバージョンも書いておいた方がいいですね。 BJ
Range("A2", Range("A" & Rows.Count).End(xlUp)).Sort Range("A2"), xlAscending, header:=xlYes End Sub
最終行 (END HOME)がデータコピーの関係上で3000行となっています。
その関係か上のマクロを実行すると3000行目までのブランクは上にきてしまいました。
何か対応策はありますでしょうか?
エクセルは2000です。
こんにちは セル A3000 に(END HOME)と入っているのですか? Sub test() Range("A2", Range("A3000").End(xlUp)).Sort Range("A2"), xlAscending, header:=xlYes End Sub これで、どうでしょうか? (ウッシ)
>2003までなら、標準機能のソートの場合、空白が下になりますけど。
確かにそうですね・・・
長いコードから一部を抜き出してデータ取得し、作業用シートにコピーしているのですが、
関数で元データがないものはIF(a1="","",B1&C1&D1)のように""でブランクとしているのですが
ソート時は空白と見なされないのでしょうか?
データは100行しかないとしても、end → home と押すと 3000行まで飛んでいきます。
これは元データを3000行までコピーして、貼り付けているからだと思うのですが・・・
Sub test()
Range("A2", Range("A3000").End(xlUp)).Sort Range("A2"), xlAscending, header:=xlYes End Sub
↑やはりブランクが上にきます。
元データがないものはIF(a1="","",B1&C1&D1)のように""で
ブランクとして3000行まで貼り付けているのですがこれが問題なのでしょうか?
余談ですが、元々何も入力していないセルと、IF関数で、『セル="",""』で""を挿入したセルは、別のものです。
同じ状態ではありません。
ExcelVBAマクロを使用しておられるのであれば、空白を検出した時は、空白("")を挿入と処理するのではなく、処理をせずスルーとするか、clearcontentsなどで値をクリアするといった処理としてください。
ぶつかりました。 >元データがないものはIF(a1="","",B1&C1&D1)のように""で なんかこれ循環したりしませんか? A1に文字かなにか入っているのかな? BJ
たしかに""でコピーした部分は、ISBLANK関数で見ても空白ではないようです。
""で貼り付けた部分を空白にする必要がありますね。
素人ですいませんが、""で貼り付けられている部分を空白にする方法を教えていただけますか?
clearcontentsが関数なら自力でできますが、関数ではないようですので・・・
こんにちは (END HOME)ってキー操作の事だったんですね。 使った事ないので分からなかったです。 普通はキー操作の場合は、END+HOME とか書く事が多いです。
Sub test2() Dim r As Long r = Range("A2:A3000").Find("*", Range("A2"), xlValues, xlWhole, , xlPrevious).Row Range("A2:A" & r).Sort Range("A2"), xlAscending, header:=xlYes End Sub
で出来ると思いますけど、IF(a1="","",B1&C1&D1) この式が実際の式だとするとおかしくなりませんか?
(ウッシ)
素人なもので、ご迷惑をおかけしました。
とりあえずは最初に""を"コード無"としておいて、
昇順ソート後に"コード無し"を""にすることでなんとか素人なりに対応しました。
かなはソートの後にきますので・・・
VBAは難しいです。
こんにちは みんな値にして良ければ、 Sub test3() With Range("A2:A3000") .Value = .Value .Sort Range("A2"), xlAscending, header:=xlYes End With End Sub でも出来ますよ。 (ウッシ)
>たしかに""でコピーした部分は、ISBLANK関数で見ても空白ではないようです。 コピーして値貼り付けでしょうか? 長さ0の文字が入るから、ブランクにはなりませんが、ひょっとしたらと思って 同じようにやってみたのですが、長さ0の文字が下にきました。 振り仮名を使う使わないでも同じでしたけど?? (データの内容で違いが出ているのかもしれませんが。)
>""で貼り付けられている部分を空白にする方法 A列を選択して、データ→区切り位置→そのまま完了。 BJ
(素人です)
あまり読まずに取り急ぎ回答したので、先ほどの件についても、一応もう少し補足説明しておきます。
ExcelのIF関数で『セル=""』ならばという処理では、下記1、2、3、いずれの場合もYES判定となります。
1.元々何も入力していないセル
2.セルを選択してDeleteキーにて値と数式を消去したセル
3.『セル="",""』の関数の入ったセル
しかし、VBAマクロにて、セル.valueで見た場合は、1と2は同じですが、3のセルは別物となります。
関数では、1や2の状態とする方法はありません。
マクロでは、セルを選択してDeleteキーという処理をマクロ記憶させるか、VBAを記述されるのであれば、セル.clearcontentsの処理にて、いずれの場合も2の状態とし、1と同じ状態とできます。
また、ざっと読み直しさせていただいたところ、下記を見落としていました。
>作業用シートにコピーしているのですが、
>関数で元データがないものはIF(a1="","",B1&C1&D1)のように""でブランクとしている
関数が入っている時点で、1や2の状態と別物ですね。
元データがどのようなものかわかれば、もう少し考えやすいかもしれないですが、
例えば元データに0がない場合、""の代わりに0を挿入するようにして、
IF(a1="",0,B1&C1&D1)としておいて、0の部分と0以上の部分でソートするとか、
あるいは、元データが仮に〜9999だとしたら、
IF(a1="",10000,B1&C1&D1)と絶対的に元データより大きい数字を入力しておいてソートするとかではいかがでしょうか?
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.