Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Funktion_erstellen
Gehe zu Seite 1, 2  Weiter
zurück: Wert aus gebundenem Kombinationsfeld auswählen weiter: Netzwerkauslastung bei Änderungen im FE Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Funktion_erstellen
Gast


Verfasst am:
09. Feb 2012, 11:32
Rufname:

Funktion_erstellen - Funktion_erstellen

Nach oben
       Version: Office 2003

Hallo,

ich möchte eine Suchfunktion erstellen, die an mehreren Stellen verwendet werden soll.

Leider habe ich noch Schwierigkeiten mit dem Aufruf der Funktion:
Ich bin mir nicht sicher wie beim Aufruf der Variabletyp definiert werden muss.(Dim Anweisungen)
Außerdem möchte ich mehr Variabeln zurückgemeldet bekommen als mit dem Aufruf losschicke:
d.h. die msgboxen zeigen nichts an

Wer kann mir weiterhelfen?

-----Aufruf der Funktion-------

Code:
Sub test1()
str_ablagepfad = "c:\test"
ysn_Unterverzeichnis = True
str_Teildateiname = 1550
Call suchfunction(str_ablagepfad, ysn_Unterverzeichnis, str_Teildateiname)
MsgBox int_anzahlgefundenefiles
MsgBox str_PfadundDateiname
MsgBox str_Dateiname
End Sub


-----Funktion-------

Code:
Public Function suchfunction(ByVal str_ablagepfad As String, ByVal ysn_Unterverzeichnis As Boolean, ByVal str_Teildateiname As String)
'Dim fs As Application


Set fs = Application.FileSearch

With fs
    .NewSearch
    .LookIn = str_ablagepfad
    .SearchSubFolders = ysn_Unterverzeichnis
    .filename = "*" & str_Teildateiname & "*.pdf"
   
        If .Execute() > 0 Then
            'Anzahl der gefundenen Übereinstimmungen
            int_anzahlgefundenefiles = fs.FoundFiles.Count
       
                'Pfad und Dateiname wenn gesuchte Datei einmalig vorhanden
                If int_anzahlgefundenefiles = 1 Then
               
                    'Variable mit Pfad und Dateiname füllen
                    str_PfadundDateiname = fs.FoundFiles(1)
                   
                    'Variable mit Dateiname füllen
                    str_Dateiname = Mid(str_PfadundDateiname, InStrRev(str_PfadundDateiname, "\", -1) + 1)
               
                End If
       
        Else
            int_anzahlgefundenefiles = 0
        End If

End With

End Function
MissPh!
Office-VBA-Programmiererin


Verfasst am:
09. Feb 2012, 12:19
Rufname:
Wohnort: NRW


AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Hallo,

wenn du die in der Funktion belegten Variablen in einem allgemeinen Modul als Public-Variablen deklarierst, so kannst du von überallher darauf zugreifen.

BTW: Was willst du tun, wenn mehr als eine Datei gefunden wurde?

_________________
Gruß MissPh!
Gast



Verfasst am:
09. Feb 2012, 12:51
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Hallo,

Danke schonmal für deine Antwort.

Zitat:
Variablen in einem allgemeinen Modul als Public-Variablen deklarierst


Mir wäre es lieber, wenn ich dass mit den Funktionen endlich mal verstehen würde, als die Variabeln global zu definieren. Vielleicht kannst du mir es erklären, oder einen Link nennen (möglichst einfach und auf deutsch erklärt) wo ich es nachlesen kann.

Zitat:
Was willst du tun, wenn mehr als eine Datei gefunden wurde?


dann soll in der sub test1
int_anzahlgefundenefiles die Anzahl anzeigen
str_PfadundDateiname soll leer zurückgegeben werden
str_Dateiname soll leer zurückgegeben werden
MissPh!
Office-VBA-Programmiererin


Verfasst am:
09. Feb 2012, 13:03
Rufname:
Wohnort: NRW

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Du kannst aus einer Funktion nur einen Wert zurückgeben, der Rückgabewert könnte allerdings auch aus mehreren Variablen mit Semikolon getrennt zusammengesetzt werden.

Beispiel:
Code:
suchfunction = int_anzahlgefundenefiles & ";" & str_PfadundDateiname & ";" & str_Dateiname
In der aufrufenden Prozedur kannst du das Ergebnis folgendermaßen auswerten:
Code:
Dim strX As String, arrX, i
strX = suchfunction(str_ablagepfad, ysn_Unterverzeichnis, str_Teildateiname)
arrX = Split(strX, ";")
For i = LBound(arrX) To UBound(arrX)
    MsgBox arrX(i)
Next i

BTW: Du solltest dir besser angewöhnen, die benutzten Variablen zu deklarieren.

_________________
Gruß MissPh!
steffen0815
VBA-Programmierer


Verfasst am:
09. Feb 2012, 13:52
Rufname:


AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Hallo,
globale Variablen sind n.m.M. etwas unübersichtlich, zusammengesetze Strings etwas umständlich.

Ich bevorzuge daher folgende Variante:
Code:
Sub testen()
Dim Wert1 As Integer, Wert2 As String, Wert3 As Date
   MehrereRückgabeparameter Wert1, Wert2, Wert3
   MsgBox Wert1 & vbNewLine & Wert2 & vbNewLine & Wert3 & vbNewLine
End Sub

Sub MehrereRückgabeparameter(ByRef W1 As Integer, ByRef W2 As String, ByRef W3 As Date)
    W1 = 1
    W2 = "Text"
    W3 = Date
End Sub


Der sauberste Weg wäre über eine Klasse, aber das ist nicht mein Weg Wink.

Btw1:
FileSearch ist ab 2007 n.m.W. nicht mehr verfügbar. Vielleicht solltest du besser schon jetzt über Alternativen nachdenken.

Btw2:
Die Übergabe mehrerer Parameter sollte hier gar nicht notwendig sein, da es sich alles aus dem einen berechnen lässt. Zur Übergabe mehrere Dateien brauchst du ein Array. Darüber hast du dann auch die Anzahl. Ja und aus Pfad+Dateiname "errechnet" sich der Dateiname.

_________________
Gruß Steffen
MissPh!
Office-VBA-Programmiererin


Verfasst am:
09. Feb 2012, 14:00
Rufname:
Wohnort: NRW

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

@Steffen:
Dein Vorschlag ist interessant, aber die Rückgabewerte haben mit den übergebenen Parametern in diesem Beispiel wenig gemein.
Oder was habe ich da jetzt nicht verstanden?

BTW:
Zitat:
... aus dem einen berechnen lässt.
welcher da wäre? Confused
_________________
Gruß MissPh!
redround
Entwickler und ext. Datenschutzbeauftragter


Verfasst am:
09. Feb 2012, 14:10
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Da Steffen die Werte ByRef übergibt heißt dass, dass nicht der Wert an die aufgerufene Prozedur übergeben wird sondern die Adresse der Variable im Arbeitsspeicher. Damit greifen sowohl die aufrufende als auch die aufgerufene Prozedur auf den gleichen Wert im Speichern und damit vereinfacht ausgedrückt auf die gleiche Variable zu.

Durch diese ByRef Parameter lassen sich tatsächlich sowas wie "mehrere Rückgabewerte" simulieren.

Grundsätzlich würde ich aber auch eher den Weg einer Klasse als Rückgabewert wählen.

_________________
wenn Euch die Umsetzung der Lösung zu mühseelig ist, findet sich hier im Forum per PN bestimmt auch jemand, der das für einen geringen Obulus macht Smile
MissPh!
Office-VBA-Programmiererin


Verfasst am:
09. Feb 2012, 14:16
Rufname:
Wohnort: NRW

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Was ByRef bedeutet ist mir schon klar, aber die Funktion erwartet einen String, einen Bool'schen Wert und nochmals einen String, gibt aber zurück einen Integer-Wert, einen String und noch einen String. Das wären also insgesamt sechs Parameter.
_________________
Gruß MissPh!
redround
Entwickler und ext. Datenschutzbeauftragter


Verfasst am:
09. Feb 2012, 14:24
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

das sehe ich nicht so

Zuerst legt Steffen drei Variable in der Prozedur testen() an:

Dim Wert1 As Integer, Wert2 As String, Wert3 As Date

dann ruft er die Prozedur MehrereRückgabeparamter auf und übergibt die drei Variablen als Parameter (genauer Zeiger auf die Variablen)

innerhalb der Prozedur MehrereRückgabewerte weißt er den Parametern dann Werte zu (und zwar typrichtig einmal einen Zahlenwert, einem einen Textwert und einmal das aktuelle Datum). Durch die Verwendung der Zeiger verändern sich dadurch auch die Werte in den Variablen der Prozedur testen().

Ich kann in seinem Beispiel nur 3 In/Out Parameter erkennen, die man sowohl als Aufrufparameter als auch als Rückgabewerte betrachten kann ... aber keine 6 verschiedenen


EDIT: ach so ... jetzt verstehe ich Dich erst ... Du hast Dich auf das Ausgangsposting bezogen Smile während ich das Beispiel von Steffen meinte

_________________
wenn Euch die Umsetzung der Lösung zu mühseelig ist, findet sich hier im Forum per PN bestimmt auch jemand, der das für einen geringen Obulus macht Smile
Gast



Verfasst am:
09. Feb 2012, 14:42
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Vielen Dank Euch allen,

Ersteinmal was bedeutet Btw:?


Dann habe ich folgendes geschlussfolgert.

Um die Suche mehrmals verwenden zu können muss ich nicht unbedingt eine Funktion haben. Es reicht eine Sub.
Die Sub hat den Vorteil, dass mehrere Werte (die ich ja haben möchte ) zurückgegeben werden können.

Nun habe ich folgenden Code:

Ich gehe davon aus, dass ich fs deklarieren sollte. Wie ist die richtige? (As Application) funktioniert nicht.

Code:
Sub test1()

Dim str_ablagepfad As String
Dim ysn_Unterverzeichnis As Boolean
Dim str_Teildateiname As String
Dim int_anzahlgefundenefiles As Integer

str_ablagepfad = "c:\test"
ysn_Unterverzeichnis = True
str_Teildateiname = 1550
int_anzahlgefundenefiles = 0
Call suchfunktion(str_ablagepfad, ysn_Unterverzeichnis, str_Teildateiname, int_anzahlgefundenefiles, str_PfadundDateiname, str_Dateiname)
MsgBox int_anzahlgefundenefiles
MsgBox str_PfadundDateiname
MsgBox str_Dateiname
End Sub


Code:
Sub suchfunktion(ByRef str_ablagepfad As String, ByRef ysn_Unterverzeichnis As Boolean, ByRef str_Teildateiname As String, Optional ByRef int_anzahlgefundenefiles As Integer, Optional ByRef str_PfadundDateiname, Optional ByRef str_Dateiname)
'Dim fs As Application


Set fs = Application.FileSearch

With fs
    .NewSearch
    .LookIn = str_ablagepfad
    .SearchSubFolders = ysn_Unterverzeichnis
    .filename = "*" & str_Teildateiname & "*.pdf"
   
        If .Execute() > 0 Then
            'Anzahl der gefundenen Übereinstimmungen
            int_anzahlgefundenefiles = fs.FoundFiles.Count
       
                'Pfad und Dateiname wenn gesuchte Datei einmalig vorhanden
                If int_anzahlgefundenefiles = 1 Then
               
                    'Variable mit Pfad und Dateiname füllen
                    str_PfadundDateiname = fs.FoundFiles(1)
                   
                    'Variable mit Dateiname füllen
                    str_Dateiname = Mid(str_PfadundDateiname, InStrRev(str_PfadundDateiname, "\", -1) + 1)
               
                End If
       
        Else
            int_anzahlgefundenefiles = 0
        End If

End With

End Sub
Gast



Verfasst am:
09. Feb 2012, 14:45
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Anmerkung:
Mir war nicht bewußt , dass eine Funktion nur einen Rückgabewert (außer mit einem Array) zurück geben kann.
Gast



Verfasst am:
09. Feb 2012, 14:48
Rufname:

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

ich gleube ich habs jetzt.

es muss

Code:
Dim fs As FileSearch

heißen.

Ist der Code so OK?
Ich meine mit allen deklarationen usw.?
MissPh!
Office-VBA-Programmiererin


Verfasst am:
09. Feb 2012, 15:16
Rufname:
Wohnort: NRW

AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Zitat:
Ist der Code so OK?
Tut er was du erwartest? Lässt er sich fehlerfrei kompilieren? Hast du Option Explicit im Modulkopf stehen?
Dann sollte wohl alles OK sein. Wink

_________________
Gruß MissPh!
redround
Entwickler und ext. Datenschutzbeauftragter


Verfasst am:
09. Feb 2012, 15:39
Rufname:

Re: AW: Funktion_erstellen - Re: AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Anonymous - 09. Feb 2012, 13:45 hat folgendes geschrieben:
Anmerkung:
Mir war nicht bewußt , dass eine Funktion nur einen Rückgabewert (außer mit einem Array) zurück geben kann.


nicht zu vergessen (und der von mir bevorzugte Weg) eine benutzerdefinierte Klasse als Rückgabewert

btw = by the way

btw Smile FileSearch gibt es ab Access 2007 nicht mehr. Vielleicht solltest Du hier schon jetzt mal über eine Alternative nachdenken, wenn Du eh gerade in der Entwicklung bist Wink

_________________
wenn Euch die Umsetzung der Lösung zu mühseelig ist, findet sich hier im Forum per PN bestimmt auch jemand, der das für einen geringen Obulus macht Smile
Gast



Verfasst am:
09. Feb 2012, 16:56
Rufname:


AW: Funktion_erstellen - AW: Funktion_erstellen

Nach oben
       Version: Office 2003

Hielfeeeee

Zitat:
FileSearch gibt es ab Access 2007 nicht mehr.


Ich bekomme ich 10 Tagen meinen neuen PC Windows 7 mit neuem Office, durch was kann ich filesearch ersetzen? Gibts den befehl auch schon in 2Access 2003?
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

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel-Formeln