none
VBA-Funktion als Steuerelementinhalt in Bericht verursacht Fehler

    Frage

  • Ich verwende erstmals inh einem Access-Bericht eine VBA-Funktion als Steuerelementinhalt - dies verurschaft einen Fehler.

    Für jeden Datensatz (Auftrag) soll im Bericht eine Liste früherer Aufträge des Kunden aufgelistet werden.

    Diese Liste mit früheren AUfträgen soll alle Aufträge des Kunden mit AUsnahme des aktuellen Auftrags wiedergeben.

    Dazu habe ich eine VBA-Funktion geschrieben, der 2 Parameter übergeben werden: die aktuelle Auftragsnummer und die aktuelle Kundennnummer. Die Funktion liefert einen String zurück.

    So sieht der Steuerelementinhlat aus:

    =AuftragslisteErstellen([Auftragsnummer];[Kunde_Nr])

    Leider taucht im Bericht an dieser Stelle nur #Fehler auf.

    Was mich zusätzlich beunruhigt: Ich habe testweise in der Funktion einen Haltepunkt gesetzt. Dieser wird allerdings nie erreicht.

    ich schätze, MSACcess versucht nicht einmal diese Funktion aufzurufen.

    P.S.: Die Funktion ist einem separaten Modul untergebracht.

    Ändere ich den Steuerlementinhalt auf Modul1.AuftragslisteErstellen... dann ändert sich die Meldung in #Name. DFunktionieren tut's trotzdem nicht.

    Hat jemand eine Idee ?

    Vielleicht ist die Idee mit der VBA-Funktion ja auch unelegant. Aber wie könnte ich mit einem unterbericht arbeiten? Ich müsste im Prinzip über die Kundennummer verknüpfen und mit einem zweiten Parameter (aktuelle Auftragsnummer) eine Abfrage hinkriegen, die alle Aufträge des Kunden ausser dem aktuellen zurückgibt.

    Vielen Dank für Hinweise

    Montag, 7. Mai 2012 15:59

Antworten

  • Hallo NicoNi,

    also, es sollte auch im Bericht funktionieren, hier pro forma Beispielcode, mit dem ich Dein Vorhaben erfolgreich getestet habe:

    Public Function AuftragslisteErstellen(AuftragsNr As Long, Kunde_Nr As Long) As String Dim sql As String Dim rAufträge As Recordset Dim db_aktdb As Database Dim Auftragsliste As String

    Set db_aktdb = CurrentDb sql = "SELECT Aufträge.IDauftrag, Aufträge.Auftrag FROM Aufträge WHERE (((Aufträge.Kunde)=" & Kunde_Nr & ")" _ & " AND ((Aufträge.IDAuftrag)<>" & AuftragsNr & "));" Set rAufträge = db_aktdb.OpenRecordset(sql) rAufträge.MoveFirst Do While rAufträge.EOF = False Auftragsliste = Auftragsliste & " " & rAufträge!Auftrag rAufträge.MoveNext Loop AuftragslisteErstellen = Auftragsliste End Function

    Interessant wäre, ob Du ggf. die abgefragten Werte für Kunde_Nr oder AuftragsNr in der dem Bericht zugrunde liegenden Abfrage nicht oder falsch deklarierst: dann müsstest Du beim Aufruf des Berichtes die Meldung "Parameterwert eingeben" erhalten. Tut's dies...?

    Gruß Giorgio

    • Als Antwort markiert NicoNi Dienstag, 8. Mai 2012 08:21
    Dienstag, 8. Mai 2012 08:20

Alle Antworten

  • NicoNi wrote:
    > ...
    > Für jeden Datensatz (Auftrag) soll im Bericht eine Liste früherer
    > Aufträge des Kunden aufgelistet werden.
    > ...
    > Die Funktion liefert einen String zurück.
    >
    > So sieht der Steuerelementinhlat aus:
    >
    > =AuftragslisteErstellen([Auftragsnummer];[Kunde_Nr])
     
    Zeige mal zumindest die Deklarationszeile der Funktion.
    "Liste" klingt ein bissel verdächtig.
    Welcher Typ von Steuerelement ist das? Ein Textfeld?
     
    > Leider taucht im Bericht an dieser Stelle nur #Fehler auf.
    >
    > Was mich zusätzlich beunruhigt: Ich habe testweise in der Funktion
    > einen Haltepunkt gesetzt. Dieser wird allerdings nie erreicht.
    >
    > ich schätze, MSACcess versucht nicht einmal diese Funktion
    > aufzurufen.
    >
    > P.S.: Die Funktion ist einem separaten Modul untergebracht.
    > ...
     
    Ist sie dort eh als Public deklariert?
    Hast du getestet, ob der Aufruf aus dem Direktfenster und aus einem
    Textfeld in einem Formular klappt?
     
    Welche Acces-Version verwendest du?
     
    --
    Servus
    Karl
    *********
     
     
     
    Montag, 7. Mai 2012 16:12
  • Hallo!

    > =AuftragslisteErstellen([Auftragsnummer];[Kunde_Nr])
    > Leider taucht im Bericht an dieser Stelle nur #Fehler auf.

    Hat das Steuerelement mit diesem Steuerelementinhalt eventuell den Namen "Auftragsnummer" oder "Kunde_Nr"?

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Montag, 7. Mai 2012 18:25
  • VIelen Dank den ersten beiden ANtwortern.

    Die Funktionsdeklaration sieht so aus:

    Public Function AuftragslisteErstellen(AUftragsnr As Long, Kunde_Nr As Long) As String

    Der Code tut definitiv was er soll; er funktioniert an anderer Stelle problemlos.

    Die Geschichte mit identischen Namen für Feld  und Steuerelementnamen kann ich definitiv ausschliessen.

    Immerhin scheint es nicht in erster Linie ein Problem zu sein, daß ich pro Datensatz 1x die Funktion aufrufen will und auch noch den Inhalt von anderen Feldern übergeben werden sollen.

    Montag, 7. Mai 2012 18:39
  • Vielleicht ist die Idee mit der VBA-Funktion ja auch unelegant. Aber wie könnte ich mit einem unterbericht arbeiten? Ich müsste im Prinzip über die Kundennummer verknüpfen und mit einem zweiten Parameter (aktuelle Auftragsnummer) eine Abfrage hinkriegen, die alle Aufträge des Kunden ausser dem aktuellen zurückgibt.

    Hallo NicoNi,

    mir scheint es in der Tat angebracht, Dein Vorhaben eher mit einem Unterbericht zu lösen: in diesem schließt Du (in der zugrundeliegenden Abfrage) einfach den aktuellen Auftrag aus und verknüpfst, wie Du selbst schreibst, über die Kundennummer. Gerade hier liegt m.E. die Stärke der Berichte in MSAccess.

    Oder aber Du legst die Funktion mit entspr. Aufruf in die dem Bericht zugrundeliegende Abfrage und gruppierst (im Bericht) nach der Kundennummer (mit Kopfzeile des Bereiches)

    Gruß

    Giorgio

    Montag, 7. Mai 2012 18:48
  • Hallo NicoNi
     
    On 07.05.2012 22:59, NicoNi wrote:
    > Ich verwende erstmals inh einem Access-Bericht eine VBA-Funktion als
    > Steuerelementinhalt - dies verurschaft einen Fehler.
    >
    > Für jeden Datensatz (Auftrag) soll im Bericht eine Liste früherer
    > Aufträge des Kunden aufgelistet werden.
    >
    > Diese Liste mit früheren AUfträgen soll alle Aufträge des Kunden mit
    > AUsnahme des aktuellen Auftrags wiedergeben.
    >
    > Dazu habe ich eine VBA-Funktion geschrieben, der 2 Parameter übergeben
    > werden: die aktuelle Auftragsnummer und die aktuelle Kundennnummer. Die
    > Funktion liefert einen String zurück.
    >
    > So sieht der Steuerelementinhlat aus:
    >
    > =AuftragslisteErstellen([Auftragsnummer];[Kunde_Nr])
     
    Wo hast Du das Steuerelement platziert? Falls es in einem Bereich ist,
    in dem die beiden Felder nicht vorhanden sind, können diese nicht
    übergeben werden. Wenn also diese Felder im Detailbereich liegen und die
    Liste im Report Fuss kann es durchaus sein, dass eben diese Felder nicht
    im Zugriff sind, weil der Detailsbereich ja bereits gedruckt wurde und
    nicht mehr existiert, um darauf zugreifen zu können.
    Gruss
    Henry
     
    Dienstag, 8. Mai 2012 01:33
  • Der erste Teil des Problems ist gelöst.

    Eigene Dämlichkeit wieder mal. Die Auftragsnummer ist ein long-Wert, ich hatte aber einen String übergeben.

    Nach Änderung tut es!

    Es ergibt sich aber gleich das nächste Problem:

    Die Funktion liefert u.U. einen mehrzeiligen STring zurück. Bislang füge ich als Zeilenumbruch vbCr ein.

    Im Bericht wird aber offenbar trotz RTF-Einstellung anscheinend nicht nach vbCr umgebrochen, sondern nach Breite des Textfeldes.

    Ein Versuch mit vbCrLf hat auch nichts gebracht

    Dienstag, 8. Mai 2012 07:56
  • Hallo NicoNi,

    NicoNi schrieb folgendes:

    Die Funktion liefert u.U. einen mehrzeiligen STring zurück. Bislang füge ich als Zeilenumbruch vbCr ein.

    Im Bericht wird aber offenbar trotz RTF-Einstellung anscheinend nicht nach vbCr umgebrochen, sondern nach Breite des Textfeldes.

    RTF ist in Access ein HTML Feld.
    Denach musst Du für einen Zeilenumbruch "<BR>" verwenden.
    var="Text1" & "<BR>" & "Text2"

    s.a. http://www.donkarl.com?FAQ2.17

    Gruß
    Gunter


    ________________________________________________________
    Access FAQ: http://www.donkarl.com

          http://www.avenius.de - http://www.AccessRibbon.de
    http://www.ribboncreator.de - http://www.ribboncreator2010.de

    Dienstag, 8. Mai 2012 08:02
    Moderator
  • Hallo NicoNi

    NicoNi wrote:

    Es ergibt sich aber gleich das nächste Problem:

    Bitte verwende jeweils einen neuen Thread und schliesse den alten ab, wenn die Frage beantwortet ist. Das erleichtert das Suchen von Antworten für spätere Fragestellende.

    Die Funktion liefert u.U. einen mehrzeiligen STring zurück. Bislang füge
    ich als Zeilenumbruch vbCr ein.

    Im Bericht wird aber offenbar trotz RTF-Einstellung anscheinend nicht
    nach vbCr umgebrochen, sondern nach Breite des Textfeldes.

    Ein Versuch mit vbCrLf hat auch nichts gebracht

    vbCRLF würde was bringen, wenn das Berichtsfeld Nicht-RTF wäre, sondern reiner Text. Bei RTF musst Du HTML Codes einfügen (<br>)

    Gruss
    Henry

    Dienstag, 8. Mai 2012 08:16
  • Hallo NicoNi,

    also, es sollte auch im Bericht funktionieren, hier pro forma Beispielcode, mit dem ich Dein Vorhaben erfolgreich getestet habe:

    Public Function AuftragslisteErstellen(AuftragsNr As Long, Kunde_Nr As Long) As String Dim sql As String Dim rAufträge As Recordset Dim db_aktdb As Database Dim Auftragsliste As String

    Set db_aktdb = CurrentDb sql = "SELECT Aufträge.IDauftrag, Aufträge.Auftrag FROM Aufträge WHERE (((Aufträge.Kunde)=" & Kunde_Nr & ")" _ & " AND ((Aufträge.IDAuftrag)<>" & AuftragsNr & "));" Set rAufträge = db_aktdb.OpenRecordset(sql) rAufträge.MoveFirst Do While rAufträge.EOF = False Auftragsliste = Auftragsliste & " " & rAufträge!Auftrag rAufträge.MoveNext Loop AuftragslisteErstellen = Auftragsliste End Function

    Interessant wäre, ob Du ggf. die abgefragten Werte für Kunde_Nr oder AuftragsNr in der dem Bericht zugrunde liegenden Abfrage nicht oder falsch deklarierst: dann müsstest Du beim Aufruf des Berichtes die Meldung "Parameterwert eingeben" erhalten. Tut's dies...?

    Gruß Giorgio

    • Als Antwort markiert NicoNi Dienstag, 8. Mai 2012 08:21
    Dienstag, 8. Mai 2012 08:20
  • siehe oben. Mein Fehler. Long != String .

    Dienstag, 8. Mai 2012 08:21
  • Hallo NicoNi, hallo Henry,

    da habt Ihr mir dazwischen gefunkt, ich ollte meine (überholte) Antwort jetzt löschen, erhalte aber die Meldung "unerwrteter Fehler".

    Gruß Stefan

    Dienstag, 8. Mai 2012 08:24