AddCustomListメソッド...ユーザー設定リストを追加する時、追加済みのリストを重複登録しようとしたらエラーになるのが仕様と思っていたんですが、違うらしい。
ヘルプには
>expression.AddCustomList(ListArray, ByRow)
>ListArray 必ず指定します。バリアント型 (Variant) の値を使用します。文字列の配列または Range オブジェクトを指定します。
とあります。
この引数ListArrayにRangeオブジェクトを指定した時だけエラーになります。
文字列の配列を指定すると、ヘルプどおり
>追加済みのリストを指定したときは、このメソッドは無効になります。
『XL2000: ファイル名を指定して実行時エラーがマクロを使用してユーザー設定リストを追加するには』
http://support.microsoft.com/kb/211811/ja
...バグだったようです。
ちなみにExcel2007でも直っていません。
(テストコード)
シートを追加しA1:A3セルに文字列セット。ユーザー設定リストを追加します。
その後、
・Rangeオブジェクトを指定した場合
・Range().Valueプロパティで指定した場合
・配列で指定した場合
を比較します。
最後に、追加したユーザー設定リストを削除しています。
(結果)
![](https://blogimg.goo.ne.jp/user_image/34/3c/cfa4724fa6672aed29c01b2d2509a30a.png)
ついでですが、ユーザー設定リストを使って並べ替えを行う時のバグ
『[XL2000]GetCustomListNum メソッドで間違ったリスト番号が返る』
http://support.microsoft.com/kb/134913/ja
これも、Excel2007でも直っていません。
#2007ではSortオブジェクトが追加され、仕様が変わっています。
#下位互換のSortメソッドでは、あえてバグを引きずったままのほうが良いのかもしれませんね。
(テストコード)
(結果)
![](https://blogimg.goo.ne.jp/user_image/2f/47/614a2056524de6bb8f8934cb51557f89.png)
ヘルプには
>expression.AddCustomList(ListArray, ByRow)
>ListArray 必ず指定します。バリアント型 (Variant) の値を使用します。文字列の配列または Range オブジェクトを指定します。
とあります。
この引数ListArrayにRangeオブジェクトを指定した時だけエラーになります。
文字列の配列を指定すると、ヘルプどおり
>追加済みのリストを指定したときは、このメソッドは無効になります。
『XL2000: ファイル名を指定して実行時エラーがマクロを使用してユーザー設定リストを追加するには』
http://support.microsoft.com/kb/211811/ja
...バグだったようです。
ちなみにExcel2007でも直っていません。
(テストコード)
シートを追加しA1:A3セルに文字列セット。ユーザー設定リストを追加します。
その後、
・Rangeオブジェクトを指定した場合
・Range().Valueプロパティで指定した場合
・配列で指定した場合
を比較します。
最後に、追加したユーザー設定リストを削除しています。
Sub test() Dim ws As Worksheet Dim v Set ws = Sheets.Add ws.Range("A1:A3").Value = [{"aaa";"bbb";"ccc"}] On Error Resume Next With Application '【1】まずユーザー設定リスト追加 .AddCustomList ListArray:=ws.Range("A1:A3") MsgBox "【1】ユーザー設定リスト追加。ListCountは " & .CustomListCount '【2】Range("A1:A3")で登録 .AddCustomList ListArray:=ws.Range("A1:A3") MsgBox "【2】Range(""A1:A3"")で重複登録するとエラー " _ & vbLf & Err().Number & ":" & Err().Description _ & vbLf & "ListCountは " & .CustomListCount Err().Clear '【3】Range("A1:A3").Valueで登録 .AddCustomList ListArray:=ws.Range("A1:A3").Value MsgBox "【3】Range(""A1:A3"").Valueでは " _ & vbLf & "エラー " & Err().Number & ":" & Err().Description _ & vbLf & "ListCountは " & .CustomListCount v = ws.Range("A1:A3").Value Err().Clear '【4】配列 .AddCustomList ListArray:=v MsgBox "【4】配列に受けてもよい " _ & vbLf & "エラー " & Err().Number & ":" & Err().Description _ & vbLf & "ListCountは " & .CustomListCount .DeleteCustomList (.GetCustomListNum(v)) End With Set ws = Nothing End Sub
(結果)
![](https://blogimg.goo.ne.jp/user_image/34/3c/cfa4724fa6672aed29c01b2d2509a30a.png)
ついでですが、ユーザー設定リストを使って並べ替えを行う時のバグ
『[XL2000]GetCustomListNum メソッドで間違ったリスト番号が返る』
http://support.microsoft.com/kb/134913/ja
これも、Excel2007でも直っていません。
#2007ではSortオブジェクトが追加され、仕様が変わっています。
#下位互換のSortメソッドでは、あえてバグを引きずったままのほうが良いのかもしれませんね。
(テストコード)
Sub Custom_SortTest() Dim iListIndex As Long Dim vSort vSort = Array("b", "c", "a") Application.AddCustomList ListArray:=vSort iListIndex = Application.GetCustomListNum(vSort) With Sheets.Add.Range("A1:A3") .Value = [{"c";"b";"a"}] '【1】ListNumberでSort .Sort Key1:=.Cells, _ Header:=xlNo, _ OrderCustom:=iListIndex MsgBox "【1】ListNumberでSort" _ & vbLf & Join(Application.Transpose(.Value)) '【2】ListNumber+1でSort .Sort Key1:=.Cells, _ Header:=xlNo, _ OrderCustom:=iListIndex + 1 MsgBox "【2】ListNumber+1でSort" _ & vbLf & Join(Application.Transpose(.Value)) End With Application.DeleteCustomList (iListIndex) End Sub
(結果)
![](https://blogimg.goo.ne.jp/user_image/2f/47/614a2056524de6bb8f8934cb51557f89.png)