Auf Dokumentation zu stützen, ist irgendwie nicht mein Ding, deshalb habe ich mal folgendes ausprobiert, wobei das verwendete doc ein TextItem namens Form, ein RichtextItem namens Body und kein Item Body2 enthält.
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
Dim view As NotesView
Set view = db.GetView ("test")
Dim doc As NotesDocument
Set doc = view.Getfirstdocument
Dim rtitem As NotesRichtextItem
Set rtitem = doc.GetFirstItem ("Body")
MsgBox rtitem.Name
End Sub
-> gibt "Body" als Msgbox aus
Sub Initialize
...
Dim rtitem As NotesRichtextItem
Set rtitem = doc.GetFirstItem ("Body2")
MsgBox rtitem.Name
End Sub
-> gibt ein Object variable not set in der MsgBox-Zeile
Sub Initialize
...
Dim rtitem As NotesRichtextItem
Set rtitem = doc.GetFirstItem ("Form")
MsgBox rtitem.Name
End Sub
-> gibt ein type mismatch in der Set rtitem ... - Zeile
Also kann ein NotesRichtextItem definitiv ein doc.GetFirstItem, Voraussetzung ist, dass das Item existiert und ein RichtextItem ist, oder eben nicht existiert. Existiert es und ist kein RichtextItem, kommt das type mismatch.
Nun zu Lordi's Code:
1. Mit If doc.HasEmbedded prüfst Du nur, ob in dem DOKUMENT Anhänge vorhanden sind, diese können aber an jedem beliebigen anderen Richtextfeld sein
2. Es ist völlig irrelevant, ob in der MASKE das Feld "Userpicture" ein RichtextItem ist, entscheidend für Deine Routine sind die DOKUMENTE. Schau also in den Dokumenteigenschaften nach, welcher Typ Item gespeichert ist. Da Du über mehrere Dokumente läufst, genügt ein Dokument, bei dem Userpicture ein Textitem ist, und schon bekommst Du den Fehler
-> Exkurs zum Verständnis: Du erstellst in der Maske ein neues Feld Userpicture als Textfeld. Danach erstellst Du mit der Maske ein paar Dokumente, die dadurch ein Textitem Userpicture enthalten. Anschließend änderst Du in der Maske das Feld in ein Richtextfeld. Diese Änderung hat keinen Einfluss auf danach nicht neu im Frontend gespeicherte Dokumente! Notes ist keine relationale Datenbank, bei der Feldänderungen in einer Tabelle erfolgen, die dann gnadenlos drübergebügelt werden, Notes ist dokumentenbasiert und tickt da ganz anders. Auch andere Routinen können in Dokumente Items schreiben, die in der Maske entweder nicht oder ganz anders definiert sind. Das ist die totale Freiheit, verlangt aber eine andere Denkweise des Entwicklers
Du musst also prüfen, ob es sich tatsächlich um ein Richtextitem handelt. Dazu ist eine Möglichkeit, rtitem als Variant zu deklarieren und dann abzuprüfen, ob es sich wirklich um ein RichtextItem handelt (-> siehe Hilfe zu notesItem.Type)
3. Wenn Du wirklich prüfen willst, ob ein RichtextItem Dateianhänge hat, musst Du prüfen, ob EmbeddedObjects ein Array ist. Deshalb knallt Deine Forall-Zeile, weil Du durch ein Nichtarray loopen willst
If IsArray (rtitem.EmbeddedObjects) Then
Forall obj ...
End Forall
End If