Nedenstående er en løsning til export fra Access til Excel, lavet af Nih
Men når jeg bruger nedenstående modul fejler den på:
linien: Set rs = CurrentDb.OpenRecordset(strSQL)
fejl: Too few parameters. Expected <number>. (Error 3061)
This parameter query requires the specified number of parameters, which you didn't supply. Provide the expected number of parameters, and run the query again. In some cases, this message is generated when unknown field names or expressions are interpreted as query parameters. Be sure to enclose field names containing spaces or punctuation with square brackets [ ].
hvordan får jeg rettet i koden, således at den også tillader "null" værdier som nogle gange består af 2-3 spaces.
Det er muligvis fejlen?? eller er der andre forslag til hvorfor den fejler
ps. jeg forsøger at gemme 12 kolonner og 10 rækker
--------------------------------------
Function tilExcell(strSQL As String) On Error GoTo eHandler
Screen.MousePointer = 11
Dim objXlApp As New Excel.Application Dim objXlWrkBook As Excel.Workbook
Set objXlWrkBook = objXlApp.Workbooks.Add
Dim rs As DAO.Recordset Dim i As Integer, j As Integer
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.EOF And rs.BOF Then GoTo ExitHer rs.MoveLast rs.MoveFirst For j = 0 To rs.Fields.Count - 1 objXlWrkBook.Sheets(1).Cells(1, j + 2).Value = rs.Fields(j).Name Next j
For i = 1 To rs.RecordCount For j = 0 To rs.Fields.Count - 1 objXlWrkBook.Sheets(1).Cells(i + 2, j + 2).Value = rs.Fields(j) Next j rs.MoveNext Next i
objXlApp.Visible = True
rs.Close Set rs = Nothing Set objXlWrkBook = Nothing Set objXlApp = Nothing
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Du kalder rutinen med en strSQL = "" og så kan forespørgslen naturligvis ikke åbnes. Du kan eventuelt kontrollere om den forespørgsel der forsøges åbnet overhovedet findes før du forsøger at åbne den.
Det kan også tænkes at du forsøger at åbne et parametriseret recordset og det kan du slet ikke åbne på den måde du forsøger; der skal du bruge en querydef. Kan du åbne forespørgslen manuelt? Og skal du indtaste parametre når du åbner den?
En afart af den forrige fejlmulighed er, at du har lavet en forespørgsel og har indtastet noget forkert i den. Det opfatter Access som en slags parameter. Igen, løsningen er at forsøge at åbne forespørgslen manuelt. Hvis den beder dig taste noget ind du ikke forventer at skulle taste, så er der nok fejl i dit udtræk.
Du skrev at fejlen kommer her Set rs = CurrentDb.OpenRecordset(strSQL) - så burde dine øvrige varible ikke gøre nogen forskel.
Hvis fejlen i stedet kommer her: objXlWrkBook.Sheets(1).Cells(i + 2, j + 2).Value = rs.Fields(j)
så kan du nok løse det ved at ændre til: objXlWrkBook.Sheets(1).Cells(i + 2, j + 2).Value = rs.Fields(j) & ""
En errorhandler der bare laver en resume next ville jeg nok være meget varsom med; fejlmeddelelser er som udgangspunkt ikke bare noget der skal ignoneres. Der skal enten tages højde for dem, eller de skal behandles.
jesperthomsen > Helt ening i dine betragtningen vedr. behandling af errors. Brugeren skriver i sit spørgsmål, at fejlen muligvis skyldes Null-værdier, derfor har jeg foreslået at lave en errorhandler, der sigter netop mod Null-værdier (fejl 94)
Hvis det er fordi excell ikke kan modtage bestemte data fra en access tabel vil en resume next springe disse felter over og de fleste data overført. Det er vel bedre end ingenting.
Mugs->Afgjort en pænere løsning. Det giver en del hopperi under debug, men til gengæld bliver det de 'sande' værdier der bliver overført til arket, hvorimod jeg manipulerer med data.
nih->Ja, det er bedre end ingenting, hvis man ser det i det perspektiv. Men jeg sigter gerne lidt bredere, og en errorhandler der blot smider alle fejl i skraldespanden kan gøre mere skade end gavn. Eksempelvis hvis Excelfilen er ødelagt eller forbindelsen ryger - i så fald går skidtet måske bare ned, med en ødelagt database til følge.
Du løser problemet, men risikerer at rende i nye problemer.
For j = 0 To rs.Fields.Count - 1 if isnull(rs.Fields(j)) then objXlWrkBook.Sheets(1).Cells(i + 2, j + 2).Value = "null" end if if len(rs.Fields(j)) > excellMax then 'gør noget end if Next j
kujo > Prøv at benyutte denne kode. Jeg ved ikke om det hjælper, men den har aldrig fejlet. Forleden brugte jeg den til at smide 29.000 poster fra Access til Excel uden problemer.
Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset("temp", dbOpenTable) Set Obvar = CreateObject("excel.application") Set wkb = Obvar.Workbooks.Add wkb.Worksheets("Ark1").Cells(1, 2).Value = Str$(Rst.Fields![Felt1])
Dim Obvar As Object, wkb As Object, Rst As Recordset Dim i As Integer On Error GoTo Errorhandler DoCmd.SetWarnings False DoCmd.OpenQuery "Forespørgsel1" Me.Refresh Set Rst = DBEngine.Workspaces(0).Databases(0).OpenRecordset("Temp", dbOpenTable) Set Obvar = CreateObject("excel.application") Obvar.Visible = True Set wkb = Obvar.Workbooks.Add wkb.Worksheets("Ark1").Cells(1, 1).Value = "Felt 2" wkb.Worksheets("Ark1").Cells(1, 2).Value = "Felt 1" For i = 2 To Rst.RecordCount + 1 wkb.Worksheets("Ark1").Cells(i, 1).Value = Str$(Rst.Fields![Startdato]) Rst.MoveNext Next wkb.Worksheets("Ark1").UsedRange.Columns.AutoFit Set Obvar = Nothing DoCmd.OpenQuery "slettemp" DoCmd.SetWarnings True Errorhandler: MsgBox Error$
du har før lavet denne, men den fejler på at den ikke kan finde "temp"
Temp er navnet på den tabel, der indeholder data der skal eksporteres. Så vidt jeg husker er Forespørgsel1 en tilføjelsesforespørgsel, der sender udvalgte data til Temp. Forespørgslen slettemp sletter alle poster i Temp-tabellen.
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.