半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■AddCustomListメソッドの重複エラー

2010-03-12 22:00:00 | 気をつけたほうがいいこと
AddCustomListメソッド...ユーザー設定リストを追加する時、追加済みのリストを重複登録しようとしたらエラーになるのが仕様と思っていたんですが、違うらしい。

ヘルプには
>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

(結果)


ついでですが、ユーザー設定リストを使って並べ替えを行う時のバグ
『[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

(結果)

Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする