Hej! Hej VIktor! Hej igen! Hej Sofia, Hej Victor! Hej Sofia, Hej! Hej Sofia och tack så jättemycket för hjälpen! Hej! Japp, precis så var det tänkt. Är det möjligt att då göra så att listboxen ständigt uppdateras med de rapportnamn som är lagrade i Access databasen? Hej Victor! Hej Sofia, hej Victor!Att skicka värden från flera kalkylblad i Excel till Access
Om man har ett exceldokument med olika värden spridda över ett antal kalkylblad(ett huvudkalkylblad med sammanfattningar och andra kalkylblad som specificerar närmare vad de olika värdena kommer ifrån), hur skulle man kunna göra så att den informationen sparades i Access exempelvis via en knapptryckning för att sedan vid behov skapa ett excelark från access med data spridda över flera kalkylblad?
Typ om man på kalkylblad 1 har kostanden för en bil och på kalkylblad 2 har kostnaden för motorn och dess delar. Vad man då vill göra är att skicka all ingående data (värdena från alla kalkylblad) till Access för att sedan hämta ut datan igen med samma formatering. Access ska endast vara för lagring, ev. ändringar av värdena ska bara göras i Excel.
Tack på förhand!Sv: Att skicka värden från flera kalkylblad i Excel till Acc
För att få över data till access via en knapptryckning skapar du en knapp i vilkens on_click event du skriver följande kod:
Dim db As Database, strsql, SaveThisValue1, SaveThisValue2, SaveThisValue3
'Exempel på hur du får ut värden från specifika celler.
SaveThisValue1= Worksheets(1).Range("F12")
SaveThisValue2= Worksheets(2).Range("F12")
SaveThisValue3= Worksheets(3).Range("F12")
Set db = OpenDatabase("C:\ViktorsAccess_data.mdb")
'Sätter in datat i access
strsql = "INSERT INTO AktuellTabell(Value1, Value2, Value3)
strsql = strsql + "VALUES ('" + CStr(FileSaveThisValue1+ "', '" + CStr(SaveThisValue2) + "', '" + CStr(SaveThisValue3);"
Application.DisplayAlerts = False
db.Execute strsql
Application.DisplayAlerts = True
Db.close
set db = nothing
.................................................................
Om du inifrån excel vill plocka tillbaka datat från access gör du t.ex.:
Dim db As Database, strsql, SaveThisValue1, SaveThisValue2, SaveThisValue3
Set db = OpenDatabase("C:\ViktorsAccess_data.mdb")
strsql = "SELECT AktuellTabell.* FROM AktuellTabell;"
Set rs = db.openrecordset(strsql)
If not rs .eof
Sheets(1).Range(F12).value = rs!FileSaveThisValue1
Sheets(2).Range(F12).value = rs!FileSaveThisValue2
Sheets(3).Range(F12).value = rs!FileSaveThisValue3
End if
rs.close
set rs = nothing
Db.close
set db = nothing
.....................................................................
Hoppas att det var så du menade!
Mvh,
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
Förstår inte riktigt om du vill skriva koden som behövs för att flytta över datat från access till excel i access eller excel.
I andra svaret har du ju koden om du vill skriva den i excel.
Om du mha av access (t.ex. en knapp) vill öppna exel och flytta över info gör du enligt nedan:
...................................................................
Dim App As Excel.Application
Dim book As Excel.Workbook
Dim sheet As Excel.Worksheet
Dim strsql as string, rs as recordset, db as database
Set App = New Excel.Application
Set book = App.Workbooks.Add(ViktorBilFil.xls)
strsql = "SELECT AktuellTabell.* FROM AktuellTabell;"
Set db = currentdb
Set rs = db.openrecordset(Strsql)
Set sheet = book.Worksheets(1) 'Första bladet i excelfilen
sheet.range("A1").value = rs!Value1
'Fyll på med all data som ska in i detta ark.
Set sheet = book.Worksheets(2) 'Blad 2 i excelfilen
sheet.range("C10").value = rs!Value2
'Fyll på med all data som ska in i detta ark.
rs.close
db.close
App.Visible = True 'Öppnar excel så att användaren ser applikationen
Set App = Nothing
Set sheet = Nothing
Set book = Nothing
...................................................................
Lycka till!
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
och tack för hjälpen.
ärendet gäller att skicka från Excel till Access och sedan tillbaka till Excel.
jag provade din kod men fick den inte att fungera, fick då som hastigast rådet att ändra till nedanstående.
Sub Knapp2_Klicka()
Dim db As Database, strsql, savethisvalue1, savethisvalue2, savethisvalue3
savethisvalue1 = Worksheets("sheet3").Range("e12")
savethisvalue2 = Worksheets("sheet3").Range("e13")
savethisvalue3 = Worksheets("sheet3").Range("e14")
Set db = opendatabase("c:\viktor berglind\test.mdb")
strsql = "insert into tabell1(Value1, Value2, Value3)"
strsql = strsql & " VALUES ('" & savethisvalue1 & "', '" & savethisvalue2 & "', '" & savethisvalue3 & "');"
Application.DisplayAlerts = False
db.Execute strsql
Application.DisplayAlerts = True
db.Close
Set db = Nothing
End Sub
men får då meddelandet "Indexet är utanför intervall", vad kan det tänkas bero på? Om kalkylbladet är namngett, ska man då använda det namnet istället eller spelar det ingen roll. (Jag provade att döpa om men det var ingen skillnad)Sv: Att skicka värden från flera kalkylblad i Excel till Acc
Hoppas att du lyckats lösa detta, om inte; detta meddelandet beror på hur du refererar till worksheeten.
Du ska antingen referera till namnet du gett worksheetet, och då inom situationstecken.
Ex:
savethisvalue1 = Worksheets("Victors första worksheet").Range("E12") 'ger värdet av kolumn E rad 12
Om du inte döpt om worksheetet eller bara väljer att inte referera till det via dess namn så ska du inte använda situationstecken.
Ex på hur du refererar til det första worksheetet:
savethisvalue1 = Worksheets(1).Range("E12")
Detta borde iofs föra dig tillbaka till det du började med. Varför fungerade inte det?
Vad fick du för felmeddelande?
Mvh,
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
jag får då ett felmeddelande som säger:
"Körfel 3127"
Insert into uttrycker innehåller följande okända fältnamn "Value1"
Har tyvärr ingen aning själv om vad det är för fel, jag är tämligen ny på VB kodning (och inser för var dag som går hur anmärkningsvärt mycket jag har kvar att lära!)
Oerhört tacksam för svar, tack på förhand!Sv: Att skicka värden från flera kalkylblad i Excel till Acc
Felmeddelandet påpekar att du inte har någon kolumn i din tabell som heter value1 i din tabell.
Du använder dig av följande sql-sats:
strsql = "INSERT INTO AktuellTabell(Value1, Value2, Value3)
strsql = strsql + "VALUES ('" + CStr(SaveThisValue1+ "', '" + CStr(SaveThisValue2) + "', '" + CStr(SaveThisValue3);"
Det sql-satsen ovan gör är att den stoppar in värdet som finns i variabeln SaveThisValue1 in i Access-tabellen AktuellTabell och in i en kolumn som heter Value1.
Den stoppar in SaveThisValue2 i samma tabell men i kolumnen Value2, osv.
Om kolumnerna i din tabell i access heter annorlunda (vilket jag antar?) så måste du alltså byta ut Value1, Value2, Value3, osv till de riktiga namnen på kolumnerna i din tabell.
Hoppas det går bättre, hör gärna av dig annars!
Mvh,
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
Nu fungerar det som det var tänkt!
Borde naturligtvis själv ha tänkt på att döpa om kolumnerna...
Jag har dock ett litet följdproblem som jag inte tänkte på att nämna i tidigare sammanhang.
I det Excelark man sparar värden ifrån är utgör en slags rapportmall,
vilket innebär att nya värden kommer att matas in allteftersom.
För att slippa behöva radera föregående värden vore det ju sunt att ha Excelarket som en template.
Men om vi antar att man via samma template vill hämta datan från en specifik rapport, hur skulle man då kunna göra?
Säg att jag i mitt Excelark skapar en rapport och döper den till Rapport1, och sparar undan värdena i Access.
Om jag sedan har skapt ett antal olika rapporter, finns då någon smidig variant att använda för att kunna 'ladda' tillbaka alla värden från en specifik rapport?
Alltså att man skulle kunna välja exempelvis rapport10 via ett formulär från exempelvis en rullmeny i Excel och man då hämtar värdena från den rapporten från Access?
Återigen, tack för hjälpen!
Mvh,
ViktorSv: Att skicka värden från flera kalkylblad i Excel till Acc
Du kan ju lösa det på så sätt att du varje gång du sparar en rapport också sparar undan rapportnamnet i accessdatabasen tillsammans med alla andra värden i rapporten.
Vidare kan du då alltså i excel ha en listbox där alla rapporternas namn syns.
När man valt en rapport kan man kanske klicka på en knapp för att anropa funktionen excelarket med värden från vald rapport.
Är det något liknande du tänkt dig?
Mvh,
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
Mvh,
Viktor Sv: Att skicka värden från flera kalkylblad i Excel till Acc
Personligen tycker jag att det hade blivit snyggare att vända på steken och öppna upp excel med rätt rapport (eller tom mall) inifrån access.
Men om du inte tänkt bygga någon funktionalitet där så kan du lösa det enligt följande förslag. Jag är ingen expert på just excel och det går kanske att göra en snyggare lösning men detta fungerar i alla fall.
Man skulle behöva en knapp som användaren klickar på om han vill hämta upp befintliga rapportnamn. En klickning på denna knapp fyller comboboxen med rapportnamnen.
Sen är det så, att en combobox i excel hämtar sina värden från celler i excel. Du skulle alltså i såna fall vid klickning på ovanstående knapp först få skapa ett recordset innehållande alla rapportnamnen och smidigast är att sedan göra en loop och loopa ut dem i celler i excel.
Ex:
Dim i, rs as dao.recordset, db as dao.database, strsql
Set db = DBEngine.OpenDatabase("C:\Victors_data.mdb")
strsql = "SELECT Tabell1.Rapportnamn FROM Tabell1;" ' Om fältet i tabellen heter rapportnamn
Set rs = db.openrecordset(strsql)
If not rs.eof
i = 0
Do until rs.eof
i = i+1 'Flyttar ner till nästa rad
Worksheets(1).Range("A" & i & "")= rs!Rapportnamn ' Om fältet i tabellen heter rapportnamn
Loop
Om du vill dölja raden med namnen i gör du det med:
Worksheets(1).Columns("A").Hidden = True
ComboBox1.ListFillRange = "A1:A" & i "" 'Fyller comboboxen med de nyss utplacerade värdena.
Else 'Det fanns inga rapporter att hämta
MsgBox "Det fanns inga rapporter att hämta!"
End if
När användaren sen i comboboxen valt vilken rapport han/hon vill se, klickar de på en annan knapp för att hämta rapporten. Då får du göra på samma sätt där, via en sql-sats stoppa in allt data du ska ha i ett recordset och fördela ut det i de rätta cellerna.
Du måste ju också på något sätt fånga upp vad användaren vill döpa rapporten till så att du kan stoppa tillbaka det värdet i access.
Du kan ju till exempel ha en "spara-knapp" istället för att användaren går via vanliga menyn för att spara. Då kan användaren istället få upp en messagebox där han fyller i vad han vill kalla rapporten.
Du sparar filen via följande kod, där variabeln File innehåller rapportnamnet användaren angett.
Me.SaveAs "C:\" & File
Workbooks(File).Close
Hoppas det går bra och att du förstår hur jag menar, annars får du fråga igen!
Mvh,
SofiaSv: Att skicka värden från flera kalkylblad i Excel till Acc
tänkte bara sticka emellan med en kort fråga, jag skulle vilja skicka värden till olika tabeller och prövade genom att komplettera med nedanstående där jag lade till ett insert into uttryck. value 1 ska alltså till tabell 1 och value2 ska till tabell2
Dim db As Database, strsql, savethisvalue1, savethisvalue2
savethisvalue1 = Worksheets(1).Range("e12")
savethisvalue2 = Worksheets(2).Range("e13")
Set db = opendatabase("c:\viktor berglind\test.mdb")
strsql = "insert into tabell1(Value1)"
strsql = strsql & " VALUES ('" & Value1 & "');"
'Tabell 2
strsql = "insert into tabell2(Value2)"
strsql = strsql & " VALUES ('" & Value2 & "');"
Application.DisplayAlerts = False
db.Execute strsql
Application.DisplayAlerts = True
db.Close
Set db = Nothing
End Sub
Det som händer är att värde 2 hamnar rätt men värde1 läggs inte in alls. Inga felmeddelanden eller något annat som skulle indikera att något var fel...Vad gör jag för fel??
Tack för den utförliga beskrivningen, att 'vända på steken' vore kanske inte så dumt. Det gav mig lite att tänka på. Jag får lov att återkomma!
Mvh,
Viktor BerglindSv: Att skicka värden från flera kalkylblad i Excel till Acc
Du måste ta lägga in följande kod även efter första sql-satsen:
db.Execute strsql
Den kör det som ligger i strsql just nu, vilket i din kod är sql-satsen som stoppar in value2.
Lägg alltså bara till en extra execute efter första sqlsatsen så ska det funka bra!
Mvh,
Sofia