Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Dynamische Arrays in UDT auf Initialisierung prüfen
Gehe zu Seite 1, 2  Weiter
zurück: Via VBA Datei auswählen und gleich drucken weiter: Anzahl Ja/Nein Checkboxen in UF zählen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Feedback Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 10:47
Rufname:

Dynamische Arrays in UDT auf Initialisierung prüfen - Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Hallo liebe Foren-Gemeinde ;)

Ich habe über die SuFu zwar ähnliche Themen gefunden, bin daraus aber nicht sonderlich schlauer geworden. Deswegen schildere ich lieber mein konkretes Problem und hoffe das ihr mir helfen könnt.

Mein Problem ist folgendes:
Ich habe ein UDT in dem dynamische Arrays vorkommen.
Nun ist es notwendig diese auf Initialisierung zu prüfen.
Ich habe die Funktion in ein Modul ausgelagert, genauso wie die Deklaration des UDT und die dazugehörige Variable. Wenn ich nun aber versuche aus einer beliebigen Sub aus auf die Funktion zuzugreifen bzw. dieser das zu testende Array zu übergeben, kommt es zu folgender Fehlermeldung:
Zitat:
Nur benutzerdefinierte Typen, die in öffentlichen Objektmodulen definiert sind, können in den oder aus dem Typ Variant umgewandelt werden oder an eine zur Laufzeit auflösbare Funktion weitergeleitet werden.
Da aber die Arrays unterschiedliche Typen besitzen, kann ich den ja schlecht vorher festlegen, also habe ich Variant genommen. Zudem sind alle relevanten Codes im Modul ausgelagert und Public, wie verlangt. Da komme ich nun leider nicht mehr weiter. Könnt ihr mir helfen?

Hier noch der relevante Code:

Modul:
Code:
Public Type MailTemplate
    MT_Name As String
    MT_TO() As String
    MT_CC() As String
    MT_BCC() As String
End Type

Public Type DBStruct
    ExchangeAdr As String
    SSC() As MailTemplate
    ICC() As MailTemplate
    Partner() As MailTemplate
End Type

Public MailTemplateDB As DBStruct

Public Function IsArrayAllocated(ByRef Arr As Variant) As Boolean
    Dim n As Long
   
    On Error Resume Next
    If IsArray(Arr) = False Then
        IsArrayAllocated = False
        Exit Function
    End If
    n = UBound(Arr)
    If Err.Number = 0 Then
        If LBound(Arr) <= UBound(Arr) Then
            IsArrayAllocated = True
          Else
            IsArrayAllocated = False
        End If
      Else
        IsArrayAllocated = False
    End If
End Function
Formular:
Code:
Private Sub fraMailAddresses_Click()
    Dim n As Integer
    Dim i As Integer
   
    If fraMailTemplates.Value = 0 Then
        If fraMailAddresses.Value = 0 Then
            If IsArrayAllocated(MailTemplateDB.SSC) = True Then
                If IsArrayAllocated(MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO) = True Then
                    i = UBound(MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO)
                    For n = 0 To i
                        lstMailAddresses.AddItem MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO(n)
                    Next n
                End If
            End If
          ElseIf fraMailAddresses.Value = 1 Then
            '[...]
        End If
        '[...]
    End If
End Sub
Bei der obrigen Sub ist der restliche Code nicht relevant bzw. sehr ähnlich.

Vielen Dank schonmal im Voraus!

LG Mike
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 13:08
Rufname: leo


AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

hi CrescentEclipse

vielleicht hat sich ja einiges geändert seit Acc03 (welches ich benutze!)... deswegen frage ich mal ganz vorsichtig an...
Code:
Public Type DBStruct
    ExchangeAdr As String
    SSC() As MailTemplate
    ICC() As MailTemplate
    Partner() As MailTemplate
End Type
Eine Type-Anweisung dient ja letztlich nur dazu eine eigene Struktur abzubilden. Das braucht man bei manchen API's und als UDT um das mit einem oder mehreren Elementen zu bestücken. Aber was ist MailTemplate? Wo kommt das her und wozu brauchst du das? Probiers doch einfach mal mit String an der Stelle...

Und dann verstehe ich auch diese Zeile nicht:
Code:
                    i = UBound(MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO)
Laut Struktur ist SSC ein Array, ok. Aber woher nimmst du nun wieder das MT_TO?

Das hast du auch hier nochmal drin:
Code:
IsArrayAllocated(MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO)
Aber ich verstehe einfach nicht woher das kommt... Rolling Eyes

Erklärst du mir das?

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 13:19
Rufname:

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Aber sicher erkläre ich das ;)

Das kommt daher das ich zwei benutzerdefinierte Typen erstellt habe:
1. DBStruct
2. MailTemplate
Daher wahrscheinlich auch die Verwirrung.

SSC, ICC und Partner sind Arrays vom besagten Typ MailTemplate, welcher wiederum das MT_Name, MT_TO, MT_CC und MT_BCC enthält.

Ich hoffe ich konnte etwas Licht ins Dunkel bringen.
Schau einfach nochmal oben im Code nach, dort müssten zwei Type-Deklarationen stehen.

LG
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 13:26
Rufname: leo

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Ja, schon... aber

hier deklarierst du
Code:
Public Type MailTemplate
    MT_Name As String
    MT_TO() As String
    MT_CC() As String
    MT_BCC() As String
End Type
MT_TO als Array und hier
Code:
IsArrayAllocated(MailTemplateDB.SSC(lstMailTemplates.ListIndex).MT_TO)
sehe ich nicht, daß du einen Eintrag des Array ansprichst... Oder sehe ich das falsch?

Und im 2. Bsp dito

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 13:30
Rufname:


AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Ja, das ist meiner Meinung nach auch richtig so, da ich hier ja das Array als solches an die Funktion übergeben möchte und nicht ein bestimmtes Item daraus.

Zudem verlangt UBound auch ein Array als solches.
Von daher sehe ich da eigentlich keine Probleme, zumal Variant als Datentyp auch ein Array abbilden kann.
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 13:41
Rufname: leo

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Meiner Meinung nach kann das so nicht funktionieren. Genausowenig wie die Verschachtelung der Types... ich sehe auch nicht wohin das führen soll!?

Was ist eigentlich das Ziel deiner Bemühungen?

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
29. März 2011, 14:05
Rufname:

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Hallo,

statt Type-Definitionen würde ich Dir ein Klassenmodul empfehlen, statt Arrays einfach Collections.

Wie Leo schon gesagt hat, werden Type-Definitionen hauptsächlich noch für Windows API-Aufrufe benötigt, ansonsten haben sie mehr oder weniger keine Daseinsberechtigung, denn die Fehlermeldung, die Du erhalten hast, hat mit den diversen Restriktionen zu tun, mit denen man bei Type kämpfen muß. Theoretisch gute Sache, die praktische Umsetzung in VBA ist aber schlecht gelöst.

Type läßt sich aber immer gegen ein Klassenmodul ersetzen. Statt Deiner ersten Type-Deklaration kannst Du einfach ein neues Klassenmodul z.B. mit dem Namen "clsMailTemplate" erstellen und dort hinein schreibst Du:
Code:
Public MT_Name As String
Public MT_TO() As String
Public MT_CC() As String
Public MT_BCC() As String
Das kann man nun (fast) genauso verwenden wie eine Type-Variable, nur daß man vor der Benutzung ein neues Objekt erstellen muß:
Code:
    Dim objMailTemplate As clsMailTemplate
   
    Set objMailTemplate = New clsMailTemplate
Jetzt steht Dir "objMailTemplate" genauso zur Verfügung wie eine mit Type deklarierte Variable. Allerdings kannst Du mit diesem Objekt nun alles machen, da gibt es keine Restriktionen in VBA. Man kann es also beliebig hin- und herschicken usw. Darüber hinaus kann man statt dieser supereinfachen Implementierung die einzelnen Variablen des Klassenmoduls mit Property Let/Get-Varianten austauschen, die wie eine Function/Sub beliebig programmiert werden können, das Objekt kann so nun auch den Variableninhalt prüfen und ggf. ablehnen. Welche Variable kennst Du sonst, die sich gegen falsche Daten "wehrt"? Ein String nimmt jeden Text auf, ein String als Property nimmt z.B. nur den Text "A" oder "B" auf, wenn man es so programmiert.

Die zweite Type-Deklaration läßt sich genauso ersetzen, denn ein Klassenmodul kann natürlich auch andere Klassenmodule verwenden.

Allerdings gibt es keine Möglichkeit, ein Array von Objekten zu erzeugen, dafür aber die viel komfortablere Möglichkeit, einfach eine Collection zu verwenden (genaueres siehe unter Tips & Tricks-Forum über Collections). Ersetze einfach die Arrays gegen Collections, nun kannst Du diese mit Add befüllen. Komfortablerweise gibt es in einer Collection auch den Parameter "Count", so kannst Du auch gleich sehen, ob etwas in der Collection drinsteht. Die Collection selbst kannst Du mit "Is Nothing" prüfen, alles viel einfacher als mit Arrays.
Ganz nebenbei kann man so auch mit "For Each" statt "For i" arbeiten, was im Regelfall schneller und einfacher ist.

Gruß

Christian
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 14:17
Rufname:

Re: AW: Dynamische Arrays in UDT auf Initialisierung prüfen - Re: AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

lleopard - 29. März 2011, 13:41 hat folgendes geschrieben:
Meiner Meinung nach kann das so nicht funktionieren. Genausowenig wie die Verschachtelung der Types... ich sehe auch nicht wohin das führen soll!?
Was ist eigentlich das Ziel deiner Bemühungen?
Das Ziel ist es, das ich eine saubere Struktur meiner Daten habe und die ganz simpel in eine Datei speichern und daraus lesen kann.
Ich verwende das schon seit einiger Zeit und in VB6 klappt das ohne Probleme, VBa scheint da restriktiver zu sein.

Zudem, versuch doch einfach aml das hier:
Code:
    Dim test(2) As Integer
UBound(test) liefert dir den Wert 2 zurück
IsArrayAllocated(test) liefert dir "wahr" zurück

Da habe ich nun auch keinen Wert sondern das komplette Array übergeben, sogesehen verstehe ich deine Aussage nicht.

Was Klassen angeht, da habe ich 0 Erfahrung mit und mich würde zuvor interessieren ob eine Collection auch einfach mit einer einzigen Zeile Code in eine Datei schreibbar ist, was ich iw nicht denke.

Bei Array ist das einfach:
Code:
    Put 1, , Arrayname
fertig...
Das ganze ist mit "get" bzw. "put" auslesbar/schriebbar und zwar egal wie kompliziert das UDT hinter dem Array sein mag. Das empfinde ich persönlich als Vorteil.

*seufz*

Ich schau mir den Tip dennoch mal an, würde aber eine andere Lösung begrüßen.
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 14:20
Rufname: leo

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Hallo Christian,

das hast du gut und richtig erklärt! Auf den Gedanken wär ich erstmal gar nicht gekommen... aber auch weil mir noch ein wenig schleierhaft ist was Mike da überhaupt vorhat... was mit Mails und Templates etc... schon klar. Aber Quo Vadis wenns fertig ist... ??

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 14:25
Rufname:

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Naja, vielleicht sollte iche infach mein Vorhaben komplett erklären und vielleicht hat dann jemand eine Idee wie ich das simple ohne viel Schnick Schnack umsetzen kann.

Im Grund möchte ich einfach eine Datenstruktur herstellen in die Mailvorlagen gespeichert werden und das untergliedert in drei Bereiche: SSC, ICC und Partner

Bei den Mails sind lediglich der Name der Vorlage und der Empfänger (TO), CC und BCC relevant. Das ganze sollte skalierbar sein und sich einfach in eine einzige Datei schreiben lassen, so dachte ich direkt an Arrays mit UDT. Finde ich persönlich am einfachsten und hat bisher (unter VB6 zumindest) wunderbar funktioniert.

Ist nun klar geworden was ich vorhabe oder fehlen noch Informationen?
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 14:43
Rufname: leo

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Hi Mike

Soweit hab ich das verstanden:
Zitat:
Datenstruktur => Mailvorlagen speichern (SSC, ICC, Partner)
Name der Vorlage und der Empfänger (TO), CC und BCC relevant
ein paar Fragen hab ich noch:
SSC, ICC, Partner => woraus ergibt sich das?
Kannst du mir/uns auch noch sagen woher die Vorlagen kommen?

Ich denke das ist uns allen klar:
Code:
    Dim test(2) As Integer
UBound(test) liefert dir den Wert 2 zurück
IsArrayAllocated(test) liefert dir "wahr" zurück

und das wird ja auch funktionieren. Nur die Verschachtelung der Types wird nicht klappen. Und ich denke das ist bei deinem Vorhaben auch nicht nötig. Wahrscheinlich brauchst du auch keine Klassen. Nur eine andere auf VBA zugeschnittene Logik im Ablauf...

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 15:01
Rufname:

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Das denke ich auch, eine andere Lösung muss her und sicher geht das auch einfacher^^

Naja, das mit der Verschachtelung an sich funktioniert ja, ich kann Initialisieren und auch Daten reinschreiben, auslesen, in Dateien speichern und wieder zurücklesen. Das alles klappt problemlos, nur eben nicht die Übergabe an eine Funktion. Naja, was solls ;)

SSC, ICC und Partner sind sozusagen verschiedene Prioritätsstufen von Aufträgen und somit gleichzeitig eine Kategorie für die Vorlagen. Es hat etwas mit Service Level zu tun und wer die Aufträge bearbeitet. Ich hoffe das genügt als Information.

Die Mail Vorlagen sind derzeit noch als OFT-Daten von Outlook gespeichert, werden aber dann in diese Struktur konvertiert, zumindest die Empfänger-Adressen, da der Text und der Betreff immer identisch ist.

Später wird dann über eine einzige Vorlage mithilfe der Empfängerdaten eine E-Mail generiert. Aber das muss hier gar nicht behandelt werden, das wäre schon ein Schritt zu weit.

Wenn noch Fragen vorhanden sind, dann einfach fragen.
Danke nochmal!

LG
lleopard
IT Datenbankentwickler


Verfasst am:
29. März 2011, 15:31
Rufname: leo

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

klar hab ich noch Fragen:

Was steht in lstMailTemplates?
Hast du denn die Vorlagen irgendwo schon eingelesen und klassifiziert?
Zitat:
SSC, ICC und Partner sind sozusagen verschiedene Prioritätsstufen von Aufträgen und somit gleichzeitig eine Kategorie für die Vorlagen
Ok, und wie spiegelt sich das in der Struktur wieder? In deinem Code hast du nur SSC angezogen. War das nur ein Ausschnitt des Codes?
Zitat:
Die Mail Vorlagen sind derzeit noch als OFT-Daten von Outlook gespeichert, werden aber dann in diese Struktur konvertiert, zumindest die Empfänger-Adressen, da der Text und der Betreff immer identisch ist.
Soll das heissen du hast die OFT bereits eingelesen? In welche Tabelle? Quelle?

Gruß Leo

_________________
Gruß Leo

Honnit soit qui mal y pense!
CrescentEclipse
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. März 2011, 15:38
Rufname:

AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

In lstMailTemplates steht noch gar nichts drin, diese Liste wird mit den Daten gefüllt die in dem Array gestanden hätten, würde es funktionieren.
Um genau zu sein würde dort MT_Name drin stehen, also die Vorlagennamen.

Die E-Mail-Vorlagen sind derzeit in 3 Ordner sortiert.
Wie man vermuten würde, SSC, ICC und Partner. Also, ja.

Und nochmal ja, das war nur ein Code-Ausschnitt, weil der Rest, abgesehen von den anderen Variablennamen, völlig identisch aussieht. Hatte ich unter dem Code vermerkt gehabt. Die Struktur kann man ja anhand des UDTs ablesen.

Bisher habe ich noch keine Daten eingelesen, aber das wäre kein Problem, wenn ich eine funktionierende Lösung hätte. Die Quelle wären ja die Vorlagen von Outlook. Diese sollen ja importiert werden und danach sind die überflüssig.

LG
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
29. März 2011, 16:02
Rufname:


AW: Dynamische Arrays in UDT auf Initialisierung prüfen - AW: Dynamische Arrays in UDT auf Initialisierung prüfen

Nach oben
       Version: Office 2007

Hallo,

um nochmal auf das Klassenmodul zurückzukommen, es ist wirklich nicht schwer, mit Klassenmodulen zu arbeiten. Hier mal eine Implementation Deiner MailTemplate-Struktur als Klasse mit Collections und Funktionen zum Hinzufügen, Speichern und Lesen in eine Datei:
Code:
Option Compare Database
Option Explicit

'-----------------------------------------------------------------------------
' Module    : clsMailTemplate
' Author    : Christian Coppes
' Date      : 29.03.2011
' Purpose   :
'-----------------------------------------------------------------------------

'#############################################################################
'-----------------------------------------------------------------------------
'----------------------------------- Constants  ------------------------------
'-----------------------------------------------------------------------------
'#############################################################################
Private Const cMODULENAME = "clsMailTemplate"

Public Enum EnmMailTemplate_Add
    enmMailTemplate_AddTO
    enmMailTemplate_AddCC
    enmMailTemplate_AddBCC
End Enum

'#############################################################################
'-----------------------------------------------------------------------------
'--------------------------------- Class Variables  --------------------------
'-----------------------------------------------------------------------------
'#############################################################################
Public MT_Name As String
Private prv_colMT_TO As Collection
Private prv_colMT_CC As Collection
Private prv_colMT_BCC As Collection
Private prv_strObjectError As String

'#############################################################################
'-----------------------------------------------------------------------------
'-----------------------------------   Properties  ---------------------------
'-----------------------------------------------------------------------------
'#############################################################################
Public Property Get ObjectError() As String
    ObjectError = prv_strObjectError
End Property

Public Property Get MT_BCC() As Collection
    Set MT_BCC = prv_colMT_BCC
End Property

Public Property Get MT_CC() As Collection
    Set MT_CC = prv_colMT_CC
End Property

Public Property Get MT_TO() As Collection
    Set MT_TO = prv_colMT_TO
End Property

'#############################################################################
'-----------------------------------------------------------------------------
'--------------------------------------- Methods -----------------------------
'-----------------------------------------------------------------------------
'#############################################################################
Public Function AddAddress(strMailAddress As String _
                         , lngAddTo As EnmMailTemplate_Add _
                         , Optional NoDuplicate As Boolean = True) As Boolean
On Error GoTo AddAddress_Error
    prv_strObjectError = ""
    AddAddress = False
    If IsMailAddress(strMailAddress) Then
        Select Case lngAddTo
          Case enmMailTemplate_AddTO
            If AddToCollection(prv_colMT_TO, strMailAddress _
                             , NoDuplicate) = False Then
                prv_strObjectError = "Konnte die Adresse nicht in " _
                                   & """TO"" hinzufügen!"
            End If
          Case enmMailTemplate_AddCC
            If AddToCollection(prv_colMT_CC, strMailAddress _
                             , NoDuplicate) = False Then
                prv_strObjectError = "Konnte die Adresse nicht in " _
                                   & """CC"" hinzufügen!"
            End If
          Case enmMailTemplate_AddBCC
            If AddToCollection(prv_colMT_BCC, strMailAddress _
                             , NoDuplicate) = False Then
                prv_strObjectError = "Konnte die Adresse nicht in " _
                                   & """BCC"" hinzufügen!"
            End If
        End Select
      Else
        prv_strObjectError = "Keine gültige Mailadresse !"
    End If
    AddAddress = True
AddAddress_Exit:
    Exit Function
AddAddress_Error:
    Select Case Err
      Case Else
        prv_strObjectError = cMODULENAME & "->AddAddress" & vbCr _
                           & "Err: " & Err.Number & " - " & Err.Description
        Resume AddAddress_Exit
    End Select
End Function

Private Function AddToCollection(coll As Collection, strText As String _
                               , Optional NoDuplicate As Boolean = True) _
                                As Boolean
    On Error Resume Next
    AddToCollection = True
    If NoDuplicate Then
        coll.Add strText, strText
        If Err.Number <> 0 Then AddToCollection = False
      Else
        coll.Add strText
        If Err.Number <> 0 Then AddToCollection = False
    End If
End Function

Private Function IsMailAddress(strMailAddress As String) As Boolean
    IsMailAddress = False
    If InStr(strMailAddress, "@") = 0 Then Exit Function
    If InStrRev(strMailAddress, ".") < InStr(strMailAddress, "@") Then
        Exit Function
    End If
    ' und weitere Tests....
    IsMailAddress = True
End Function

Public Function WriteObject(intFileNumber As Integer) As Boolean
On Error GoTo WriteObject_Error
    Dim varMail As Variant

    prv_strObjectError = ""
    WriteObject = False
    If Me.MT_Name = "" Then
        prv_strObjectError = "Das Mailtemplate hat noch keinen Namen!"
        GoTo WriteObject_Exit   ' ----------->
    End If
    Print #intFileNumber, "[" & Me.MT_Name & "]"
    Print #intFileNumber, "#TO#"
    For Each varMail In Me.MT_TO
        Print #intFileNumber, varMail
    Next varMail
    Print #intFileNumber, "#/TO#"
    Print #intFileNumber, "#CC#"
    For Each varMail In Me.MT_CC
        Print #intFileNumber, varMail
    Next varMail
    Print #intFileNumber, "#/CC#"
    Print #intFileNumber, "#BCC#"
    For Each varMail In Me.MT_BCC
        Print #intFileNumber, varMail
    Next varMail
    Print #intFileNumber, "#/BCC#"
    Print #intFileNumber, "[/" & Me.MT_Name & "]"
    WriteObject = True
WriteObject_Exit:
    Exit Function
WriteObject_Error:
    Select Case Err
      Case Else
        prv_strObjectError = cMODULENAME & "->WriteObject" & vbCr _
                           & "Err: " & Err.Number & " - " & Err.Description
        Resume WriteObject_Exit
    End Select
End Function

Public Function ReadObject(intFileNumber As Integer _
                         , Optional NoDuplicate As Boolean = True) As Boolean
On Error GoTo ReadObject_Error
    Dim strLine As String

    ReadObject = False
    Set prv_colMT_BCC = New Collection
    Set prv_colMT_CC = New Collection
    Set prv_colMT_TO = New Collection
    Line Input #intFileNumber, strLine
    If Left(strLine, 1) <> "[" And Right(strLine, 1) <> "]" Then
        prv_strObjectError = "Kein Mailtemplate an dieser Stelle der Datei " _
                           & "gefunden!"
        GoTo ReadObject_Exit    ' ----------->
    End If
    Me.MT_Name = Mid(strLine, 2, Len(strLine) - 2)
    Do
        Line Input #intFileNumber, strLine
        If Left(strLine, 1) <> "[" Then
            Select Case strLine
              Case "#TO#"
                Do
                    Line Input #intFileNumber, strLine
                    If Left(strLine, 1) <> "#" Then
                        If AddAddress(strLine, enmMailTemplate_AddTO _
                                    , NoDuplicate) = False Then
                            GoTo ReadObject_Exit    ' ----------->
                        End If
                    End If
                Loop Until strLine = "#/TO#" Or EOF(intFileNumber)
                If EOF(intFileNumber) Then
                    prv_strObjectError = "Unerwartetes Dateiende !"
                    GoTo ReadObject_Exit    ' ----------->
                End If
              Case "#CC#"
                Do
                    Line Input #intFileNumber, strLine
                    If Left(strLine, 1) <> "#" Then
                        If AddAddress(strLine, enmMailTemplate_AddCC _
                                    , NoDuplicate) = False Then
                            GoTo ReadObject_Exit    ' ----------->
                        End If
                    End If
                Loop Until strLine = "#/CC#" Or EOF(intFileNumber)
                If EOF(intFileNumber) Then
                    prv_strObjectError = "Unerwartetes Dateiende !"
                    GoTo ReadObject_Exit    ' ----------->
                End If
              Case "#BCC#"
                Do
                    Line Input #intFileNumber, strLine
                    If Left(strLine, 1) <> "#" Then
                        If AddAddress(strLine, enmMailTemplate_AddBCC _
                                    , NoDuplicate) = False Then
                            GoTo ReadObject_Exit    ' ----------->
                        End If
                    End If
                Loop Until strLine = "#/BCC#" Or EOF(intFileNumber)
                If EOF(intFileNumber) Then
                    prv_strObjectError = "Unerwartetes Dateiende !"
                    GoTo ReadObject_Exit    ' ----------->
                End If
            End Select
        End If
    Loop Until strLine = "[/" & Me.MT_Name & "]" Or EOF(intFileNumber)
    If EOF(intFileNumber) And strLine <> "[/" & Me.MT_Name & "]" Then
        prv_strObjectError = "Unerwartetes Dateiende !"
        GoTo ReadObject_Exit    ' ----------->
    End If
    ReadObject = True
ReadObject_Exit:
    Exit Function
ReadObject_Error:
    Select Case Err
      Case Else
        prv_strObjectError = cMODULENAME & "->ReadObject" & vbCr & _
                             "Err: " & Err.Number & " - " & Err.Description
        Resume ReadObject_Exit
    End Select
End Function

'#############################################################################
'-----------------------------------------------------------------------------
'------------------------------ Constructor/Destructor -----------------------
'-----------------------------------------------------------------------------
'#############################################################################
Private Sub Class_Initialize()
    Set prv_colMT_BCC = New Collection
    Set prv_colMT_CC = New Collection
    Set prv_colMT_TO = New Collection
End Sub

Private Sub Class_Terminate()
    Set prv_colMT_BCC = Nothing
    Set prv_colMT_CC = Nothing
    Set prv_colMT_TO = Nothing
End Sub
Hier würde vielleicht noch eine Funktion zum Entfernen einer Mailadresse Sinn machen, aber das kannst Du gern mal selbst probieren.

In einem Standardmodul kannst Du das zum Beispiel so verwenden:
Code:
Public Sub testmail()
    Dim objMailTemplate As clsMailTemplate
   
    Set objMailTemplate = New clsMailTemplate
    If objMailTemplate.AddAddress("x@y.de", enmMailTemplate_AddTO _
                                , False) = False Then
        Debug.Print objMailTemplate.ObjectError
    End If
    Open "Test.txt" For Output As #1
    objMailTemplate.MT_Name = "Test"
    If objMailTemplate.WriteObject(1) = False Then
        Debug.Print objMailTemplate.ObjectError
    End If
    If objMailTemplate.WriteObject(1) = False Then
        Debug.Print objMailTemplate.ObjectError
    End If
    Close #1
    Set objMailTemplate = New clsMailTemplate
    Open "Test.txt" For Input As #1
    Do
        If objMailTemplate.ReadObject(1) = False Then
            Debug.Print objMailTemplate.ObjectError
        End If
    Loop Until EOF(1)
    Close #1
    Stop
End Sub
Die Funktionen zum Lesen und Schreiben öffnen oder schließen selbst keine Dateien, so kann man auch mehrere Objekte aus/in eine(r) Datei einlesen oder schreiben.

In einer weiteren Klasse "clsDBStruct" könnte man nun wieder die MailTemplate-Objekte in weitere Collections einfügen (als Ersatz für Deine Arrays) und diese wiederum kann dann eine Schreibfunktion anbieten, die gleich einen ganzen Satz von MailTemplates in eine Datei schreibt wie im Beispiel oben, im Prinzip nach dem gleichen Schema.

Die letzte Leseschleife im Beispiel ist so natürlich sinnlos, da sie immer das gleiche Objekt wieder überschreibt, soll nur zeigen, daß man auch mehr als ein Objekt aus der gleichen Datei einlesen kann. In einer Klasse "clsDBStruct" würde man diese Objekte nach dem Einlesen einfach in eine Collection einfügen und dann das nächste Objekt in die Objektvariable einlesen.

Allerdings frage ich mich auch, da wir uns hier in einem Access-Forum befinden, warum Du die eingelesenen Daten nicht einfach in eine Tabelle schreibst?

Gruß

Christian
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Gehe zu Seite 1, 2  Weiter
Diese Seite Freunden empfehlen

Seite 1 von 2
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Indizes über "Kreuz" prüfen? 12 Miyu 191 08. Feb 2013, 20:32
Miyu Indizes über "Kreuz" prüfen?
Keine neuen Beiträge Access Tabellen & Abfragen: Wert in Tabelle prüfen und ggf. Msgbox 1 1748351 94 21. Dez 2012, 12:38
KlausMz Wert in Tabelle prüfen und ggf. Msgbox
Keine neuen Beiträge Access Tabellen & Abfragen: vor importieren aus Exel prüfen ob Datensatz bereits vorhand 1 Focus1610 90 02. Nov 2012, 13:08
JMalberg vor importieren aus Exel prüfen ob Datensatz bereits vorhand
Keine neuen Beiträge Access Tabellen & Abfragen: Prüfen ob Lücke in Zahlenreihe 4 keule55 504 24. Sep 2012, 11:24
JMalberg Prüfen ob Lücke in Zahlenreihe
Keine neuen Beiträge Access Tabellen & Abfragen: Prüfen, wo Abfragen verwendet werden 1 Dutch_OnE 196 03. Jan 2012, 12:44
Nouba Prüfen, wo Abfragen verwendet werden
Keine neuen Beiträge Access Tabellen & Abfragen: Prüfen ob Wert in Formular bereits in Tabelle enthalten ist 5 Jan0004 793 09. Nov 2011, 07:53
Willi Wipp Prüfen ob Wert in Formular bereits in Tabelle enthalten ist
Keine neuen Beiträge Access Tabellen & Abfragen: Dynamische Nummerierung 1 magnum 399 30. Jan 2010, 21:45
steffen0815 Dynamische Nummerierung
Keine neuen Beiträge Access Tabellen & Abfragen: Prüfen, ob Wert aus Tabelle A in Tabelle B vorkommt 1 PommBaer 2606 15. Nov 2008, 12:21
MiLie Prüfen, ob Wert aus Tabelle A in Tabelle B vorkommt
Keine neuen Beiträge Access Tabellen & Abfragen: Dynamische Abfrage: Laufzeitenfehler 13 35 ppride 1998 04. Jan 2008, 23:09
ppride Dynamische Abfrage: Laufzeitenfehler 13
Keine neuen Beiträge Access Tabellen & Abfragen: Datensatz auf Existenz Prüfen 4 Herminator 2707 20. Jul 2007, 08:51
Herminator Datensatz auf Existenz Prüfen
Keine neuen Beiträge Access Tabellen & Abfragen: Dynamische INSERTS auf basis von einer Tabelle 5 ToxSox 698 04. Aug 2006, 16:54
rita2008 Dynamische INSERTS auf basis von einer Tabelle
Keine neuen Beiträge Access Tabellen & Abfragen: Prüfen ob ein Formular geöffnet ist 2 chris1337 15551 09. Mai 2006, 09:35
chris1337 Prüfen ob ein Formular geöffnet ist
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Frontpage Forum