Mit VBA den Pfad zu ausgeschalteten Referenzen auslesen


 Produkt(e):MicroStation
 Version(en):08.11.09.578
 Umgebung:Windows 8
 Produktbereich:Programmierung
 Produktunterbereich:VBA

Problem

Das Auslesen des vollständigen Pfades einer Referenzdatei mit VBA funktioniert nur dann, wenn die Darstellung "eingeschaltet" ist:
Denn bei ausgeschalteter Darstellung gibt der Versuch, den Pfad zu lesen einen Laufzeitfehler, da die Eigenschaft dann nicht zur Verfügung steht.
Hier ein Beispiel für VBA Code, der auf einen Fehler läuft, wenn die Referenz ausgeschaltet ist:

Sub Fehler_wenn_ausgeschaltet()
Dim oAtt As Attachment
For Each oAtt In ActiveModelReference.Attachments
     Debug.Print "Ganzer Pfad: " & oAtt.DesignFile.FullName     ' dies erzeugt Fehler, wenn Referenz ausgeschaltet
Next
End Sub

Problemlösung

Dieses Problem kann jedoch umgangen werden, wenn man zum Auslesen des Pfades die MDL Funktion mdlRefFile_getParameters verwendet.
Um diese Funktion verwenden zu können, muss eine Deklaration der Funktion erfolgen:

Declare Function mdlRefFile_getParameters Lib "stdmdlbltin.dll" (ByVal param As String, ByVal paramName As Long, ByVal modelRef As Long) As Long

Diese Funktion bietet neben dem Zugriff auf verschiedene Eigenschaften der Referenzen auch Zugriff auf den Pfad der Zeichnungsdatei. Das vorige Beispiel könnte unter Verwendung dieser Funktion etwa so aussehen:

Declare Function mdlRefFile_getParameters Lib "stdmdlbltin.dll" (ByVal param As String, ByVal paramName As Long, ByVal modelRef As Long) As Long

Const REFERENCE_FILENAME = 7

Sub Pfad_zu_ref()
Dim oAtt As Attachment
Dim strFullName As String
Dim rtc As Long

For Each oAtt In ActiveModelReference.Attachments
    strFullName = Space(512)
    rtc = mdlRefFile_getParameters(strFullName, REFERENCE_FILENAME, oAtt.MdlModelRefP)
    If rtc = 0 Then
        If Len(strFullName) > 0 Then
            strFullName = Left$(strFullName, InStr(1, strFullName, vbNullChar) - 1)
            Debug.Print strFullName
        End If
    End If
Next
End Sub

Wenn jedoch eine Referenzdatei nicht gefunden werden kann, dann kann auch diese Funktion keinen Pfad herausgeben, stattdessen hilft dann nur, anstatt zu versuchen den vollständigen Pfad zu lesen, den Anhangsnamen (VBA Eigenschaft .AttachName) auszulesen, also den Wert, der im Referenzmanager unter Dateiname angegeben ist, möglicherweise ist hier sogar der vollstänige Pfad abgespeichert worden.

Ein weiterführendes Besipiel zeigt hier die Anwendung der Funktion: Mit VBA Referenzpfade ändern

 Ursprünglicher Autor:Artur Goldsweer