Nice it works now.
I have adapted the code a bit.
The collection will take care of doubles.
Option Explicit
Const ERROR_NO_MORE_ITEMS = 259&
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Private Declare Function RegCloseKey _
Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Private Declare Function RegOpenKey _
Lib "advapi32.dll" _
Alias "RegOpenKeyA" (ByVal hKey As Long, _
ByVal lpSubKey As String, _
phkResult As Long) As Long
Private Declare Function RegEnumKeyEx _
Lib "advapi32.dll" Alias _
"RegEnumKeyExA" (ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpName As String, _
lpcbName As Long, _
ByVal lpReserved As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
lpftLastWriteTime As Any) As Long
Sub ShowExternalDataSources()
Dim hKey As Long
Dim Cnt As Long
Dim sName As String
Dim Ret As Long
Const BUFFER_SIZE As Long = 255
Dim coExternalDataSources As Collection
Dim arrRegKeys
Dim i As Long
Set coExternalDataSources = New Collection
arrRegKeys = Array(HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE)
Ret = BUFFER_SIZE
For i = 0 To UBound(arrRegKeys)
Cnt = 0
If RegOpenKey(arrRegKeys(i), _
"Software\ODBC\ODBC.INI", _
hKey) = 0 Then
sName = Space(BUFFER_SIZE)
While RegEnumKeyEx(hKey, _
Cnt, _
sName, _
Ret, _
ByVal 0&, _
vbNullString, _
ByVal 0&, _
ByVal 0&) <> ERROR_NO_MORE_ITEMS
Cnt = Cnt + 1
On Error Resume Next
coExternalDataSources.Add Left$(sName, Ret), _
Left$(sName, Ret)
On Error GoTo 0
sName = Space(BUFFER_SIZE)
Ret = BUFFER_SIZE
Wend
'close the registry key
RegCloseKey hKey
Else
MsgBox "Error while calling RegOpenKey", , ""
End If
Next
For i = 1 To coExternalDataSources.Count
Cells(i, 1) = coExternalDataSources(i)
Next
End Sub
RBS