Hallo,
Zerbeche mir schon seit einiger Zeit den Kopf undkomm einfach nicht weiter.....
Zuerst mal eine kurze Beschreibung des Makros:
ich habe eine sql Datenbank, aus der mittels vba Datensätze ausgelesen werden sollen und auf ein Excelblatt kopiert werden. Es handelt sich dabei um Geräte daten zu bestimmten Seriennummern. Das funzt soweit auch alles prima.
Auf die Daten wird zugegriffen, indem ich über eine USERFORM (Sunny_Auswahl) eine Seriennummer(SN) eingebe, über die dann die DB abgefragt wird.
Alles klappt soweit ganz gut, und ich wollte "nur noch ein paar KLEINIGKEITEN" hinzufügen:
1. um sicherzugehen, dass auch etwas in das Textfeld geschrieben wird (also dass auch eine SN eingegeben ist)
2. um sicherzugehen, dass die eingegeben SN auch in der DB existiert.
Gebe ich zu anfang gleich eine SN ein, die in der DB ist, klappt alles. Gebe ich eine falsche oder keine SN ein, kommt eine MsgBox und ich kann meine Eingabe korregieren. Soweit auch i.O. wenn ich danach allerdings eine korrekte SN eingebe nimmt das Unheil seinen LAUF.......
das Makro wird durchlaufen und als letzten Befehl habe ich "unload me" also Userform beenden. Anstatt dies aber zu tun, springt das Makro wieder nach oben...in diesem Fall zum "End If" und läuft dort wieder weiter. Es liegt auchnicht an der If-Schleife, da sich das Ganze auch bei select Case oder Do Until so verhält. Es scheint mir, als würde das Makro jedes mal wieder bei "Me.Show" einhaken..... ABER WAAAAAARUUUUUUM????????????
habe mal meinen Quellcode angefügt, vllt wird ja einer von Euch schlau daraus.....
Option Explicit
Public Sub blabla_oeffnen_Click()
Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Dim con_blatt As ADODB.Connection
Dim rec_blatt As ADODB.Recordset
Dim connectionstring As String
Dim sqldata As String
Dim i As Long
Dim anz_blatt ' Datensatz der Anzahl der Blätter
Dim blattanzahl ' wieviele Blätter erstellt werden sollen
Dim name_blatt ' darin wird der clockstamp geschrieben, der dann
' auch als Tabellenname verwendet wird
Dim anz_blatt2
Dim regid
Dim blattname
Dim blatt ' das wievielte Tabellenblatt
Dim daten_blatt ' Daten pro Zeitstempel/Auslesevorgang
Dim pruef_vorhanden ' Überprüft ob SN in DB enthalten ist
Dim pruef_anzahl ' enthält anzahl der SN
Dim sn
Application.DisplayAlerts = False 'Warnungen ausgeschaltet
' Erstmal alles BLANKO machen
Call Loeschen
' gesuchte Seriennummer in "sn" schreiben
'If txt_sn.Value = "" Then
'
'MsgBox ("Bitte geben Sie die gesuchte Seriennummer ein!")
'
'Me.Hide
'Sunny_Auswahl.Show
'Else
'End If
'Select Case txt_sn.Value
'Case ""
'MsgBox ("*****")
'Me.Hide
'Me.Show
'End Select
Do Until txt_sn.Value <> ""
MsgBox ("****")
Me.Hide
Me.Show ' HIERHIN SPRINGT DAS MAKRO IMMER WIEDER ZURÜCK...NACH END SUB!!!!!
Loop
sn = txt_sn.Value
' Verbindungseinstellungen angeben
connectionstring = "Provider=SQLOLEDB;Data Source=DANIELA-Lapi;Database=sunnydb;User Id=sunnyuser;Password=sunnyuser;"
' verbindung kopieren (Instanz bilden), VerbEinstellungen zuweisen, Verb öffnen
Set con = New ADODB.Connection
con.connectionstring = connectionstring
con.Open
Set con_blatt = New ADODB.Connection
con_blatt.connectionstring = connectionstring
con_blatt.Open
' Datensatz kopieren und akt Verbindung zuweisen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
Set rec_blatt = New ADODB.Recordset
Set rec_blatt.ActiveConnection = con_blatt
' Überprüfung der DB auf gesuchte SN
pruef_vorhanden = "SELECT count (serialNumber) From registration_view where serialNumber=" & Me.txt_sn
rec.Open pruef_vorhanden, con, adOpenDynamic, adLockOptimistic
'pruef_anzahl = pruef_vorhanden
' Überprüft, ob die SN in der DB enthalten ist
ActiveCell.CopyFromRecordset rec
pruef_anzahl = ActiveCell.Value
If pruef_anzahl = 0 Then
MsgBox ("Die gesuchte Seriennummer ist in der Datenbank nicht vorhanden!")
Me.Hide
Sunny_Auswahl.Show
Else
End If
' Verbindung wird eneuert
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' Anzahl der verschiedenen Auslesevorgänge aus der SQL-DB auslesen, über Registration ID
anz_blatt = "SELECT count (DISTINCT registrationID) From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen ....
' Source = welche Daten angezeigt werden sollen
' Verbindung = con
' Cursortype = welche Bewegeungen möglich sind, hier: flexibelster C., alle Bew möglich
' Locktyp = Sicherheitsstufe, hier: Daten werden erst bei Update gesperrt.
rec.Open anz_blatt, con, adOpenDynamic, adLockOptimistic
' Wert (Anzahl der Auslesevorgänge) in aktive Zelle kopieren
' und in die Variable "anzahl" schreiben
ActiveCell.CopyFromRecordset rec
blattanzahl = ActiveCell.Value
' Jeweilige Anzahl an Tabellenblättern hinzufügen
Do Until blattanzahl = 1
Sheets.Add After:=Sheets(1)
blattanzahl = blattanzahl - 1
Loop
' Tabellenblatt 1 aktivieren
Worksheets(1).Activate
' Verbindung neu setzen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' die Verschiedenen RegistratonID´s auswählen
anz_blatt2 = "SELECT DISTINCT registrationID From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen ....
rec.Open anz_blatt2, con, adOpenDynamic, adLockOptimistic
blatt = 1
' Solange durchlaufen bis letzter Datensatz erreicht ist (End of Fields)
Do Until rec.EOF
' Variable regid die Werte der Verbindung(rec) von registrationID zuweisen
regid = rec!registrationID
Worksheets(blatt).Activate
' Neue Verbindung zur DB aufbauen
Set rec_blatt = New ADODB.Recordset
Set rec_blatt.ActiveConnection = con_blatt
' Sämtliche Daten zur angegeben SN und der jeweiligen RegistrationID (regid) auswählen
daten_blatt = "SELECT * From registration_view where serialNumber=" & Me.txt_sn & "and registrationID=" & regid
' Datensatz öffnen
rec_blatt.Open daten_blatt, con_blatt, adOpenDynamic, adLockOptimistic
' Feldnamen kopieren
For i = 0 To rec_blatt.Fields.Count - 1
Cells(1, i + 1).Value = rec_blatt.Fields(i).Name
Next
' Daten in Zellen kopieren
Range("A2").CopyFromRecordset rec_blatt
' Nächstes Blatt und einen Datensatz weiterspringen
blatt = blatt + 1
rec.MoveNext
Loop
' Neuen Datensatz kopieren und akt Verbindung zuweisen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' Die verschiedenen Auslesevorgänge aus der SQL-DB auslesen (die unterschiedlichen Zeitstempel)
name_blatt = "SELECT DISTINCT clockstamp From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen
rec.Open name_blatt, con, adOpenDynamic, adLockOptimistic
' das 1. Tabellenblatt soll umbenannt werden ... zählt dann weiter
blatt = 1
' bis zum Ende der Auslesevorgänge
Do Until rec.EOF
Worksheets(blatt).Activate
blattname = rec!clockstamp
blattname = Replace(blattname, ":", ";")
' Umbenennen des TabBlattes und weiterzählen zum Nächsten, dann springts einen Auslesevorgang weiter
Worksheets(blatt).Name = blattname
'Nächstes Blatt
blatt = blatt + 1
rec.MoveNext
Loop
' Datensatz und Verbindungen schliessen
rec.Close
con.Close
Set rec = Nothing
Set con = Nothing
rec_blatt.Close
con_blatt.Close
Set rec_blatt = Nothing
Set con_blatt = Nothing
' Jeweils Zelle A1 markieren
Call A1select
' Userform ausblenden
Unload Me
End Sub
...wäre für Eure Hilfe echt dankbar.......
gruss kasu
Zerbeche mir schon seit einiger Zeit den Kopf undkomm einfach nicht weiter.....
Zuerst mal eine kurze Beschreibung des Makros:
ich habe eine sql Datenbank, aus der mittels vba Datensätze ausgelesen werden sollen und auf ein Excelblatt kopiert werden. Es handelt sich dabei um Geräte daten zu bestimmten Seriennummern. Das funzt soweit auch alles prima.
Auf die Daten wird zugegriffen, indem ich über eine USERFORM (Sunny_Auswahl) eine Seriennummer(SN) eingebe, über die dann die DB abgefragt wird.
Alles klappt soweit ganz gut, und ich wollte "nur noch ein paar KLEINIGKEITEN" hinzufügen:
1. um sicherzugehen, dass auch etwas in das Textfeld geschrieben wird (also dass auch eine SN eingegeben ist)
2. um sicherzugehen, dass die eingegeben SN auch in der DB existiert.
Gebe ich zu anfang gleich eine SN ein, die in der DB ist, klappt alles. Gebe ich eine falsche oder keine SN ein, kommt eine MsgBox und ich kann meine Eingabe korregieren. Soweit auch i.O. wenn ich danach allerdings eine korrekte SN eingebe nimmt das Unheil seinen LAUF.......
das Makro wird durchlaufen und als letzten Befehl habe ich "unload me" also Userform beenden. Anstatt dies aber zu tun, springt das Makro wieder nach oben...in diesem Fall zum "End If" und läuft dort wieder weiter. Es liegt auchnicht an der If-Schleife, da sich das Ganze auch bei select Case oder Do Until so verhält. Es scheint mir, als würde das Makro jedes mal wieder bei "Me.Show" einhaken..... ABER WAAAAAARUUUUUUM????????????
habe mal meinen Quellcode angefügt, vllt wird ja einer von Euch schlau daraus.....
Option Explicit
Public Sub blabla_oeffnen_Click()
Dim con As ADODB.Connection
Dim rec As ADODB.Recordset
Dim con_blatt As ADODB.Connection
Dim rec_blatt As ADODB.Recordset
Dim connectionstring As String
Dim sqldata As String
Dim i As Long
Dim anz_blatt ' Datensatz der Anzahl der Blätter
Dim blattanzahl ' wieviele Blätter erstellt werden sollen
Dim name_blatt ' darin wird der clockstamp geschrieben, der dann
' auch als Tabellenname verwendet wird
Dim anz_blatt2
Dim regid
Dim blattname
Dim blatt ' das wievielte Tabellenblatt
Dim daten_blatt ' Daten pro Zeitstempel/Auslesevorgang
Dim pruef_vorhanden ' Überprüft ob SN in DB enthalten ist
Dim pruef_anzahl ' enthält anzahl der SN
Dim sn
Application.DisplayAlerts = False 'Warnungen ausgeschaltet
' Erstmal alles BLANKO machen
Call Loeschen
' gesuchte Seriennummer in "sn" schreiben
'If txt_sn.Value = "" Then
'
'MsgBox ("Bitte geben Sie die gesuchte Seriennummer ein!")
'
'Me.Hide
'Sunny_Auswahl.Show
'Else
'End If
'Select Case txt_sn.Value
'Case ""
'MsgBox ("*****")
'Me.Hide
'Me.Show
'End Select
Do Until txt_sn.Value <> ""
MsgBox ("****")
Me.Hide
Me.Show ' HIERHIN SPRINGT DAS MAKRO IMMER WIEDER ZURÜCK...NACH END SUB!!!!!
Loop
sn = txt_sn.Value
' Verbindungseinstellungen angeben
connectionstring = "Provider=SQLOLEDB;Data Source=DANIELA-Lapi;Database=sunnydb;User Id=sunnyuser;Password=sunnyuser;"
' verbindung kopieren (Instanz bilden), VerbEinstellungen zuweisen, Verb öffnen
Set con = New ADODB.Connection
con.connectionstring = connectionstring
con.Open
Set con_blatt = New ADODB.Connection
con_blatt.connectionstring = connectionstring
con_blatt.Open
' Datensatz kopieren und akt Verbindung zuweisen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
Set rec_blatt = New ADODB.Recordset
Set rec_blatt.ActiveConnection = con_blatt
' Überprüfung der DB auf gesuchte SN
pruef_vorhanden = "SELECT count (serialNumber) From registration_view where serialNumber=" & Me.txt_sn
rec.Open pruef_vorhanden, con, adOpenDynamic, adLockOptimistic
'pruef_anzahl = pruef_vorhanden
' Überprüft, ob die SN in der DB enthalten ist
ActiveCell.CopyFromRecordset rec
pruef_anzahl = ActiveCell.Value
If pruef_anzahl = 0 Then
MsgBox ("Die gesuchte Seriennummer ist in der Datenbank nicht vorhanden!")
Me.Hide
Sunny_Auswahl.Show
Else
End If
' Verbindung wird eneuert
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' Anzahl der verschiedenen Auslesevorgänge aus der SQL-DB auslesen, über Registration ID
anz_blatt = "SELECT count (DISTINCT registrationID) From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen ....
' Source = welche Daten angezeigt werden sollen
' Verbindung = con
' Cursortype = welche Bewegeungen möglich sind, hier: flexibelster C., alle Bew möglich
' Locktyp = Sicherheitsstufe, hier: Daten werden erst bei Update gesperrt.
rec.Open anz_blatt, con, adOpenDynamic, adLockOptimistic
' Wert (Anzahl der Auslesevorgänge) in aktive Zelle kopieren
' und in die Variable "anzahl" schreiben
ActiveCell.CopyFromRecordset rec
blattanzahl = ActiveCell.Value
' Jeweilige Anzahl an Tabellenblättern hinzufügen
Do Until blattanzahl = 1
Sheets.Add After:=Sheets(1)
blattanzahl = blattanzahl - 1
Loop
' Tabellenblatt 1 aktivieren
Worksheets(1).Activate
' Verbindung neu setzen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' die Verschiedenen RegistratonID´s auswählen
anz_blatt2 = "SELECT DISTINCT registrationID From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen ....
rec.Open anz_blatt2, con, adOpenDynamic, adLockOptimistic
blatt = 1
' Solange durchlaufen bis letzter Datensatz erreicht ist (End of Fields)
Do Until rec.EOF
' Variable regid die Werte der Verbindung(rec) von registrationID zuweisen
regid = rec!registrationID
Worksheets(blatt).Activate
' Neue Verbindung zur DB aufbauen
Set rec_blatt = New ADODB.Recordset
Set rec_blatt.ActiveConnection = con_blatt
' Sämtliche Daten zur angegeben SN und der jeweiligen RegistrationID (regid) auswählen
daten_blatt = "SELECT * From registration_view where serialNumber=" & Me.txt_sn & "and registrationID=" & regid
' Datensatz öffnen
rec_blatt.Open daten_blatt, con_blatt, adOpenDynamic, adLockOptimistic
' Feldnamen kopieren
For i = 0 To rec_blatt.Fields.Count - 1
Cells(1, i + 1).Value = rec_blatt.Fields(i).Name
Next
' Daten in Zellen kopieren
Range("A2").CopyFromRecordset rec_blatt
' Nächstes Blatt und einen Datensatz weiterspringen
blatt = blatt + 1
rec.MoveNext
Loop
' Neuen Datensatz kopieren und akt Verbindung zuweisen
Set rec = New ADODB.Recordset
Set rec.ActiveConnection = con
' Die verschiedenen Auslesevorgänge aus der SQL-DB auslesen (die unterschiedlichen Zeitstempel)
name_blatt = "SELECT DISTINCT clockstamp From registration_view where serialNumber=" & Me.txt_sn
' Datensatz öffnen
rec.Open name_blatt, con, adOpenDynamic, adLockOptimistic
' das 1. Tabellenblatt soll umbenannt werden ... zählt dann weiter
blatt = 1
' bis zum Ende der Auslesevorgänge
Do Until rec.EOF
Worksheets(blatt).Activate
blattname = rec!clockstamp
blattname = Replace(blattname, ":", ";")
' Umbenennen des TabBlattes und weiterzählen zum Nächsten, dann springts einen Auslesevorgang weiter
Worksheets(blatt).Name = blattname
'Nächstes Blatt
blatt = blatt + 1
rec.MoveNext
Loop
' Datensatz und Verbindungen schliessen
rec.Close
con.Close
Set rec = Nothing
Set con = Nothing
rec_blatt.Close
con_blatt.Close
Set rec_blatt = Nothing
Set con_blatt = Nothing
' Jeweils Zelle A1 markieren
Call A1select
' Userform ausblenden
Unload Me
End Sub
...wäre für Eure Hilfe echt dankbar.......
gruss kasu
Comment