Avatar billede Slettet bruger
15. maj 2006 - 15:20 Der er 32 kommentarer og
1 løsning

Hent data fra Excel

Jeg har 52 excelfiler fra O:\sti\uge 1 2005.xls til O:\sti\uge 52 2005.xls

Disse har alle et ark, som hedder "Samlet"

Herfra skal jeg bruge, til flg. felter i tabellen, kaldet "Ovf":

Produkt: B6:Q6
Kg: B10:Q10
Procent: B15:Q15

Det kunne jeg godt bruge lidt kode til!~)
Avatar billede jensen363 Forsker
15. maj 2006 - 15:44 #1
Det er ikke lige til højre-benet men jeg har noget programkode som indlæser filnavnene i en tabel, og benytter sig af en løkke-rutine til at aflæse filnavn et efter et og importere afgrænsede data i regnearkene
Avatar billede Slettet bruger
15. maj 2006 - 16:12 #2
Jo, tak....  men som du siger, den er ikke lige til højrebenet....
Avatar billede jensen363 Forsker
15. maj 2006 - 17:28 #3
Sorry ... netværket strejkede

Denne programstump indlæser dine filnavne i en tabel i Access ( tblFilnavn )

Public Sub FileSearch_EXCELL(soegmappe As String, strextend As String, dropdbfilnavn As String, droptable As String, dropfield As String)
' Set Microsoft Office 9.0 Object Library before Executing this Sub
    Dim intI As Integer
    Dim cn As ADODB.Connection, rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=" & dropdbfilnavn & ";"
    ' Åben et recordset
    Set rs = New ADODB.Recordset
    rs.Open droptable, cn, adOpenKeyset, adLockOptimistic, adCmdTable
    ' alle records i en tabel
  With Application.FileSearch
    .NewSearch
    .LookIn = soegmappe
    .SearchSubFolders = True
    '.SearchSubFolders = soegsubs
    .FileName = strextend
    .MatchTextExactly = True
    '.FileType = msoFileTypeAllFiles
   
  End With
 
  With Application.FileSearch
    If .Execute() > 0 Then
        MsgBox "Der blev fundet " & .FoundFiles.Count & " fil(er)."
       
        For intI = 1 To .FoundFiles.Count
            rs.AddNew ' tilføj ny record
            rs.Fields(dropfield) = .FoundFiles(intI)
            rs.Fields("FDato") = FileDateTime(.FoundFiles(intI))
            rs.Fields("filsize") = FileLen(.FoundFiles(intI)) '/ (1024 ^ 2)
            rs.Update ' gem den nye record
        Next intI
    Else
        MsgBox "Der blev ikke fundet nogen filer."
    End If
  End With
      rs.Close ' luk skidtet
    Set rs = Nothing
    cn.Close ' også her
    Set cn = Nothing
    ' slut prut finale

End Sub
Avatar billede jensen363 Forsker
15. maj 2006 - 17:31 #4
Aktiveres vha denne makro :

Private Sub IndlaesData_Click()
Dim strSQL As String
Dim db As DAO.Database

    Set db = CurrentDb()
   
    strSQL = "DELETE * FROM tblfilnavn"

        db.Execute strSQL
   
    'Udviklingsdrev
    FileSearch_EXCELL "C:\Data\Hotline udkørselskunder", "*.xls", "C:\Data\SamleDB.mdb", "tblfilnavn", "filnavn"
     
    'Udvekslingsdrev
    'FileSearch_EXCELL "X:\udveksling\Postservice\Udkørsler\Hotline udkørselskunder", "*.xls", "X:\udveksling\Postservice\Udkørsler\SamleDB.mdb", "tblfilnavn", "filnavn"
   
End Sub
Avatar billede jensen363 Forsker
15. maj 2006 - 17:32 #5
Sorry der kom en programlinie for meget med

Private Sub IndlaesData1_Click()
Dim strSQL As String
Dim db As DAO.Database

    Set db = CurrentDb()
   
    strSQL = "DELETE * FROM tblfilnavn"

        db.Execute strSQL
   
    'Udviklingsdrev
    FileSearch_EXCELL "C:\Data\Hotline udkørselskunder", "*.xls", "C:\Data\SamleDB.mdb", "tblfilnavn", "filnavn"
     
   
End Sub
Avatar billede Slettet bruger
15. maj 2006 - 23:10 #6
Hvis man nu har en tabel med et felt, hvordan ville man så få tallene fra f.eks. A1:C1 ind. Hvis vi får dette løst er der måske lys for enden af tunnelen!~)
Avatar billede mugs Novice
16. maj 2006 - 08:05 #7
Sidste argument bestemmer hvilket område du vil importere fra. Efterlades dette tomt, importerer du hele arket.

DoCmd.TransferSpreadsheet acExport, 8, "Tabel1", "D:\Mappe1", False, "A1:C1"
Avatar billede jensen363 Forsker
16. maj 2006 - 08:43 #8
Store netværksproblemer har bevirket, at jeg ikke har kunnet følde denne tråd ... er I nået videre ???
Avatar billede Slettet bruger
16. maj 2006 - 08:45 #9
Problemet er stadig:

Hvordan specificerer man arkets navn, får indlæst data i det rigtige felt i tabellen og indlæser mere end en dataserie!~)
Avatar billede jensen363 Forsker
16. maj 2006 - 08:46 #10
Har du fået indlæst sti/filnavn i databasen ???
Avatar billede jensen363 Forsker
16. maj 2006 - 08:53 #11
Her er et eksempel hvor jeg udtrækker kundedate fra Excel ( arkfane : Skabelon )

Skulle være rimeligt selvforklarende

Public Function AflæsfelterIExcel()
   
    Dim Xl As Object
    Dim rsKunde As New ADODB.Recordset
    Dim rsFiler As New ADODB.Recordset
    Dim cn As ADODB.Connection
   
    Set cn = CurrentProject.Connection
    Set Xl = CreateObject("EXCEL.APPLICATION")
   
    rsKunde.Open "tblKundeoplysninger", cn, adOpenKeyset, adLockOptimistic
    rsFiler.Open "tblFilnavn", cn, adOpenStatic
   
    Do Until rsFiler.EOF
        Xl.Workbooks.Open rsFiler!filnavn, False, True
        rsKunde.AddNew
        Xl.Sheets("Skabelon").SELECT
        rsKunde![Aftaledato] = Xl.Range("M1")
        rsKunde!Kundenummer = Xl.Range("A9")
        rsKunde!KundeNavn = Xl.Range("A3")
        rsKunde!Vejnavn = Xl.Range("A4")
        rsKunde!Husnummer = Xl.Range("C4")
        rsKunde!Postnummer = Xl.Range("A5")
        rsKunde!ByNavn = Xl.Range("B5")

        rsKunde.Update
        rsFiler.MoveNext

        Xl.Quit
        SendKeys "%{n}", True
               
        On Error Resume Next
                                     
    Loop

End Function
Avatar billede Slettet bruger
16. maj 2006 - 09:02 #12
Jeg skal vist lige have en kop kaffe!~)
Avatar billede jensen363 Forsker
16. maj 2006 - 09:11 #13
Kan du se systematikken i rsKunde og rsFiler ???
Avatar billede Slettet bruger
16. maj 2006 - 09:19 #14
Ja, jeg prøver lige...
Avatar billede Slettet bruger
16. maj 2006 - 09:23 #15
Ok, den sidste funktion kræver vel at man har indlæst sti/filnavne...
I så fald, hvordan skal tabellen til den indlæsning opbygges, for den beklager sig lidt ved feltet "filsize".
Avatar billede jensen363 Forsker
16. maj 2006 - 09:27 #16
filsize er heller ikke obligatorisk ... programstumpen stammer fra en database, hvor jeg benytter filstørrelsen til at afgøre validiteten af de data jeg importerer
Avatar billede Slettet bruger
16. maj 2006 - 09:29 #17
ok
Avatar billede jensen363 Forsker
16. maj 2006 - 09:29 #18
Du kan bare remme den ud :o)
Avatar billede Slettet bruger
16. maj 2006 - 09:34 #19
Ok, så langt så godt... Problemet er nu at det skal se nogenlunde sådan ud:

Public Function AflæsfelterIExcel()
   
    Dim Xl As Object
    Dim rsKunde As New ADODB.Recordset
    Dim rsFiler As New ADODB.Recordset
    Dim cn As ADODB.Connection
   
    Set cn = CurrentProject.Connection
    Set Xl = CreateObject("EXCEL.APPLICATION")
   
    rsKunde.Open "status", cn, adOpenKeyset, adLockOptimistic
    rsFiler.Open "tblFilnavn", cn, adOpenStatic
   
    Do Until rsFiler.EOF
        Xl.Workbooks.Open rsFiler!filnavn, False, True
        rsKunde.AddNew
        Xl.Sheets("Samlet").SELECT
        rsKunde![produkt] = Xl.range("B6:Q6")
        rsKunde!KgPrKar = Xl.range("B10:Q10")
        rsKunde!Vandprocent = Xl.range("B15:Q15")
        rsKunde!Uge = Xl.range("B1")

        rsKunde.Update
        rsFiler.MoveNext

        Xl.Quit
        SendKeys "%{n}", True
               
        On Error Resume Next
                                     
    Loop

End Function
Avatar billede Slettet bruger
16. maj 2006 - 09:37 #20
Den stopper ved rsKunde![produkt] = Xl.range("B6:Q6") og siger typeuoverensstemmelse..
Avatar billede jensen363 Forsker
16. maj 2006 - 09:38 #21
Nu skal du til at tænke over, hvorledes du vil have data i access, således at de er struktureret/normaliseret ...
Avatar billede jensen363 Forsker
16. maj 2006 - 09:39 #22
Hvorledes havde du tænkt dig at et typist datasæt skal se ud i access ???
Avatar billede Slettet bruger
16. maj 2006 - 09:51 #23
Produkt1; 1.032,50; 0,49
Produkt2; 1.211,03; 0,55

Jeg har ikke lige et id felt med, men det kan jeg jo lige gøre, så jeg kan få en primærnøgle!~)
Avatar billede Slettet bruger
16. maj 2006 - 09:52 #24
Hov, jeg glemte uge:
Produkt1; 1.032,50; 0,49; 1
Produkt2; 1.211,03; 0,55; 1
Avatar billede jensen363 Forsker
16. maj 2006 - 09:58 #25
Jeg tror du er nødt til at aflæse cellevis, dvs :

Do Until rsFiler.EOF
        Xl.Workbooks.Open rsFiler!filnavn, False, True
        rsKunde.AddNew
        Xl.Sheets("Samlet").SELECT

        rsKunde![produkt] = Xl.range("B6")
        rsKunde!KgPrKar = Xl.range("B10")
        rsKunde!Vandprocent = Xl.range("B15")
        rsKunde!Uge = Xl.range("B1")

        rsKunde![produkt] = Xl.range("C6")
        rsKunde!KgPrKar = Xl.range("C10")
        rsKunde!Vandprocent = Xl.range("C15")
        rsKunde!Uge = Xl.range("B1")
Avatar billede Slettet bruger
16. maj 2006 - 10:03 #26
Ja, det er også det jeg er ved nu, så havde jeg lidt problemer med skalering af et decimaltal, men nu må vi se computeren arbejder!~)
Avatar billede Slettet bruger
16. maj 2006 - 10:04 #27
Er det muligt at lave en løkke, som går fra B til Q
Avatar billede jensen363 Forsker
16. maj 2006 - 10:29 #28
Det er sikkert muligt ... men så skal du benytte en løkke indeni en løkke ... ved ikke lige om det går helt godt ... under alle omstændigheder kræver det lidt programmering
Avatar billede Slettet bruger
16. maj 2006 - 10:35 #29
Nu fik jeg data ind, jeg skal lige validere....
Avatar billede Slettet bruger
16. maj 2006 - 11:04 #30
Der skulle indsættes ugenr i alle filer, men nu kører det!~)

Godt gået jensen....

Smid lige et svar og tak for hjælpen!~)
Avatar billede jensen363 Forsker
16. maj 2006 - 11:10 #31
Velbekommen :o)
Avatar billede jensen363 Forsker
16. maj 2006 - 11:17 #32
Tak for karma ;o)
Avatar billede Slettet bruger
16. maj 2006 - 11:21 #33
Du har fortjent det!~)
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