• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

VBA Frage Teil 2000

  • Ersteller Gelöschtes Mitglied 683020
  • Erstellt am

Gelöschtes Mitglied 683020

Guest
Hallo,

wieder mal das alte Problem. Likes und Tierbilder inklusive. :8 [:


Momentan will ich via VBA und SQL eine simple Abfrage aus einer Access-Tabelle in ein Formulartextfeld einfügen. Die Abfrage habe ich in Access zusammengestöpselt und mir anschließend den SQL-Text herauskopiert. Die Datengrundlage (Tabelle) enthält dutzende Einträge zu einem Kunden, auslesen will ich nur den letzten Eintrag wählen; konkret eine Emailadresse auslesen. Das wars. Mein zusammengestöpselter VBA-Code sieht so aus:




Code:
Private Sub Befehl19_Click()

 

 

Set db = CurrentDb

 

 

Dim BANID As String

 

 

 

BANID = InputBox("Welche BAN-ID?")

 

 

Dim SQL9 As String

 

 

Dim SQLAbfrage9 As DAO.Recordset

 

 

Dim W9 As String

 

 

SQL9 = "SELECT First(tblQS.EmailHV) AS LetzterWertvonEmailHV " & _

"From tblQS " & _

"GROUP BY tblQS.BAN " & _

"HAVING (((tblQS.BAN)=" & BANID & "));"

 

 

 

Set SQLAbfrage9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)

If SQLAbfrage9.RecordCount > 0 Then

    W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0)

    Else

    W9 = 0

    End If

 

MsgBox(W9)

 

 

 

 

End Sub

 
Die MsgBox ist momentan nur zum Test drin. Funktioniert auch meistens. Allerdings kommt unregelmäßig der Fehler "unzulässige verwendung von Null". Access zu und wieder auf hilft nur bedingt.

Ideen?
 
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.339
Reaktionen
1.793
Ort
St. Gallen
Wenn du einen breakpoint im vba editor setzt und dann zur Laufzeit durch den code gehst, wo steigt er aus?
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.339
Reaktionen
1.793
Ort
St. Gallen
Eine der beiden Referenzen unter OpenRecordset wird wohl unter bestimmten Umständen Null sein.
Du kannst beim debuggen über die Objekte hovern und zur Laufzeit deren Wert anschauen.
 
Mitglied seit
23.05.2014
Beiträge
88
Reaktionen
0
Du meinst exakt bei der Zeile

"Set SQLAbfrage9 =".....

passiert der Fehler!? Das wäre unlogisch. Was bedeutet "unregelmäßig" in diesem Contect? Wenn du den Code X mal auführst und immer die gleichen Eingaben machst dann klappts meistens, nur manchmal nicht?

Grauenvoller Code btw...

Edit:
Ich hab ne Vermutung

Versuch mal statt

W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0)

folgendes

W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0) & vbNullString

Und wieso weißt du der Variable W9 die du als String deklarierst im Else Zweig einen Integer Wert zu ?! Und wieso setzt du die Objekte am Ende nicht nothing? Und wieso verwendest du viel zu viele Klammern? und und und :-)

Und wieso öffnest du eigentlich das Recordset ein zweites mal!?!?!!?
 
Zuletzt bearbeitet:

Gelöschtes Mitglied 683020

Guest
Eine der beiden Referenzen unter OpenRecordset wird wohl unter bestimmten Umständen Null sein.
Du kannst beim debuggen über die Objekte hovern und zur Laufzeit deren Wert anschauen.



Du meinst exakt bei der Zeile

"Set SQLAbfrage9 =".....

passiert der Fehler!? Das wäre unlogisch. Was bedeutet "unregelmäßig" in diesem Contect? Wenn du den Code X mal auführst und immer die gleichen Eingaben machst dann klappts meistens, nur manchmal nicht?

Exakt. Fehler tritt bei jedem x-ten mal auf. Wann verstehe ich kein bischen, da er bei den gleichen Werten auftreten kann, aber nicht muss. Die Wahrscheinlichkeit für den Fehler liegt gefühlt bei 2%. Ist dennoch sehr ärgerlich, weil:

Grauenvoller Code btw...

Edit:
Ich hab ne Vermutung

Versuch mal statt

W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0)

folgendes

W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0) & vbNullString

Und wieso weißt du der Variable W9 die du als String deklarierst im Else Zweig einen Integer Wert zu ?! Und wieso setzt du die Objekte am Ende nicht nothing? Und wieso verwendest du viel zu viele Klammern? und und und :-)

Und wieso öffnest du eigentlich das Recordset ein zweites mal!?!?!!?

Das ist nur der Bereich, der mir wirklich Probleme bereitet. Um weiter auszuholen (kp ob es hilfreich ist):

Ich muss auf der Arbeit aus mehreren Tabellen diverse Werte auslesen und in eine standardisierte E-Mail einfügen. Generell sollte es so ablaufen, dass meine Kollegen einen Knopf drücken können und diese Werte direkt an die passende Stelle der Mail eingefügt werden. Dank paratas, dem Internet und co. funktioniert schonmal die E-Mail und standardisierte Textbausteine.

Weiterhin: Ich hatte eine 1-Tages-Crashkursh-Schulung in VBA, davor hab ich damit noch nie irgendwas gemacht. Gleiches gilt für (MS)-SQL. Mein "Wissen" basiert auf Try-Fail-Repeat, sowie den Suchen, die unsere interne Firewall zulässt (kaum was). Ich traue mir zwar zu, dass ich relativ einfache Access-Abfragen als SQL schreiben könnte (dann auch in einer VBA-Zeile), allerdings ist meine Zeit auf ca. 30 Minuten pro/Tag für so was limitiert. Daher habe ich mir den SQL-Code aus der Abfrage Access' herauskopiert und in VBA eingefügt. Erschien mir am pragmatischten.

Zurück zur String/Integer-Frage: Mit Zahlenwerten funktioniert oben genanntes Script ohne Probleme, auch wenn es total hässlich ist; hier wären die WX-Variablen auch Integers. Da die Mail-Adresse jedoch ein String ist, sollte statt


Else

W9 = 0

End If

das hier

Else
W9 = Inputbox("noch keine Mail hinterlegt. Bitte E-Mail eintragen")
End If

stehen.

Generell hatte ich hier das erste Problem, da die Abfrage theoretisch leer sein kann, zB. wenn der Kunde noch nicht hinterlegt wurde, oder noch nie eine Mail an den rausging.

(Falls es noch nicht klar wurde, ich habe bisher nur oben zitierten Baustein aus dem Skript geholt, um irgendwie zu testen, wie ich es hinkriege.)

Dank für die Hinweise, werde wohl Montag mal damit rumprobieren!

Tierbilderdump im Spoiler, dieses Mal von der Hundebetreuung meiner Nachbarn.

img-20160708-wa00003fscp.jpg


img-20160824-wa00026ysg2.jpg


img-20160909-wa0000h4sg2.jpg
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.339
Reaktionen
1.793
Ort
St. Gallen
Was mir gerade noch so einfällt - kannst Du deine Verbindung zur Datenbank am Ende auch sachgemäß schließen mit .close o.ä.?
Ich könnte mir vorstellen, dass der client in der Regel versucht eine offene Verbindung zu nutzen, welche ja nur im sleep state verweilen sollte. ;)
 
Mitglied seit
23.05.2014
Beiträge
88
Reaktionen
0
VBA ist ja zum Glück relativ einfach aufgebaut, und auch für "Nicht-Coder" relativ gut zu "lesen".
Dass man einer String Variable einen Integer zuweisen kann ist schon klar, ich würds dennoch nicht machen. x="5" statt x=5 reicht hier bei VB schon aus. Weiters solltest du dir IMMER angewöhnen deklarierte Objekte wie zb das Recordset nach deren Verwendung zu schließen und dann zu vernichten.

oRS.Close
set RS = nothing


Weiters solltest du zu einer DB/Query nicht zwei Recordsets gleichzeitig öffnen wie in deinem Beispiel. Öffnen, alle benötigten Lesevorgänge durchführen, schließen, clearen.

Such einfach nach ein paar Codebespielen zu Recordsets, die meisten Beispiele sind sauber(er) dargestellt. Dann einfach nachbauen.

Ich vermute wenn du den Sauhaufen an nicht geschlossenen und doppelt geöffneten Objekten löst dann wirst du auch diese b eschriebenen Fehler nicht mehr kriegen.
 

Gelöschtes Mitglied 683020

Guest
Ok, danke für die Antworten, macht Sinn. Ich betone nochmals, dass ich prinzipiell zu wenig Ahnung von der Materie habe. Meine Schulung war leider nur auf Excel ausgelegt, und sehr viel mehr als MsgBoxen kamen kaum dran :ugly:.

Um es nochmal kurz zu skizzieren, anfangs sah der Testcode in etwa so aus: (aus dem Kopf, bin nicht auf der Arbeit)



Private Sub Befehl19_Click()



Set db = CurrentDb



Dim BANID As String
BANID = InputBox("Welche BAN-ID?")


Dim SQL9 As String
Dim W9 As String





SQL9 = "SELECT First(tblQS.EmailHV) AS LetzterWertvonEmailHV " & _
"From tblQS " & _
"GROUP BY tblQS.BAN " & _
"HAVING (((tblQS.BAN)=" & BANID & "));"


W9 = CurrentDb.OpenRecordset(SQL9, dbOpenSnapshot)(0)

Me!Mail = W9 (oder so ähnlich kp mehr)

zerstören der variablen etc
End Sub

Problem: Wenn die Abfrage leer ist, weil nicht vorhanden, dann bricht das Skript ab. Über 100 verschiedenes Rumprobieren kam das oben früher oder später raus, was auch so halbwegs geht. Kann ich auch völlig falsch angegangen sein.

edit

14184352_109427223394flj7v.jpg
 
Zuletzt bearbeitet von einem Moderator:
Oben