none
VBAで参照不可になっているものをプログラムで外そうとしたときエラーが発生する RRS feed

  • 質問

  • <開発環境>
    VBA(Visio2003)
    WindowsXP SP3

    <内容>
    Visioファイルに登録されている参照設定内に参照不可があった時に取り除いて、再設定をするように実装しました。

    取り除く時の実装は

    '------------------------------------------------------
    ’参照不可を排除
    Dim Ref

    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove Ref
     End If
    Next
    '------------------------------------------------------

    になります。
    この時、Refの対象が参照不可のものになったとき、.Removeの処理のときにエラーになってしまいます。

    Err.Number = -2147319779
    Err.Description = オブジェクト ライブラリは登録されていません。

    Refをウォッチすると
    Ref.Description = <アプリケーション定義またはオブジェクト定義のエラーです。>
    Ref.FullPath = <アプリケーション定義またはオブジェクト定義のエラーです。>
    Ref.Guid = "{値は書いてありますが省略します}"
    Ref.IsBroke = True
    Ref.Name = <アプリケーション定義またはオブジェクト定義のエラーです。>

    になっております。

    調べたら、http://officetanaka.net/excel/vba/tips/tips100.htmが引っかかりました。
    このサイト様のページの一番下と原因と同じ物だと考えております。

    なにか方法がございましたらご教授お願いします。
    2010年1月8日 7:47

すべての返信

  • kokujyanohaneさん、こんにちは。
    フォーラムのご利用ありがとうございます。

    同じと思われるエラーについて、米国のフォーラムに次のようなスレッドがありました。

    HELP NEEDED !! remove dll from a visio vba project
    http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/cca48eb9-4f69-4780-8e0c-a770ae1c2a3c

    Remove の対象に Ref ではなく、 References(Ref) のようにして渡すと良い、ということのようです。
    質問者さんからうまくいったかどうかの返信が無いのですが、よろしければ試してみてください。

    参考になると幸いです。
    それでは!
    2010年1月14日 6:54
  • ご返信ありがとうございます。

    References(Ref)を試してみました。
    しかし、References()の使用方法が解りません。

    '------------------------------------------------------
    ’参照不可を排除
    Dim Ref

    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove References(Ref)
     End If
    Next
    '------------------------------------------------------

    と書き換えてみましたが、
    Referencesの部分が

    '------------------------------------------------------
    コンパイルエラー

    プロジェクトまたはライブラリが見つかりません。
    '------------------------------------------------------

    になってしまいました。

    引き続き調べてみようと思います。

    ありがとうございました。

    2010年1月14日 10:41
  • こんにちは。

    Dim Ref

    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove Application.Vbe.ActiveVBProject.References(Ref)
     End If
    Next

    にするとどうでしょうか?
    2010年1月15日 1:39
  • ご返答ありがとうございます。

    記載していただいたものをためしてみました。

    '------------------------------------------------------
    Dim Ref

    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove _ Application.Vbe.ActiveVBProject.References(Ref)
     End If
    Next
    '------------------------------------------------------

    ですが、エラーが出てしまいました。
    Err.Number = 13
    Err.Description = 型が一致しません

    紹介していただいたページでは
    型の宣言が
    VBIDE.Reference
    になっていたため、
    参照設定に「Microsoft Visual Basic for Applications Extensibility 5.3」
    を追加し

    '------------------------------------------------------
    Dim Ref VBIDE.Reference

    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove _ Application.Vbe.ActiveVBProject.References(Ref)
     End If
    Next
    '------------------------------------------------------

    試してみましたが、
    Err.Number = 13
    Err.Description = 型が一致しません

    になりました。

    refの型をObjectにしてみても同様でした。
    '------------------------------------------------------
    Dim Ref Object
    For Each Ref In Application.Vbe.ActiveVBProject.References
     If Ref.IsBroke = True Then
      Application.Vbe.ActiveVBProject.References.Remove _ Application.Vbe.ActiveVBProject.References(Ref)
     End If
    Next
    '------------------------------------------------------


    引き続き調査いたします。
    ありがとうございました。

    [追記]
    Visioのスペックを追記します。
    Visio2003 Standard SP3
    Microsoft Visual Basic 6.5

    2010年1月15日 2:40