[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザー設定リストで並べ替え後、上書き保存出来ない』(稲葉)
エクセル2007から2013に更新後に同一ブック、コードで起きるようになりました。 範囲を小さくしたり、条件付き書式を消したり、環境依存文字を消したりと 考えられる限り実行しましたが、どうにもならなかったので、 同様の現象に心当たりが有る方、直し方教えてください。
データはテストデータジェネレータで作成しました。
再現手順
「名簿」シート
B3セルにフォームコントロールで、「並べ替え」マクロを設定
|[A]|[B]|[C] |[D] |[E] |[F] |[G] |[H]
[1] | | | | | | | |
[2] | | | | | | | |
[3] | | | | | | | |
[4] | |No |社名 |担当 |性別|生年月日|契約日 |満了日
[5] | | |ABC綜合|藤沢 勤 |男 |90.06.02|15.08.21|15.11.20
[6] | | 1|ABC綜合|石橋 伸江 |女 |70.04.11|15.07.29|
[7] | | 2|ABC綜合|石橋 朋 |女 |88.04.21|15.08.21|
[8] | | 3|ABC綜合|長田 僧三郎|男 |70.08.22|15.08.21|
[9] | | 4|ABC綜合|高田 文吾 |男 |76.12.21|15.08.21|
[10]| | 5|XYZ戦力|志村 敬 |男 |86.05.16|15.08.21|
[11]| | |XYZ戦力|菅 幸信 |男 |87.05.29|15.08.21|15.11.20
[12]| | |XYZ戦力|三谷 勝英 |男 |90.09.19|15.08.21|15.11.20
[13]| | 6|XYZ戦力|菅野 純隆 |男 |87.08.10|15.08.21|
[14]| | 7|DEF商会|宮崎 秀俊 |男 |93.05.26|14.04.09|
[15]| | |XYZ戦力|丹羽 茂信 |男 |84.05.04|15.08.21|15.11.20
[16]| | |DEF商会|島崎 健生 |男 |71.04.22|15.11.21|16.02.20
[17]| | 8|DEF商会|宮川 三重子|女 |74.04.02|15.11.21|
[18]| | 9|DEF商会|西尾 邦江 |女 |84.07.02|15.11.21|
[19]| | 10|DEF商会|飯島 克 |男 |93.09.29|15.05.21|
[20]| | 11|DEF商会|西野 威佐夫|男 |93.09.20|15.11.21|
[21]| | 12|DEF商会|古谷 広重 |男 |76.06.28|15.11.21|
[22]| | 13|DEF商会|山田 永基 |男 |86.08.01|15.09.17|
[23]| | |DEF商会|黒田 令 |女 |76.07.08|15.11.21|16.02.20
[24]| | 14|XYZ戦力|新田 邦美 |女 |86.11.14|15.12.24|
[25]| | | | | | | |
「並べ替えリスト」シート
|[A]
[1]|会社一覧
[2]|ABC綜合
[3]|XYZ戦力
[4]|DEF商会
[5]|
標準モジュール(Module1)
Option Explicit
Sub 並べ替え()
Dim WS As Worksheet
Set WS = ThisWorkbook.Sheets("名簿")
With Sheets("並べ替えリスト")
Application.AddCustomList ListArray:=.Range("A1:A" & .Range("A100").End(xlUp).Row)
End With
With WS.Sort
With .SortFields
.Clear
.Add Key:=WS.Range("C5:C501") _
, SortOn:=xlSortOnValues _
, Order:=xlAscending _
, CustomOrder:=Application.CustomListCount _
, DataOption:=xlSortNormal
End With
.SetRange WS.Range("B4:AQ501") '//範囲が拡張したとき用にAQまで。
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.DeleteCustomList (Application.CustomListCount)
End Sub
上の状態で並べ替えマクロを実行し、上書き保存しようとするとエラーが出て保存できません。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
「Microsoft Excelは動作を停止しました」現象は再現。 Windows7 Pro 64bit Excel2013 とりあえず試したこと ・Excel97-2003 ブック(*.xls)形式にしたら動作停止は発生しなくなった ・Application.DeleteCustomList Application.CustomListCountを削って動かす 1.並べ替え後、保存しても動作停止は【発生しない】 2.「1」で保存後、DeleteCustomListを動かして保存すると動作停止が【発生する】 3.「1」で保存後、Excelを起動しなおしてからDeleteCustomListを動かして保存すると動作停止は【発生しない】 スマートな解決方法は見つけ切れなかった。 なんか発生パターンがコレに似ている気もする [[20140404152537]] 『UFClr1228の不具合』(matsudesk) (ご近所PG) 2015/12/29(火) 15:24
ご近所PGさん 確認ありがとうございます。 頂いたヒントを元に、検索したところ、マイクロソフトコミュニティで以下のスレッドを見つけ、 下記コードの通り修正したところ、現象を回避出来ました。
==引用ここから > ルビちゃん 返信日 3月 7, 2014投稿履歴を表示する >ユーザー設定リストでソート後 >ソートを行ったシート.Sort.SortFields.Clear >(中略) >恐らく、Excel2007以降ソートの仕様が変わり >ソートの情報をシートなりセルなりに保存できるようになり >そのシートのソート情報には【ユーザー設定リストの何番目】という情報があるのに >その【ユーザー設定リストの何番目】は削除されたため >Excelがどうしたらよいかわからなくなり→何も言わずに異常終了 ==引用ここまで
Sub 並べ替え()
Dim WS As Worksheet
Set WS = ThisWorkbook.Sheets("名簿")
'★DeleteCustomListを消しただけだと、追加するときにエラーになる
With Sheets("並べ替えリスト")
Application.AddCustomList ListArray:=.Range("A1:A" & .Range("A100").End(xlUp).Row)
End With
With WS.Sort
(省略)
.Apply
Application.DeleteCustomList (Application.CustomListCount) '★記述場所の変更
.SortFields.Clear '★追加
End With
End Sub
2007からSort変わった癖に、2013でエラーってどういうことだと言いたいっす・・・
お騒がせしました。解決です。 (稲葉) 2015/12/29(火) 15:51
もう、ご覧にならないかもしれませんが。
>2007からSort変わった癖に、2013でエラーってどういうことだと言いたいっす・・・
お気持ちはわかります。ただ、稲葉さんが見つけられたトピの記載にもありますように、 もともと、手作業で並び替えを行っても、それが、直近、どいうった要件で並び替えられたのかという情報が ダイアログに書きこまれていますよね。つまり、エクセルは、保存時に、そういった情報も書きこむんだろうと想像します。 で、見つからないので、エラー。まぁ、なんらかのメッセージを出し、情報は書きこみません なんて知らせてくれればありがたいと思いますね。
ところで、2007 から、登録済みのユーザー設定リストを使う以外に、自分で、リスト配列を指定できるという機能がありますね。 CustomOrder:="hoge1,hoge2,hoge3,・・・・" と指定可能ですね。 つまり、AddCustomListへの Add や Delete が不要になります。 この文字列を並び替えリストデータから生成して適用してやることもできます。
以下、ご参考まで。
Sub 並べ替え2()
Dim w As Variant
Dim WS As Worksheet
Set WS = ThisWorkbook.Sheets("名簿")
With Sheets("並べ替えリスト")
w = WorksheetFunction.Transpose(.Range("A1", .Range("A" & Rows.Count).End(xlUp)).Value)
End With
With WS.Sort
With .SortFields
.Clear
.Add Key:=WS.Range("C5:C501") _
, SortOn:=xlSortOnValues _
, Order:=xlAscending _
, CustomOrder:=CStr(Join(w, ",")) _
, DataOption:=xlSortNormal
End With
.SetRange WS.Range("B4:AQ501") '//範囲が拡張したとき用にAQまで。
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
(β) 2015/12/29(火) 16:20
↑ これはユーザー設定リストへの登録でも同じことが言えますが、配列文字列が 255 を超えると不具合が発生しますので 留意が必要ですね。
(β) 2015/12/29(火) 16:23
βさん いつもありがとうございます! > ところで、2007 から、登録済みのユーザー設定リストを使う以外に、自分で、リスト配列を指定できるという機能がありますね。 全く、忘れておりました。 早速そのように変更致しました。 1日悩んでいた自分が恥ずかしい限りです。
ありがとうございました!
(稲葉) 2015/12/29(火) 16:58
すみません、ついでにもう一つ教えてください
変更点の抜粋です。
Dim w As String 'Variant
w = CStr(Join(WorksheetFunction.Transpose(.Range("A1", .Range("A" & Rows.Count).End(xlUp)).Value)))
, CustomOrder:=w _
これだとエラー13になって (同) , CustomOrder:=cstr(w) _
だと通るってどういう理屈ですか? VarTypeで見ると、どちらも8なのですが・・
(稲葉) 2015/12/29(火) 17:13
以前、最初に、この方式でコードを書いたときに私も悩みました。 で、いろいろ試行錯誤しながら、Joinしたものを文字列変換したものを与えるとOKになるというところに たどり着きました。
理屈はわからないのですが、純粋な文字列型と内部形式文字列型のVariant型の違い・・・なんでしょうかね?
(β) 2015/12/29(火) 18:06
遅くなりました。 ありがとうございます。 バージョンが変わるたびに四苦八苦です・・・。
今年もお世話になりました。 来年もよろしくお願いいたします
よいお年を! (稲葉) 2015/12/29(火) 20:34
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.