MS ACCESS VBAで参照設定の名前を出力するマクロ

#コード

```VB:DebugPrintWhatRefCurrentDb
Option Compare Database
Option Explicit
Sub SetVBIDEReferences()
'This VBA Macro is for MS ACCESS
'You Need First Reference
'Office 2016 64BIT + Win10
'Q11Q Fron Qiita(JPN)
Dim ref, refs
'VBIDEを参照設定するマクロ
'まずこれを稼働させること。
Set refs = Access.Application.References
For Each ref In refs
If ref.Name = "VBIDE" Then refs.Remove ref
Next
refs.AddFromGuid "{0002E157-0000-0000-C000-000000000046}", 5, 3
End Sub

Sub DebugPrintWhatRefCurrentDb()
Call  SetVBIDEReferences
'This VBA Macro is for MS ACCESS
'You Need First Reference
'Office 2016 64BIT + Win10
'Q11Q Fron Qiita(JPN)
'Dim Block
    Dim oVRs As VBIDE.References
    Dim oVBE As VBE
    Dim oVBPs As VBProjects, oVBP As VBProject
    Dim ref As VBIDE.Reference, buf As String
    Dim db As DAO.Database: Set db = CurrentDb
    Dim oacRefs As VBIDE.References
    Dim i As Long
'Set Block
    Set oacRefs = Application.VBE.ActiveVBProject.References
'Start Main
    For i = 1 To oacRefs.Count
    Set ref = oacRefs.Item(i)
        buf = buf & ref.Name & vbTab & ref.Description & vbCrLf
    Next
    Debug.Print buf
End Sub
```
OfficeTanakaさんはEXCELの例をあげていますがACCESSではCurrentDBでは取得できない。
ACCESS.Referenceｓがポイントでした。
[マクロで参照設定を操作する](http://officetanaka.net/excel/vba/tips/tips100.htm)
[Add references programatically - stackoverflow](http://stackoverflow.com/questions/5593588/add-references-programatically)
しかし、この記事を書いた当時もApplication.referencesとVBIDE.Referencesを混同していましたが、 https://qiita.com/Q11Q/items/67226e7c8b9def529668 これを書くことで誤りに気が付きました。
`oacRefs As Application.References` にしていたため、この時Descriptionが出なかったんですね。
今回これを訂正しました。
#AccessはExcelより参照設定が容易
Runtime版はCreateObjectが使えずGetObjectしか使えません。
しかし通常のAccessのみを考えると、Excelが参照設定を自動化するときにVBAのオブジェクトモデルへのアクセスを信頼する(EN:"Trust Access To Visual Basic Project")にチェックを入れなければいけないのに対して、Accessではその必要がありません。
このため参照設定はExcelよりはるかに容易だといえます。
またVBIDE、VBComponent、VBAのReferencesにアクセスするにはMicrosoft Visual Basic for Applications の機能拡張 5.3 (vbide) ライブラリへの参照を設定します。
https://docs.microsoft.com/ja-jp/office/vba/api/project.application.vbe
https://stackoverflow.com/questions/9879825/how-to-add-a-reference-programmatically
StackOverFlowも手動でチェックしています。このように一般的に自動で行うやり方は知られておらず、手動で設定する説明が多いです。
しかし、実は自動的に設定できます。
ExcelにおけるVBIDE,VBEの後期結合　-　コードログ
https://codeday.me/jp/qa/20190608/962086.html
このタイトルは誤りで、後期結合ではなくレイトバインディング、事後バインディングという用語が一般的でしょう。このため、
ExcelにおけるVBIDEのレイトバインディングについて
もしくは事後バインディングとすべきでしょう。後期結合なんて初めて聞く訳し方です。条件付き編纂命令よりひどいのでは。意味は分かるけど検索ができないのでもったいないです。
　それはさておき、このコードを参考にするとExcel,Access、Word、Powerpoint,VISIO,Projectは自動的に参照設定できます。OutlookとPublisherはできません。Applicationの下にVBEがないためです。

##Access Application References
[Application.References プロパティ(Access)](https://docs.microsoft.com/ja-jp/office/vba/api/access.application.references)
[access.application.References オブジェクト (Access)](https://docs.microsoft.com/ja-jp/office/vba/api/access.references)
イベント
<ul>
<li>ItemAdded
<li>ItemRemoved
</ul>
メソッド
<ul>
<li>AddFromFile
<li>AddFromGuid
<li>Item
<li>Remove
</ul>
プロパティ
<ul>
<li>Count
<li>Parent
</ul>
[Reference オブジェクト (Access)](https://docs.microsoft.com/ja-jp/office/vba/api/access.reference)
Reference オブジェクトは、別のアプリケーションやプロジェクトのタイプ ライブラリへの参照設定を参照するために使用します。
注釈
Reference オブジェクトを作成する場合は、Visual Basic で動的に参照を設定します。
Reference オブジェクトは、 References コレクションのメンバーです。 References コレクションに含まれる個々の Reference オブジェクトを参照するには、次のいずれかの構文を使用します。
構文 	説明
References!referencename 	referencename には、Reference オブジェクトの名前を指定します。
References("referencename")	referencename には、Reference オブジェクトの名前を指定します。
References(index) 	index には、コレクション内でのオブジェクトの位置を示す数値を指定します。
プロパティ
<OL>
<li>BuiltIn
<li>Collection
<li>FullPath
<li>Guid
<li>IsBroken
<li><font color = blue>Kind</font>
<li>Major
<li>Minor
<li>Name
</OL>

[Kindプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/access.reference.kind)は、次の値を返します。

|値 |	説明|
|:-----|:----|
|vbext_rk_Project|Reference オブジェクトは、Visual Basic プロジェクトへの参照を表します。|
|vbext_rk_TypeLib |Reference オブジェクトは、タイプ ライブラリを含むファイルへの参照を表します。|

これはTypeと同等であることがわかる。

これに対して、VBEのほうはぐちゃぐちゃな書き方である。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/visual-basic-add-in-model/properties-visual-basic-add-in-model

このなかからreferenceに関するものだけ抜き出す。すべて読み取り専用。するとDscriptionだけがないことがわかる。
つまりほぼ同等な機能なのである。
<OL>
<li>isBroken プロパティは、参照が有効な参照を示していない場合に True を返します。isBrokenを検知したらすぐに references.remove referenceobject で除去しましょう。
<li>BuiltIn プロパティは、参照が移動または削除できない既定の参照の場合に Trueを返します。
<li>collection 読み取り専用。オブジェクトに付属するプロパティ、メソッド、およびコントロールの集合を表す。この集合からCollectionからプロパティ、メソッド、コントロールにアクセスできる。ないものにはアクセスできない。
<li>FullPath 参照されているタイプ ライブラリのパスとファイル名を含む String を返します。 読み取り専用です。
<li>GUID オブジェクトのクラス識別子を含む String を返します。 読み取り専用です。
<li>Major 参照されたタイプ ライブラリの主なバージョン番号を含むLong を戻します。 読み取り専用です。 注釈 Major プロパティで戻される数は、タイプ ライブラリに保存されたMajorバージョン番号に対応します。
<li>Minor タイプ ライブラリのマイナー バージョン番号を示す長整数型 (Long) の値を返します。 読み取り専用です。
<li>Name プロパティを使用して、追加または削除する参照が適切な参照であるかどうかを判断します。読み取り専用。
<li><b>Description</b> オブジェクトに関連付けられている説明文字列を含む文字列式を返す。読み取り専用。
<li><font color = blue>Type</font> Reference オブジェクトのTypeプロパティの設定。 <br>

|定数 |値 	|説明|
|:----|:---:|:---|
|vbext_rk_TypeLib | 0 |タイプ ライブラリ|
|vbext_rk_Project|1 | プロジェクト|

</br>