Hej på er! Borde nog gå med: Hej Andreas! Jo förmodligen är det så men frågan är varför datat "hinner" sparas om man stegar igenom men inte om man bara exekverar koden. HEj igen! Det jag gör är att jag stoppar tillbaka datat i access. Du kan ju prova med att använda databasen från Access: Hej! KAn du inte bifoga hela din kod? Hej Andreas! Jag Har lite förslag på förändringar: Hej Andreas! Det är för att göra en kontroll att rätt formulär har focus. Man kan ju öppna ett annat formulär i access innan man trycker på Uppdateringsknappen. Det gör koden lite stabilare. Excel/Access
Jag har en accessapplikation som flyttar över data till excel (i form av en offert).
När användaren mixtrat med rabatter och dylikt så kan han klicka på en knapp i excel som då flyttar över de nya rabattsatserna tillbaka till access.
Det jag skulle vilja är att det då aktiva accessformuläret uppdateras samtidigt som datat förs över.
Hur kan jag i excel få ett formulär i access att uppdatera sig??
Om det ens går??
Tack!
Mvh,
SofiaSv: Excel/Access
<code>
Dim A As Access.Application
Set A = GetObject(, "Access.Application")
A.Screen.ActiveForm.Refresh
</code>
Förutsätter att du i excel har laggt till referens till Microsoft Access.hmmmm
Tack för hjälpen!
Detta var skumt!
Då formulärets recordsource är beroende av värden satta i excel så stoppar jag in dessa värden i dbn.
Sen lägger jag in det aktiva formulärets nya recordsource mha:
A.Screen.ActiveForm.RecordSource = strsql (där sqlstatsen ligger i var strsql)
Och för att uppdatera formuläret en
A.Screen.ActiveForm.Requery
Detta funkar kalas om jag stegar igenom koden, men om jag bara kör så uppdateras accessformuläret till blankt (dvs den hittar inga poster).
Har testat hur mycket som helst - stegar man igenom går den perfekt, kör man rakt på hittar den inget....
Datorerns underbara värld....
Mvh,
SofiaSv: hmmmm
Tack för din hjälp!
/SOfianExcels motsvarighet till VBs UpdateBatch
Kanske en UpdateBatch() vore på sin plats. BAra det att den funktione inte finns i Excel.
Finns det kanske någon motsvarighet?
Mvh,
LisaSv: Excels motsvarighet till VBs UpdateBatch
Och det gör jag genom en sql-sats som jag kör mha db.execute strsql.
Medans jag testat varför det fungerar om man stegar genom koden men inte annars så lade jag in en loop på 10000000 varv som inte gör någonting bara för att få en fördröjning i exekveringen innan formulären ska uppdateras med de nya datat.
Och då funkar det också.
Den "hinner" alltså inte med att uppdatera dbn....
Mvh,
SofiaSv: Excels motsvarighet till VBs UpdateBatch
<code>
Dim A As Access.Application
Dim db as DAO.Database
Set A = GetObject(, "Access.Application")
Set db = A.CurrentDB
db.Execute strSQL
'Gör uppdatering av formuär.
</code>Sv: Excels motsvarighet till VBs UpdateBatch
Det går tyvärr inte då allt måste fångas direkt i ett excel-event.
Mvh,
Sofia.Sv: Excels motsvarighet till VBs UpdateBatch
Så man vet vad det är du gör. Sv: Excels motsvarighet till VBs UpdateBatch
Visst kan jag det, bifogar den delen som problemet berör.
Private Sub CmdSaveOffer_Click()
Dim File, Folder, FSO
Dim trayId As Integer, Discount, datum, customerId As String
Dim db As Database, rs As Recordset, strsql, AnnQuantity
Dim i
Discount = Worksheets(3).Range("F12")
AnnQuantity = Worksheets(3).Range("F11")
trayId = Worksheets(1).Range("C11")
customerId = Worksheets(1).Range("J15")
File = Worksheets(1).Range("C8")
Set db = OpenDatabase("C:\test_data.mdb")
'Nedanstående data måste uppdateras i accessdbn innan accessformuläret uppdateras
strsql = "INSERT INTO Offer(OfferId, TrayId, OfferDate, CreatedDate) VALUES ('" + CStr(File) + "', " + CStr(trayId) + ", '" + CStr(Format(Now(), "yyyy-MM-dd")) + "', '" + CStr(datum) + "');"
Application.DisplayAlerts = False
db.Execute strsql
Application.DisplayAlerts = True
db.Close
Dim A As Access.Application
Set A = GetObject(, "Access.Application")
Set db = OpenDatabase("C:\test_data.mdb")
strsql = "SELECT Tray.Discount, Tray.AnnualQuantity FROM Tray WHERE Tray.TrayId = " + CStr(trayId) + ";"
Set rs = db.OpenRecordset(strsql, dbOpenDynaset)
'Nedanstående data behövs också i accessdb innan formuläret uppdateras
If Not (rs.EOF And rs.BOF) Then
rs.Edit
rs!Discount = Discount * 100
rs!AnnualQuantity = annQuantity
rs.Update
End If
rs.Close
db.Close
' strsql = sqlsats som innehåller det nya datat bland annat
A.Screen.ActiveForm.RecordSource = strsql
'Provat alla nedanstående för säkerhets skull.... :-)
A.Screen.ActiveForm.Requery
A.Screen.ActiveForm.Refresh
A.Screen.ActiveForm.Repaint
'Detta var den koden som berörs av problemet
End Sub
Jag har provat att lägga in doevents och lite loopar här och var men det är instabilt.
Skulle behöva en funktion som kan kolla när uppdateringen av access är gjord.
Mvh,
SofiaSv: Excels motsvarighet till VBs UpdateBatch
<code>
Function SQLText(ByVal Value As String) As String
If Len(Value) Then
SQLText = "'" & Replace(Value, "'", "''") & "'"
Else
SQLText = "Null"
End If
End Function
Private Function GetForm(Forms As Access.Forms, Name As String) As Access.Form
Dim Form As Access.Form
For Each Form In Forms
If Form.Name = Name Then
Set GetForm = Form
Exit For
End If
Next
End Function
Private Sub cmdSaveOffer_Click()
'Dim File, Folder, FSO
Dim db As Database
Dim rs As Recordset
Dim A As Access.Application
Dim frmForm As Access.Form
Dim strSQL As String, customerId As String
Dim AnnQuantity, Discount, datum
Dim trayId As Long, i As Long
Dim FileName As String
On Error GoTo cmdSaveOffer_Click_Err
File = Worksheets(1).Range("C8")
trayId = Worksheets(1).Range("C11")
Discount = Worksheets(3).Range("F12")
customerId = Worksheets(1).Range("J15")
AnnQuantity = Worksheets(3).Range("F11")
FileName = "C:\test_data.mdb"
Set A = GetObject(, "Access.Application")
If A Is Nothong Then
Set db = OpenDatabase(FileName)
Else
Set db = A.CurrentDb
If Right$(db, 13) <> "test_data.mdb" Then
Set db = OpenDatabase(FileName)
End If
End If
'Application.DisplayAlerts = False
'Nedanstående data måste uppdateras i accessdbn innan accessformuläret uppdateras
strSQL = "INSERT INTO Offer(OfferId, TrayId, OfferDate, CreatedDate) VALUES (" & SQLText(File) & ", " & trayId & ", " & SQLText(Format(Date, "yyyy-MM-dd")) & ", " & SQLText(datum) & ");"
db.Execute strSQL, dbFailOnError
'Nedanstående data behövs också i accessdb innan formuläret uppdateras
strSQL = "UPDATE Tray SET Tray.Discount = " & Discount * 100 & ", Tray.AnnualQuantity = " & AnnQuantity & " WHERE Tray.TrayId = " & trayId & ";"
db.Execute strSQL, dbFailOnError
'Application.DisplayAlerts = True
' strsql = sqlsats som innehåller det nya datat bland annat
Set frmForm = GetForm(A.Forms, "Ditt formulärnamn")
If Not frmForm Is Nothing Then
frmForm.RecordSource = "SELECT Tray.Discount, Tray.AnnualQuantity FROM Tray WHERE Tray.TrayId = " & trayId & ";"
End If
cmdSaveOffer_Click_Exit:
Exit Sub
cmdSaveOffer_Click_Err:
Select Case Err.Number
Case 429 ' Access är inte igång.
Resume Next
Case Else
MsgBox Err.Description, vbCritical, Err.Source
End Select
End Sub
</code>
Du får ersätta "Ditt formulärnamn" med namnet på ditt formulär. Exempel: "frmTrayDiscount"Sv: Excels motsvarighet till VBs UpdateBatch
Tyvärr resulterar detta i precis samma problem.
Och jag måste säga att jag förstår inte vad det skulle göra för skillnad att hitta det aktiva formuläret via getForms-funktionen istället för via a.screen.activeForm.Name?
Tack snälla för att du försökte hjälpa till!
Mvh,
SofiaSv: Excels motsvarighet till VBs UpdateBatch
Met GetForm uppdaterar bara formuläret om det är öppet öppet. Oavsett om det har fokus eller inte.