4

VBA6 コード (Excel) はうまくいきました。Office 2010/VBA7 にアップグレードすると、コードが壊れます。

SO のコードを使用する:

オブジェクトが VBA のコレクションのメンバーであるかどうかを判断する

Public Function Contains(col As Collection, key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
    Contains = True
    obj = col(key)
    Exit Function
err:

    Contains = False
End Function

実行時エラー 5 が表示されます: 無効なプロシージャ コールまたは引数です。

obj = col(key)ステートメントでカバーされるはずの行でエラーが発生するため、私には意味がありませんOn Error GoTo errが、停止します。

その他X がコレクション型のソリューションに存在する場合、同じ問題があります。

壊れたコードを修正する代わりに、私が本当に必要としているのは、コレクションにレコードが既に設定されているかどうかを確認できることです.VBA7で他の(新しい)方法でそれを行うことができれば、問題も解決します(私は夢を見ることができます)。

4

1 に答える 1

2

ワークシートなどのオブジェクトの指定を変更すると、機能することがわかりました。

Public Function Contains(col As Collection, key As Variant) As Boolean
Dim ws As Excel.Worksheet

On Error GoTo err
Contains = True
Set ws = col(key)
Exit Function
err:
Contains = False
End Function

私はそれを次のように呼びます:

Sub test()
Dim ws As Excel.Worksheet
Dim coll As Collection

Set coll = New Collection
For Each ws In ThisWorkbook.Worksheets
coll.Add ws, ws.Name
Next ws
Debug.Print Contains(coll, ActiveSheet.Name)
Debug.Print Contains(coll, "not a worksheet name")
End Sub

最初の呼び出しで True を取得し、2 番目の呼び出しで False を取得します。

于 2013-04-26T19:54:26.967 に答える