Avatar billede kujo Nybegynder
31. marts 2003 - 10:28 Der er 23 kommentarer

Export fra Access til Excel

Hej

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

ExitHer:
   
    Screen.MousePointer = 0
    Exit Function

eHandler:
   
  MsgBox "Der skete en fejl :o("
  Resume ExitHer

End Function
Avatar billede mugs Novice
31. marts 2003 - 11:46 #1
Prøv at rette din errorhandler. Denne fungerer ved Null-værdier, godt nok med en anden kode:

eHandler:
If Err.Number = 94 Then
Resume Next
End If
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 12:17 #2
Jeg ser flere mulige fejlkilder her:

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.
Avatar billede kujo Nybegynder
31. marts 2003 - 13:36 #3
Private Sub Kommandoknap0_Click()
tilExcell CurrentDb.QueryDefs("Forespørgsel1").SQL

End Sub

er kaldet til modulet
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 13:38 #4
Det er i hvert fald ikke noget problem. Kan du åbne Forespørgsel1?
Avatar billede nih Novice
31. marts 2003 - 13:43 #5
prøv at ændre:

Dim i As Integer, j As Integer
til
Dim i As long, j As long


samt åbne recordsettet sådan:
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)


Niels
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 13:44 #6
Med mindre nih's forslag virker, så kunne det måske være nyttigt også at se indholdet af Forespørgsel1
Avatar billede kujo Nybegynder
31. marts 2003 - 13:53 #7
Hej nih

5000 rækker, 4 kolonner med tal virker ok.
også med dit oprindelige forslag.

så snart der kommer tomme felter, tekst, nr, memo, så er det den fejler
også med de nye tiltag
Avatar billede nih Novice
31. marts 2003 - 14:00 #8
Du kan prøve at ændre:
On Error GoTo eHandler til
on error resume next

men så skal du være opmærksom på at koden fortsætter selvom der sker en fejl.
Avatar billede mugs Novice
31. marts 2003 - 14:04 #9
Se venligst mit svar Kl 11:46
Avatar billede kujo Nybegynder
31. marts 2003 - 14:05 #10
Jeg kan desværre ikke offentliggøre disse data der ligger til grund for forespørgslen

'On Error Resume Next,  virkede ikke, den fejler derefter som beskrevet øverst
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 14:06 #11
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.
Avatar billede mugs Novice
31. marts 2003 - 14:09 #12
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)
Avatar billede kujo Nybegynder
31. marts 2003 - 14:10 #13
Til Mugs

desværre løste det ikke problemet
Avatar billede nih Novice
31. marts 2003 - 14:11 #14
Hej Jesper

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.
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 14:11 #15
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.
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 14:15 #16
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.
Avatar billede nih Novice
31. marts 2003 - 14:16 #17
Det optimale ville være:
kode bla. bla

      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

Og på den måde fange fejlen før den opstår.
Avatar billede mugs Novice
31. marts 2003 - 14:16 #18
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])
Avatar billede jesperthomsen Nybegynder
31. marts 2003 - 14:18 #19
Nih->Ja, det er ikke helt tosset. Så mangler vi kun lige en kontrol på at vi ikke overfører flere linier end Excel kan håndtere.

Mugs->Det er reelt samme løsning som jeg foreslår. Det kunne være en idé at lave en trim$ omkring din str$.
Avatar billede kujo Nybegynder
31. marts 2003 - 14:45 #20
Mugs

http://www.eksperten.dk/spm/333523

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"
Avatar billede mugs Novice
31. marts 2003 - 15:07 #21
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.
Avatar billede kujo Nybegynder
01. april 2003 - 10:55 #22
Hej nih

jeg har en form med combobox der sorterer i 70000 linier, jeg ender måske med 3000 linier og sender den til modulet med denne:

tilExcell CurrentDb.QueryDefs("PIM med manglende lagerførte i PIM_subform").SQL
hvorefter modulet fejler.

men kopierer jeg indholdet af samme query til excel og
importerer den til en test db, og laver en simpel query, bruger samme modul,

så virker den ok?

den bruger 3 min om at generere et excelark på 12 kol. og 3000 linier
kan koden optimeres?, da jeg skal exportere optil 33000 linier.


mvh Kurt
Avatar billede kujo Nybegynder
01. april 2003 - 10:57 #23
obs. Det er samme modul som øverst på siden

Den var altså ok Nih  ;-}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester