Announcement

Collapse
No announcement yet.

Probleme mit Unload Userform

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Unload Userform

    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

  • #2
    hab nochmal etwas rumprobiert....und mal nen einfachens kurzes makro geschrieben

    einfach ne userform mit nem textfeld und einem button unddann irgendeine schleife...

    Private Sub CommandButton1_Click()


    Dim a

    a = TextBox1.Value

    Select Case a
    Case 1 To 5
    MsgBox ("zu klein")
    Me.Hide
    Me.Show
    Case 6 To 10
    MsgBox ("gross")
    End Select

    Unload Me

    End Sub

    das ist quqasi genau mein Problem in klein. vllt eher zu verstehen, als beim quellcode oben. wenn man jetzt das ganze mal schritt für schritt durchlaufen läßt(F8) sieht man, dass bei vorheriger eingabe einer kleinen zahl (1-5) und dann einer grossen zahl, das makro nach end sub nochmal zu end select springt.

    hmm....wie lässt sich das verhindern.....grübel, grübel, grübel......

    gruss kasu

    Comment

    Working...
    X