Hinweise zum Arbeiten mit FlexPro-VBA

23.08.2021

Dieses Thema gibt Ihnen einige Hinweise zu Problemen, die bei der Programmierung in Visual Basic auftauchen können.

Verwendung der Set-Anweisung bei Zuweisung der Value-Eigenschaft an Variablen

Probleme bei der Verwendung von Farbwerten vom Typ OLE_COLOR

Löschen von FlexPro-Objekten aus einer Auflistung innerhalb einer For-Each-Schleife

Konvertierung von Zahlen in Zeichenketten mit der CStr-Funktion

Verhindern von Fehlermeldungen bei vollständig automatisiert ablaufenden Aktionen

Auswertung von Ausdrücken in VBA (Hinweis für C/C++-Entwickler)

Verwendung der Set-Anweisung bei Zuweisung der Value-Eigenschaft an Variablen

Bei der Zuweisung der Value-Eigenschaft eines ValueObject-Objektes an eine Variable muss darauf geachtet werden, dass die Value-Eigenschaft vom Typ Variant ist und nicht nur Einzelwerte oder Felder zurückliefern kann, sondern auch komplexe Werte, Signale und Listen. Komplexe Werte, Signale und Listen sind selbst wieder Objekte in FlexPro und müssen mit Hilfe der Set-Anweisung an Variablen zugewiesen werden.

Folgende Anweisung stellt nur dann eine gültige Wertzuweisung dar, wenn der Wert von oValueObject weder komplex noch ein Signal noch eine Liste ist:

Dim vtValue As Variant

Dim oValueObject As ValueObject

    ...

vtValue = oValueObject.Value

Wenn oValueObject.Value komplex, ein Signal oder eine Liste ist, wird die Fehlermeldung 'Objekt unterstützt diese Eigenschaft oder Methode nicht' angezeigt. Verwenden Sie bei der Zuweisung von komplexen Werten, Signalen oder Listen also die Set-Anweisung:

set vtValue = oValueObject.Value

Wenn beim Schreiben eines Makros nicht bekannt ist, ob zur Laufzeit ein Wert komplex oder reell ist, kann durch Verwendung der IsObject-Anweisung sichergestellt werden, dass bei der Makroausführung kein Fehler auftritt:

If IsObject(oValueObject.Value) Then

    Set vtValue = oValueObject.Value

Else

    vtValue = oValueObject.Value

End If

Ist der Wert von oValueObject ein Objekt wird die Set-Anweisung verwendet, ansonsten muss der Wert mit '=' zugewiesen werden.

Probleme bei der Verwendung von Farbwerten vom Typ OLE_COLOR

Der Typ OLE_COLOR ist ein OLE-Standarddatentyp zur Ablage von RGB-Farbwerten. Der Datentyp ist - in C/C++ - als nicht vorzeichenbehafteter long-Wert deklariert. VBA unterstützt grundsätzlich keine nicht vorzeichenbehafteten Werte. Aus diesem Grund kann es bei der Verwendung von OLE_COLOR manchmal zu Problemen kommen. So führt folgender Code zur Fehlermeldung 'Variable verwendet einen in Visual Basic nicht unterstützten Typ der Automatisierung':

If ActiveDatabase.ActiveObject.Selection.FillFormat.Color <> _

    fpColorRed Then

    ...

End If

Diese Fehlermeldung kann auf zwei Arten vermieden werden. Entweder man konvertiert den Farbwert vor dem Vergleich in einen Long-Wert

If CLng(ActiveDatabase.ActiveObject.Selection.FillFormat.Color) <> _

    fpColorRed Then

    ...

End If

oder man führt eine Variable vom Typ OLE_COLOR ein, weist ihr den Farbwert zu und verwendet anschließend die neu eingeführte Variable für den Vergleich:

   Dim clr As OLE_COLOR

   clr = ActiveDatabase.ActiveObject.Selection.FillFormat.Color

   If clr <> fpColorRed Then

       ...

   End If

Löschen von FlexPro-Objekten aus einer Auflistung innerhalb einer For...Each-Schleife

Das Löschen von FlexPro-Objekten in einer Auflistung mittels einer For...Each-Schleife sollte vermieden werden, da es u. U. zu unerwünschten Ergebnissen führt bzw. nicht alle Elemente der Auflistung durchlaufen werden.

Wenn die Elemente einer beliebigen Auflistung von FlexPro-Objekten gelöscht werden sollen, führt z. B. der folgende Code zum gewünschten Ergebnis:

While oColl.Count > 0

    oColl.Remove 1

Wend

bzw.

While oColl.Count > 0

    oColl(1).Delete

Wend

Konvertierung von Zahlen in Zeichenketten mit der CStr-Funktion

Wenn die CStr-Funktion benutzt wird, um Zahlen in Zeichenketten zu konvertieren, ist zu beachten, dass diese Funktion immer die aktuellen Regions- und Sprachoptionen (Locale) für die Konvertierung benutzt. Auf einem Deutschen System werden Vor- und Nachkommastellen durch ein ',' getrennt, während auf einem Englischen System der '.' verwendet wird. Wenn Sie die Zahlenkonvertierung unabhängig von den Systemeinstellungen durchführen möchten, müssen Sie die Windows API-Funktion SetLocaleInfo verwenden, um die Systemeinstellungen temporär zu ändern. Im Beispiel Ein benutzerdefinierter Importfilter können Sie sehen, wie diese API-Funktion verwendet wird.

Verhindern von Fehlermeldungen bei vollständig automatisiert ablaufenden Aktionen

Bei vollständig automatisiert ablaufenden Aktionen, die ohne Benutzerinteraktion auskommen sollen, muss zunächst sichergestellt werden, dass alle Fehler in den Makros selbst behandelt werden (konsequente Verwendung der On Error-Anweisung). Des Weiteren muss in der Visual Basic Umgebung unter Extras > Optionen auf der Registerkarte Allgemein unbedingt die Einstellung von Unterbrechen bei Fehlern auf Bei nicht verarbeiteten Fehlern gestellt werden, ansonsten wird der Programmablauf u. U. bei möglichen, erlaubten Fehlern angehalten, der Fehler wird angezeigt und es ist eine Benutzeraktion erforderlich (siehe auch DisplayAlerts-Eigenschaft des Application-Objektes).

Auswertung von Ausdrücken in VBA (Hinweis für C/C++-Entwickler)

Im Gegensatz zu C/C++, wo Ausdrücke bei der Bedingungsbewertung nur so lange von links nach rechts ausgewertet werden wie notwendig, wertet VBA immer den kompletten Ausdruck aus.

Der folgende C/C++ Ausdruck

 (1) if(exp1 && exp2)

        ...

entspricht in VBA

 (2) If exp1 And exp2 Then

        ...

Wenn in (1) exp1 bereits False liefert, wird exp2 nicht mehr ausgewertet, sondern der Code in der If-Anweisung wird sofort ausgeführt. In (2) wird exp2 ausgewertet, unabhängig davon ob exp1 False liefert oder nicht. Falls für die Gültigkeit von exp2 vorausgesetzt wird, dass exp1 True liefert, muss die Anweisung in VBA zerlegt werden:

If exp1 Then

    ...

    If exp2 Then

        ...

    End If

        ...

End If

Diese Beiträge könnten Sie ebenfalls interessieren