database når ikke at blive opdateret før udlæsning
Jeg har en userform i excel med en listbox hvor i jeg loader indholdet af en database med navne. Hvis jeg dobbelt klikker på et navn loades en ny userform, hvor man kan rette navnet, når der klikkes gem i denne, gemmes det selvfølgelig ned i databasen hvorefter jeg loader indholdet af databasen til listboxen igen, men den tager ikke rettelsen med. Enten skal jeg klikke på et navn igen og blot forlade det igen uden ændringer eller sætte en lang loop ind inden jeg loader listboxen. Excel VB burde vil ikke køre videre i koden før en kommando er færdig, er der evt en måde at finde ud af hvornår databasen er! opdateres?
Her er koden til det. cmdSave_Click() er en commandbutton på en userform. Som når den har gemt ændringer i db kalder refreshowners, men det virker som om db'en ikke er nået og blive opdateret.
Private Sub refreshowners() i = 1 Set Rs = Db.Execute("SELECT * FROM owners ORDER BY name") If Not Rs.BOF Then Do Until Rs.EOF MyArray(i, 0) = Rs("name") MyArray(i, 1) = Rs("id") i = i + 1 Rs.MoveNext Loop End If lstOwner.ColumnWidths = "100;0" MyArray(0, 0) = "Navn" MyArray(0, 1) = "id" lstOwner.List() = MyArray End Sub
Private Sub cmdSave_Click() If Not IsEmpty(id) Then Db.Execute "UPDATE owners SET name = '" & txtName.Value & "', address = '" & txtAddress.Value & "', postal = '" & txtPostal.Value & "', city = '" & txtCity.Value & "', phone = '" & txtPhone.Value & "', mobile = '" & txtMobile.Value & "', email = '" & txtEmail.Value & "' WHERE id = " & id End If Unload Me Call refreshowners End Sub
Disse 2 linier har jeg i starten af hver Sub, hvilket jeg også gerne ville have gjort nemmere så det kun står et sted så man evt kalder en function der åbner databasen.
Set Db = CreateObject("ADODB.Connection") Db.Open = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & ActiveWorkbook.Path & "\allerupgaard.mdb"
Jeg gætter på at problemet er at den userform du åbner, åbnes modal...
Jeg ville lave en generel refreshoowners (i et separat kodemodul) ala
Sub refreshowners() i = 1 Set Rs = Db.Execute("SELECT * FROM owners ORDER BY name") If Not Rs.BOF Then Do Until Rs.EOF MyArray(i, 0) = Rs("name") MyArray(i, 1) = Rs("id") i = i + 1 Rs.MoveNext Loop End If NavnPåFørsteUserForm.lstOwner.ColumnWidths = "100;0" MyArray(0, 0) = "Navn" MyArray(0, 1) = "id" NavnPåFørsteUserForm.lstOwner.List() = MyArray End Sub
hvor NavnPåFørsteUserForm er navnet på den userform der har listen...
Og så flytte "Unload Me" til slutningen af cmdSave_Click-eventen.
prøv lige at sætte et breakpoint i linjen "Call refreshowners".
Mit gæt er at linjen aldrig når at blive udført pga. "unload me"...
Som sagt mener jeg at løsningen er at lave en rutine der refererer den første userform direkte når du opdaterer den, da nummer 2 userform sandsynligvis bliver åbnet modal (dvs. at den skal lukkes før andre forms kan vises/kaldes).
/Jennemaan
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.