23. juli 2001 - 12:05Der er
52 kommentarer og 1 løsning
Eksport til Excel
Så D\'herrer eksperter. så har jeg et MEGA problem der lyder som flg.( nedenstående er et eksempel )
Jeg har 4 queryes der indeholder forskellige data. Der er en kolonne i hver af disse der indeholder et nummer der kan forekomme flere gange. (eks 1,2,3,2,osv)
De 10 første poster i hver af disse queryes ønskes eksporteret til et excelark hvor indholdet er selecteret på nummersystemet.
Sheet 1 skal da indeholde alt der vedrører nummer 1. Måden indholdet af de 4 queryes placeres på i sheet 1 kommer bare fortløbende ( heading skal derfor med også).eks først kommer de 10 første poster fra q1 dernæst de 10 første fra q2 osv.
sheet 2 skal indeholde alt vedr. nummer 2 efter samme princip som sheet 1.
navn på queryes q1 = 0-sale 3mth_gr all q2 = 0-sale 6mth_gr all q3 = all group stock greater 3mth sale q4 = all group stock greater 6mth sale q5 = gr all down
q1+2 kommer fra en anden query der hedder master q3+4+5 kommer fra en anden query der hedder Qmaster
DER SKAL EKSPORTERES FRA DE BENÆVNTE Q1+2+3+4+5 IDET DER LIGGER FORMLER MM TILGRUND FOR DISSE.!!!
grunden til jeg ligeledes stiller spørgsmålet er at der måske kunne laves noget smart fremfor at skulle lave x-antal nye queryes. ( jeg har 127 af disse i forvejen)
Det var lidt af en streg i regningen, at der skal eksporteres fra en Q. Det må jeg tænke lidt over. en mulighed er, ay du ved en opdateringsforespørgsel sender data fra Q til en ny tabel ved en VBA-kommando. Når eksporten til Excel er færdig, kan du tømme denne tabel.
Selve kommandoen til eksporten kommer her:
Dim Obvar As Object, wkb As Object, Rst As Recordset Dim I As Integer Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset(\"TABELNAVN\", dbOpenTable) Set Obvar = CreateObject(\"excel.application\") Obvar.Visible = True Set wkb = Obvar.Workbooks.Add wkb.Worksheets(\"Ark1\").Cells(1, 1).Value = \"KOLONNEOVERSKRIFT\"
For I = 2 To Rst.RecordCount + 1 wkb.Worksheets(\"Ark1\").Cells(I, 1).Value = Str$(Rst.Fields![FELTNAVN])
Rst.MoveNext Next Set Obvar = Nothing wkb.Worksheets(\"Ark1\").UsedRange.Columns.AutoFit
ud fra dette betyder det vel at jeg skal eksportere dataene fra de 5 queryes ind i 5 nye tabeller. så skal jeg bruge dette script til at eksportere til excel. eller???
spørgsmål : 1/skal jeg ikke angive alle mine feltnavne da disse alle skal med ud til excel.?? 2/skal jeg ikke have navngivet excelarket på nogen måde for at sikre at tabel 2+3+4+5 eksporteres til samme excel ark..?? 3/selve sheet navnet hvor defineres dette i dit script eks at sheet 1 hedder \"2\" og sheet 2 hedder \"29\".
2. kolonneoverskrift ser således ud: wkb.Worksheets(\"Ark1\").Cells(1, 2).Value = \"KOLONNEOVERSKRIFT\" hvor du blot ændrer destinationscellen. 3. Kolonneoverskrift vil få destinationen: Cells(1, 3)
På samme måde med data, du ændrer blot destinationen, 2. datafelt ser således ud: wkb.Worksheets(\"Ark1\").Cells(I, 2).Value = Str$(Rst.Fields![FELTNAVN])
Du definerer arket i denne linie: wkb.Worksheets(\"Ark1\").Cells(1, 1).Value = \"KOLONNEOVERSKRIFT\"
spgm2: Vil du eksportere til et andet ark, ændrer du blot (\"Ark1\") til noget andet.
spgm3: I linien: Set Obvar = CreateObject(\"excel.application\") laver vi en ny excel-applikation med ordene CreateObject.
Når du lukker Exccel sletter du filen, for du kan jo altid eksportere igen.
Der er dog ikke noget til hinder for, at du kan eksportere til en navngivet Excel-fil. på den måden kan du gemme Excel og overskrive det igen. Men hvorfor? Vil det ikke blot tage plads op.
Jeg er da glad for at 1 ikke er dit bud!! Jeg skal have hvad du mener det er værd, hvad kan du bruge det til og hvor langt kommer vi mod målet?
Jeg er ansat i Solar Koncernen og var sammen med vores daværende salgsdirektør og i mit daværende job som key account på Lego med til at starte hele projektet op. Fik Egon Hvergel fra Engineering ansat og overlod ham \"opgaven\" da jeg drog til koncernen i kolding.
( ..udsnit af min livshistorie...*G*) Jeg kender et par stykker ved Lego-EDB bla. Kurt Neermann. Jeg tror faktisk du engang hjalp mig med noget access via mail foranlediget af KN.
The last time Solar was mentioned, I remembered that I had helped \"someone\" with an Access database, something to do with a search routine, but couldnt rememeber the name. Small world isnt it?
wkb.Worksheets(\"Ark1\").Cells(1, 1).Value = \"branch nr\" fejlen siger : subscript out of range
hele scriptet ser således ud
Private Sub Form_Open(Cancel As Integer) Dim Obvar As Object, wkb As Object, Rst As Recordset Dim I As Integer Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset(\"top10 down\", dbOpenTable) Set Obvar = CreateObject(\"excel.application\") Obvar.Visible = True Set wkb = Obvar.Workbooks.Add wkb.Worksheets(\"Ark1\").Cells(1, 1).Value = \"branch nr\"
For I = 2 To Rst.RecordCount + 1 wkb.Worksheets(\"Ark1\").Cells(I, 1).Value = Str$(Rst.Fields![branch nr])
Rst.MoveNext Next Set Obvar = Nothing wkb.Worksheets(\"Ark1\").UsedRange.Columns.AutoFit
nu har jeg med megen hjælp fået oprettet en tabel hvor alle poster står i hvordan gemmer jeg denne i excel som beskrevet ovenfor hvor hvert sheet indeholder hver sin [branch nr]
region> I have briefly looked through your original question and I would imagine that all that about putting the data in a temp tables isnt necessary, thats if all you want is to get your informatiion into Excel.
Dim db As Database Dim rs As Recordset Dim sSQL As String Dim MyQry As QueryDef
Set db = CurrentDb
Set rs = db.OpenRecordset(\"tblBranch\")
\'If test.xls exists then delete it....
DoCmd.SetWarnings False
Do While Not rs.EOF
sSQL = \"SELECT TOP 10 [gr all down].* FROM [gr all down] WHERE [gr all down].[branch nr] = \'\" & rs!BranchNr & \"\'\"
\'It would be an idea to loop through the existing queries an delete if it exists (look at the Access app I sent to Solar)
\'Create a new querydef Set MyQry = db.CreateQueryDef(rs!BranchNr) MyQry.SQL = sSQL MyQry.Close
region > når Terry er på banen, plejer jeg at holde min mund. Dette kun for at du skal vide, at jeg ikke blot er stået af. Men dine og Terry\'s sidste par indlæg er \"græsk-katolsk\" for mig.
sorry for not getting back sooner, have to do some work sometime!
region, I have no idea what you put in your tblbranch, is your \"filial\" number in the same field as branchnr? what you could do was have an extra field with type Yes/No named Filial for example. Set this to True if its a filial, and then alter the line Set rs = db.OpenRecordset(\"tblBranch\") to Set rs = db.OpenRecordset(\"SELECT * FROM tblBranch WHERE Filial = False\"). This selects thsoe which are NOT filialer.
OK! I cant see what is happening from here so you will have to help. First add the following three lines to justy before the DoCmd.TransferSpreadsheet line. Then alter the DoCmd.TransferSpreadsheet line so that it contains sBranch and not rs!BranchNr.
Then run the code. to export to Excel. Then press Ctrl+G (to open the debug window. You should be able to see the names of the \"filialer\" that have been exported to Excel. The lines should look something like this. If they dont then I can only assume that your code isnt as it should be. It works here... If for some reason the names of the filialer get named the same then there will only be one faneblade with this name, obviously you cant have the same name more than once. Anyway try it and let me know what happens.
Fil: 2 Fil: 3 Fil: 5 Fil: 7 Fil: 12 Fil: 13
Dim sBranch as string sBranch = \"Fil: \" & rs!BranchNr debug.print sBranch
du må undskylde terry men jeg kan ikke se logikken i det du skriver.... hvorfor skal vi lige pludselig til at DIM noget sBranch..???
der er ikke nogen steder i min DB der står noget med filial eller lign. Jeg var bare kommet til at skrive filial i tksten her på eksperten istedet for branch nr, fordi det danske ord for branch er filial.
I mit excel ark skal de forskellige sheets bare hedde : 2 3 5 osv....
og nej jeg har ikke \"dobbelte\" branch nr i tabellen...
jeg ville dog hellere at vi gjorde noget andet med det exporteren .... ( som jeg skrev var jeg ved at lave en lille ændring)
jeg har en samlet tabel med alle nødvendige oplysninger nu. kan jeg ikke exportere denne til excel med nogle kriterier.
exporten skal gennemse posterne i tblbranch og for hver af disse branchnr skal den eksportere ud i et seperat excelark :
eks.:
såfremt der i tblbranch står :
2 3 5
skal den først gemme et excelark på d-drevet i en ny mappe der hedder test som indeholder alle poster fra tabellen (top10)hvor branchnr = 2
så skal den gå til næste post og gemme et excel ark med alle poster hvor branchnr = 3 i d:\\test\\
osv.
Den ultimative løsning ville være at kunne gemme rapporter som worddokumenter på samme vis som dette eksempel, da jeg i rapporter kan lave et bedre layout.
You want to export each \"Branch\" to a seperate Excel file, and not one sheet per branch in the same file, is that correct?
It isnt possible to perform one DoCmd.TransferSpreadsheet and create a seperate file for each branch, but you can loop through tblBranch as mentioned in the previos examples and create a file for each. But as I was trying to explain in my comment 19:47:03 it seems that something is getting converted incorrectly and hence we arent getting all branches, and if we cant find this then I would assume we will get the same problem when we create a seperate file. But let see if I am right!
replace the DoCmd.TransferSpreadsheet line with DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, rs!BranchNr, \"D:\\test\\Filial_\" & rs!BranchNr, False, \"\"
Public Sub exportRegionToExcel(lngBranch As Long) Dim q As QueryDef Set q = CurrentDb.CreateQueryDef(\"ZZZ_TempExport\", \"SELECT * FROM TOP10 WHERE Branch=\" & lngBranch) DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, \"ZZZ_TempExport\", \"D:\\TEST\\\" & lngBranch & \".xls\", , \"Ark1\" CurrentDb.QueryDefs.Delete \"ZZZ_TempExport\" End Sub
Public Sub test() Dim te As Long For te = 1 To 11 exportRegionToExcel te Next End Sub
proaccess> Thats a good idea, but it seems that region has a number of \"filialer\" and not numbered from 1 to 11. So I have suggested he have a table containing the numbers he is interested in. Then loop through the table creating a sheet per \"filial\". But there is a problem where not all \"filialer\" are getting written to the file. I was trying to locate the problem by suggestion to region that he write each filial nuber to the debug window so HE could see waht was comming out of it!
The line should be DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, rs!BranchNr, \"D:\\test\\Filial_\" & rs!BranchNr & \".xls\", False, \"\"
Terry> I also got into the problem of sheets numbers, that didn\'t match up... It seems to fail on the last parameter og the TransferSpreadsheet, where 1 character is truncated and spaces are being replaced by underscores... default setting for this parameter (as you are using) are this altered recordsetname...
Region> Du behøver ikke at loope gennem 1-11, som jeg gør, brug eventuelt Terrys forslag om en tabel til Branchnumre eller:
Public Sub test() Dim RA as RecordSet Set RA=CurrentDB.OpenRecordset(\"SELECT DISTINCT Branch FROM TOP10;\") While Not RA.EOF exportRegionToExcel RA!Branch RA.MoveNext Wend RA.Close Set RA=Nothing End Sub
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.