プロが教える店舗&オフィスのセキュリティ対策術

A1に会社名のカタカナ。B1に会社名があります。
10行程度すでにデータが入っている状態で
途中行に新たに1行を挿入したのち
増えた行数分(全部で11行)も含めて並べ替えをするという作業を行います。

その場合、マクロで以上の手順を踏むと
1度目はうまくいくのですが
2度目になると相対参照でマクロを設定したにも関わらず
11行目までしかソートされません。
12行目がソートの範囲に入らないのです。

行が増えた分も含めて、すべての行数をソートするには
どのようなVBAを組めばいいのでしょうか?
ご教授ください。

A 回答 (3件)

#02です。

代替案は後で示しますが、補足文の内容だけでは「論理的に不可能」です。

>途中の3行目に1行挿入後
なぜならこの状態で1行目~11行目が「ひとまとまり」になる条件が書かれていないからです。その条件が明示されない限りVBAでソートする範囲を決定できません。

ですから再度A1:B10、A11:B20が「ひとまとまり」であることを判断する条件を補足してください。(人が目で見てできるなら何らかの条件があるはずです)

代替案として最初にA1:B10、A11:B20にそれぞれ名前定義しておく方法があります。それであれば範囲の途中行に行挿入されてもソートが可能です。定義された名前が「grpA」だとするとソートするVBAは以下のようになります
 Range("grpA").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
  :=xlPinYin, DataOption1:=xlSortNormal

でもこの方法は完全ではありません。それは11行目に挿入が行われた場合、その行はどちらの名前定義にも含まれないからです。従ってソートされません。
    • good
    • 1

ソート時の範囲の記述を3つ書きます。



・カレントリージョン(「Shift+Ctrl+*」で選択される範囲)
 Range("A1").CurrentRegion.Sort Key1:=Range("A1"), …以下省略

・A:B列
 Columns("A:B").Sort Key1:=Range("A1"), …以下省略

・A1からB列の最終行までを範囲とする
 Range(Range("A1"), Range("B65536").End(xlUp)).Sort Key1:=Range("A1"), …以下省略

この回答への補足

すみません。VBAを完全に理解しているわけでないので
どこでご指摘の構文を挟めばいいか解らないんです。

NO,1さんの補足にも書いたのですが
このようなソートを行うためにはどうしたらいいか
再度ご教授いただけないでしょうか?
よろしくお願いいたします。ペコリ。

補足日時:2007/08/31 09:33
    • good
    • 0

ソートの範囲指定の際セル範囲ではなく列範囲で指定してみてはいかがでしょうか?

この回答への補足

言葉足らずですみません。
例ですと、A1~B10の範囲でまずソート。
そのあと、A11~B20の範囲でソート。
最終行のB21に合計の計算式が入っています。

その後、途中の3行目に1行挿入と13行目に1行挿入後
今度は
A1~B11の範囲でソート後、A12~B22の範囲でソートして
B23行目に計算式の行がある。
と言う具合にして並べ替えのマクロを組みたいのです。

再度ご教授願います。ペコリ。

補足日時:2007/08/31 09:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!