xpilzx1
Goto Top

Felder in Funktion als String ansprechen ? aber wie?

Hallo allerseits,

ich habe mal wieder ein Mittelschweres Problemm was mich rasend macht.
ich will eine Funktion schreiben die ein formular anhand eines textfeldes filtert.
die filterfunktion als SUB funktioniert bestens. nur wenn ich die Zuweisungen (Formularname,Textfeldname ....)
durch Variablen ersetze dann bekomme ich immer die Meldung : Laufzeitfehler 2465, office kann das in ihrem ausdruck angesprochene feld nicht finden.


hier auch mal der Code:
Public Function PFCT_FILTER(PVAR_FORMULAR As Form, PVAR_SUCHFELD_1 As String, PVAR_FORMFELD_1 As String) As String

 On Error GoTo FEHLER
     If Nz(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text) <> "" Then  
        PVAR_FORMULAR.Filter = "(PVAR_FORMFELD_1) Like '" & Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text & "*'"  
        PVAR_FORMULAR.FilterOn = True
  Stop
    Else
        PVAR_FORMULAR.FilterOn = False
        Exit Function
    End If
FEHLER:
    If PVAR_FORMULAR.RecordsetClone.RecordCount = 0 Then
        PVAR_FORMULAR.Filter = ""  
        PVAR_FORMULAR.PVAR_SUCHFELD_1.SetFocus
        PVAR_FORMULAR!PVAR_SUCHFELD_1.SelStart = Len(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text)
        MsgBox "Keine Übereinstimung gefunden"  
        Exit Function
    End If
     PVAR_FORMULAR!PVAR_SUCHFELD_1.SelStart = Len(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text)
 End Function
meine frage ist 1. gibt es eine möglichkeit ein Tabellenfeld bzw ein Textfeld anhand eines String's anzusprechen ODER
2. wie muss ich die Variablen PVAR_SUCHFELD_1 und PVAR_FORMFELD_1 deklarieren damit es so Klappt?
PVAR_SUCHFELD_1 = Ein Ungebundenes Textfeld, PVAR_FORMFELD_1 = ein feld im Formular


bin ein Neuling was VBA angeht, und hoffe ich konnte es verständlich erklähren

Content-Key: 146251

Url: https://administrator.de/contentid/146251

Printed on: April 24, 2024 at 04:04 o'clock

Member: thaenhusen
thaenhusen Jul 05, 2010 at 12:38:11 (UTC)
Goto Top
Moin.
Public Function PFCT_FILTER(PVAR_FORMULAR As Form, PVAR_SUCHFELD_1 As String, PVAR_FORMFELD_1 As String) As String
On Error GoTo FEHLER
If Nz(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text) <> "" Then  
    PVAR_FORMULAR.Filter = PVAR_FORMFELD_1 & " Like '" & Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text & "*'"  
    PVAR_FORMULAR.FilterOn = True
Else
   PVAR_FORMULAR.FilterOn = False
   Exit Function
End If
FEHLER:
If PVAR_FORMULAR.RecordsetClone.RecordCount = 0 Then
  PVAR_FORMULAR.Filter = ""  
  PVAR_FORMULAR.PVAR_SUCHFELD_1.SetFocus
  PVAR_FORMULAR!PVAR_SUCHFELD_1.SelStart = Len(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text)
  MsgBox "Keine Übereinstimung gefunden"  
End If
  PVAR_FORMULAR!PVAR_SUCHFELD_1.SelStart = Len(PVAR_FORMULAR!PVAR_SUCHFELD_1.Text)
End Function
So könnte das funktionieren.

HTH
MK
Member: xpilzx1
xpilzx1 Jul 05, 2010 at 13:00:27 (UTC)
Goto Top
Hallo, dank für die rasche antwort,

leider funktioniert das so auch nicht und ich denke ich hab das nicht genau erklährt. mir ist gerade aufgefallen wo der Fehler ist, aber ich weis keine lösung dafür.
bei diesem vergleich :PVAR_FORMULAR.Filter = PVAR_FORMFELD_1 & " Like '" & Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text & "*'"
tut die funktion den inhalt von der ersten zeile von PVAR_FORMFELD_1 mit Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text & "*'" vergleichen.
das ist aber falsch. es soll ja das Feld PVAR_FORMFELD_1 verglichen werden. also eigentlich Laut deklaration steht dort (Spalte) VORNAME dirn.
ich hänge auch nochmal ein Screenshoot vom Aufruf mit an.
Private Sub FILTER_VORNAME_Change()
     SQL_FILTER = PFCT_FILTER(Forms!FRM_MASTER!FRM_MITARBEITER_AUSWAHL_SUB.Form, FILTER_VORNAME, VORNAME)
  Stop
  End Sub
also irgentwie benötige ich die Funktion Dim PVAR_FORMFELD_1 as Feld im Formular, und dim PVAR_SUCHFELD_1 as Textfeld im formular.

ist dies möglich?

ach ja ich nutze Access 2003

danke
Member: xpilzx1
xpilzx1 Jul 05, 2010 at 13:26:00 (UTC)
Goto Top
Zitat von @xpilzx1:
Hallo, dank für die rasche antwort,

leider funktioniert das so auch nicht und ich denke ich hab das nicht genau erklährt. mir ist gerade aufgefallen wo der
Fehler ist, aber ich weis keine lösung dafür.
bei diesem vergleich :PVAR_FORMULAR.Filter = PVAR_FORMFELD_1 & " Like '" &
Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text & "*'"
tut die funktion den inhalt von der ersten zeile von PVAR_FORMFELD_1 mit Forms(PVAR_FORMULAR)!PVAR_SUCHFELD_1.Text &
"*'" vergleichen.
das ist aber falsch. es soll ja das Feld PVAR_FORMFELD_1 verglichen werden. also eigentlich Laut deklaration steht dort (Spalte)
VORNAME dirn.
ich hänge auch nochmal ein Screenshoot vom Aufruf mit an.

Private Sub FILTER_VORNAME_Change()
SQL_FILTER = PFCT_FILTER(Forms!FRM_MASTER!FRM_MITARBEITER_AUSWAHL_SUB.Form, FILTER_VORNAME, VORNAME)
Stop
End Sub

also irgentwie benötige ich die Funktion Dim PVAR_FORMFELD_1 as Feld im Formular, und dim PVAR_SUCHFELD_1 as Textfeld im
formular.

ist dies möglich?

ach ja ich nutze Access 2003

danke


ach ja und einmal den Code so wie ichihn als sub im unterformular direkt aufrufe, so funtioniert er auch tadellos:
Private Sub FILTER_VORNAME_Change()
 On Error GoTo FEHLER_1
   If Nz(Me!FILTER_VORNAME.Text) <> "" Then  
   Me.Filter = "VORNAME Like '" & Me!FILTER_VORNAME.Text & "*' And NAME Like '" & Me!FILTER_NAME & "*' "  
   Me.FilterOn = True
    Else
    Me.FilterOn = False
    Exit Sub
    End If
FEHLER_1:
   If Me.RecordsetClone.RecordCount = 0 Then
   Me.Filter = ""  
   Me.FILTER_VORNAME.SetFocus
   Me!FILTER_VORNAME.SelStart = Len(Me!FILTER_VORNAME.Text)
   MsgBox "Keine Übereinstimung gefunden in VORNAME"  
   Exit Sub
 End If
    Me!FILTER_VORNAME.SelStart = Len(Me!FILTER_VORNAME.Text)
 End Sub
Member: Biber
Biber Jul 05, 2010 at 14:20:56 (UTC)
Goto Top
[Halb OT]

Moin xpilzx1,

ich habe mal (wenigstens) in dem letzten Kommentar den VBA-Krams in Code-Formatierung gesetzt.
Meine Hoffnung, dass dadurch eventuell auch Einrückungen der Zeilen eine gewisse Strukturiertheit vorgaukeln würden, hat sich allerdings zerschlagen.

Bitte verwende dennoch bei Fragen zur Skripterstellung/Programmierung in Zukunft auch Code-Tags
Die sind beschrieben in den FAQ oder über den "Hilfe zur Forrmatierung"-Button erreichbar , der beim "Editieren" angeboten wird.

Dann können alle auf bestimmte Zeilennummern verweisen - da macht es doch einfacher.

Grüße
Biber

[/Halb OT]
Member: xpilzx1
xpilzx1 Jul 05, 2010 at 14:27:08 (UTC)
Goto Top
hallo biber,

sorry das die formatierung nicht stimmt, wuste ich nicht. aber danke für deine bearbeitung. so siht das doch gleich viel besser aus.
hast du evl. auch einen anhaltspunkt wie ich mein problem lösen kann? ich dreh bald durch hehe.
Member: thaenhusen
thaenhusen Jul 05, 2010 at 14:40:23 (UTC)
Goto Top
Moin,

Ich habe mal eben den Fall nachvollzogen mit den neuen Infos.

Folgende Funktion funktioniert (Toller Satz, gell? face-wink):

Public Function PFCT_FILTER(PVAR_FORMULAR As String, PVAR_SUCHFELD_1 As String, PVAR_FORMFELD_1 As String) As String
On Error GoTo FEHLER
If Nz(Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).Text) <> "" Then
Forms(PVAR_FORMULAR).Filter = PVAR_FORMFELD_1 & " Like '" & Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).Text & "*'"
Forms(PVAR_FORMULAR).FilterOn = True
Else
Forms(PVAR_FORMULAR).FilterOn = False
Exit Function
End If

FEHLER:
If Forms(PVAR_FORMULAR).RecordsetClone.RecordCount = 0 Then
Forms(PVAR_FORMULAR).Filter = ""
Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).SetFocus
Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).SelStart = Len(Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).Text)
MsgBox "Keine Übereinstimung gefunden"
Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).SelStart = Len(Forms(PVAR_FORMULAR)(PVAR_SUCHFELD_1).Text)
End If
End Function

Aufruf:

z.B. in der After_Update sub das Feldes FILTER_VORNAME

Call PFCT_FILTER(Me.Name, "FILTER_VORNAME", "VORNAME")

HTH
MK
Member: xpilzx1
xpilzx1 Jul 06, 2010 at 06:53:33 (UTC)
Goto Top
Hallo thaenhusen,

danke für deine mühe, aber leider funktioniert das so auch nicht bei mir. nun kommt ein neuer fehler, Office kann das vormular " FRM_MASTER!FRM_MITARBEITER_AUSWAHL_SUB" nicht finden. die sache mit den VORNAMEN in " " ist aber eine gute idee gewesen. manchmal seh ich den wald nichtmehr vor lauter bäumen.
kannst du dir, oder besser mir erklähren woher dieser fehler kommt? ich habe schon das me.Name ersetzt durch eine variable zusamengesätzt aus me.parent und me.Name aber immer sagt access es kann das formular nicht finden.
Member: thaenhusen
thaenhusen Jul 06, 2010 at 08:54:55 (UTC)
Goto Top
Moin.

Da hast Du jetzt ein Unterformular das gefiltert werden soll.
Dann musst Du da ander mit umgehen... weil Access das anders auswertet...

Public AbsForm As Object 'Das Absolute Formular, dass gefiltert werden soll.

Public Function setFormularObjekt()
On Error GoTo ErrorHandler

Set AbsForm = Forms(Screen.ActiveForm.Name)
Set AbsForm = Forms(Screen.ActiveForm.Name)(Screen.ActiveForm.ActiveControl.Name).Form
GoTo weiter:

ErrorHandler:
'nichts machen
End Function


Public Function PFCT_FILTER(PVAR_SUCHFELD_1 As String, PVAR_FORMFELD_1 As String) As String
On Error GoTo FEHLER

call setFormularObjekt

If Nz(Absform(PVAR_SUCHFELD_1).Text) <> "" Then
Absform.Filter = PVAR_FORMFELD_1 & " Like '" & Absform(PVAR_SUCHFELD_1).Text & "*'"
Absform.FilterOn = True
Else
Absform.FilterOn = False
Exit Function
End If

FEHLER:
If Absform.RecordsetClone.RecordCount = 0 Then
Absform.Filter = ""
Absform.SetFocus
Absform(PVAR_SUCHFELD_1).SelStart = Len(Absform(PVAR_SUCHFELD_1).Text)
MsgBox "Keine Übereinstimung gefunden"
Absform(PVAR_SUCHFELD_1).SelStart = Len(Absform(PVAR_SUCHFELD_1).Text)
End If
End Function

Aufruf:

Call PFCT_FILTER("FILTER_VORNAME", "VORNAME")

Desweiteren solltest Du Dich mal mit den Events und Abhängigkeiten von Access-Formularen beschäftigen,
sonst wirst Du da noch häufig drüber stolpern...

HTH
MK
Member: xpilzx1
xpilzx1 Jul 06, 2010 at 09:15:21 (UTC)
Goto Top
HURRA

ich könnt dich knutschen *lol* vielen tausend dank das ist genau das was ich haben wollte.
anscheint kann man nicht so einfach anfangen sich hinsetzen und einen Datenbank programmieren.
muss wohl noch ein bisschen Grundlagenforschung betreiben.
zum glück gibt es ja gute Foren mit hilfsbereiten Usern.

nochmal vielen dank und einen schönen tag.

ach eine frage nur weil es mich interessiert, den inhalt der variable AbsForm kann man im debuger nicht ansehen?
Member: thaenhusen
thaenhusen Jul 06, 2010 at 09:31:28 (UTC)
Goto Top
Moin.

Schön das ich Dir helfen konnte.

Naja, das ist wie mit allen Dingen. Man sollte schon ein paar Grundsätze kennen,
bevor es losgeht.

Der Inhalt vom Absform ist ein Formularobjekt und daher kannst Du das nicht mit debug.print ausgeben.
Du kannst nur z.b. Absform.Name aufrufen und im debug.print ausgeben.

Also die Datentypen im VBA solltest Du Dir da vieleicht auch noch mal ansehen.
Vorallem die Objekte und deren Methoden. Und wie man eigene Objekte mit
eigenen Methode anlegt und programmiert...

HTH
MK
Member: xpilzx1
xpilzx1 Jul 06, 2010 at 09:46:31 (UTC)
Goto Top
wirklich es tut mir leid aber ich hab noch eine frage. dein Code funktioniert soweit bestens, aber das OnErrorGoTo geht nun nicht mehr und es kommt bei Eingabe eines Wortes ohne Übereinstimung der Fehler :Laufzeitfehler 2158 sie können die Eigenschaft oder Methode des Steuerelementes nur dann auswerten wenn das Steuerelement den Focus hat.
die Meldung hatte ich vorher auch schonmal, hatte sie aber mit On Error go to abgefangen.
kann man diese Anweisung in dem Fall nicht verwenden?
Member: xpilzx1
xpilzx1 Jul 06, 2010 at 09:59:35 (UTC)
Goto Top
Zitat von @xpilzx1:
wirklich es tut mir leid aber ich hab noch eine frage. dein Code funktioniert soweit bestens, aber das OnErrorGoTo geht nun nicht
mehr und es kommt bei Eingabe eines Wortes ohne Übereinstimung der Fehler :Laufzeitfehler 2158 sie können die
Eigenschaft oder Methode des Steuerelementes nur dann auswerten wenn das Steuerelement den Focus hat.
die Meldung hatte ich vorher auch schonmal, hatte sie aber mit On Error go to abgefangen.
kann man diese Anweisung in dem Fall nicht verwenden?

falscher Alarm, ich habe es ein wenig angepasst und nun geht es auch wieder. der Vollständigkeit halber hier der neue Code:
  1. Public Function PFCT_FILTER(PVAR_SUCHFELD_1 As String, PVAR_FORMFELD_1 As String) As String
  2. Dim AktSteuerelement As Control
  3. Set AktSteuerelement = Screen.ActiveControl
  4. On Error GoTo FEHLER
  5. Call setFormularObjekt
  6. If Nz(AbsForm(PVAR_SUCHFELD_1).Text) <> "" Then
  7. AbsForm.Filter = PVAR_FORMFELD_1 & " Like '" & AbsForm(PVAR_SUCHFELD_1).Text & "*'"
  8. AbsForm.FilterOn = True
  9. Else
  10. AbsForm.FilterOn = False
  11. Exit Function
  12. End If
  13. FEHLER: If AbsForm.RecordsetClone.RecordCount = 0 Then
  14. AbsForm.Filter = ""
  15. AktSteuerelement.SetFocus
  16. AktSteuerelement.SelStart = Len(AbsForm(PVAR_SUCHFELD_1).Text)
  17. MsgBox "Keine Übereinstimung gefunden in " & AktSteuerelement.NAME
  18. Exit Function
  19. End If
  20. AbsForm(PVAR_SUCHFELD_1).SelStart = Len(AbsForm(PVAR_SUCHFELD_1).Text)
  21. End Function