Avatar billede hnto Nybegynder
07. april 2011 - 09:15 Der er 12 kommentarer og
1 løsning

excel export fra access hvor excel er exporteret med trackchange

har behov for at ved tryk på en knap at kunne eksportere en tabel til en excelfil, men hvor denne excelfil er gemt med tracktrance funktionen aktiveret, således at hvis en bruger efterfølgende åbner denne excelfil og laver ændringer er det highlightet i excel.

nb.
jeg importerer den eksporterede fil ind i access igen i en ny tabel der er magen til exporttabellen, så hvis der findes en access funktion til dette inde i access er denne løsning også interessant.
Avatar billede sifuentes Nybegynder
07. april 2011 - 12:05 #1
Lidet elegant løsning i mine ører.
Avatar billede Slettet bruger
07. april 2011 - 14:01 #2
Hvad er senariet for beslutte synkronisering af access tabelindhold med ændringer i excel filer? visuel backtrack inspektion?
Man kunne gemme pathnames og have en skjult formular til at køre det automatisk styret af ændringer i last modification time

docmd.TransferSpreadsheet til import
Avatar billede hnto Nybegynder
07. april 2011 - 14:29 #3
kan du uddybe dette lidt mere ?
Avatar billede Slettet bruger
07. april 2011 - 18:37 #4
Først vil jeg lige have lov at påpege at det er en mega ineffektiv opdaterings metode , at en mindre ændring, sker ved at slette alt og derefter genoprette - som der er nødvendigt når excel bruges som datafangst metode. Anyway:

Følgene er blot et eksempel på problematikken

Vi skal kunne gemme file lastmodified tidspunkt
givet tabel: 'ExcelFileAtt' med netop 1 post og feltindhold

lastModf    <intet til start>
fRef    c:\test.xsl   
tblN    E

Bestem selv hvad der skal stå i fRef og tblN, men tabellen skal findes (her E)

For at få adgang til global data, uden initialisering - dette skal i et standardmodul:


Const fTbl = "ExcelFileAtt"

Function exfileN(): exfileN = DLookup("fRef", fTbl): End Function
Function exTblN(): exTblN = DLookup("tblN", fTbl): End Function
Function exfileAttTblN(): exfileAttTblN = fTbl: End Function
Function exFLastModf()
    exFLastModf = CreateObject("Scripting.FileSystemObject").GetFile(exfileN()).dateLastModified
End Function

Function exLogOfLastModified(): exLogOfLastModified = DLookup("lastModF", fTbl): End Function

Sub exStartLog(): DoCmd.OpenForm "PoolEFC", , , , , acHidden: End Sub
Sub exStopLog(): DoCmd.Close acForm, "PoolEFC": End Sub


--------

Hændelsen til knappen hvis aktivering gemmer filen i et excel ark:

Private Sub gemExcel_Click()
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, exTblN(), exfileN()
    CurrentDb.Execute "update " & exfileAttTblN() & " set lastModf='" & exFLastModf() & "'"
End Sub

------------

Ny formular: PoolEFC  - lav den

egenskabsark hændelser->timerinterval=5000

der testes med 5 sekunds opdatering

Private Sub Form_Timer()
    Dim tmpEfile
   
    tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
    If Len(Dir(exfileN())) Then
        If exFLastModf() <> exLogOfLastModified() Then
            ' HACK prevent file access  denied
            tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
            Shell "cmd /c copy " & exfileN() & " " & tmpEfile
            CurrentDb.Execute "delete from " & exTblN()
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, exTblN(), tmpEfile, True
    End If: End If
End Sub

------------------

Først sikres det at der er en excelfil ved tryk på gem knappen

Herefter startes 'logning til tabel' ved kald af exStartLog()

Prøv at åbne excelfil og ændre - gemme
Efter højest timerinterval/1000 sekunder er ændringen skrevet til tabel

-----------------

Til slut: der er et graverende hack - kopi til temp fil for at få adgang til en excel fil der stadig kan være åben af excel (en anden bruger) - det bør laves mere elegant med testning om det er tilfælde og venten på at excel lukker filen.
Avatar billede Slettet bruger
07. april 2011 - 18:46 #5
rettelse:
Private Sub Form_Timer()
    Dim tmpEfile
 
    tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
    If Len(Dir(exfileN())) Then
        If exFLastModf() <> exLogOfLastModified() Then
            ' HACK prevent file access  denied
            tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
            Shell "cmd /c copy " & exfileN() & " " & tmpEfile
            CurrentDb.Execute "delete from " & exTblN()
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, exTblN(), tmpEfile, True
            CurrentDb.Execute "update " & exfileAttTblN() & " set lastModf='" & exFLastModf() & "'"
    End If: End If
End Sub
Avatar billede Slettet bruger
07. april 2011 - 18:53 #6
og endnu en rettelse:

Private Sub Form_Timer()
    Dim tmpEfile
   
    tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
    If Len(Dir(exfileN())) Then
        If StrComp(exLogOfLastModified(), exFLastModf()) Then
            ' prevent file access  denied
            Debug.Print "saving with time:" & exFLastModf
            tmpEfile = Split(exfileN(), ".")(0) & ".tmp.xls"
            Shell "cmd /c copy " & exfileN() & " " & tmpEfile
            CurrentDb.Execute "delete from " & exTblN()
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, exTblN(), tmpEfile, True
            CurrentDb.Execute "update " & exfileAttTblN() & " set lastModf='" & exFLastModf() & "'"
    End If: End If
End Sub
Avatar billede Slettet bruger
07. april 2011 - 22:12 #7
Sidste rettelse:
Private Sub Form_Timer()
    If Len(Dir(exfileN)) Then
        If StrComp(exLogOfLastModified, exFLastModf) <> 0 And availExFile Then
            Debug.Print "Last modf time:" & exFLastModf
            CurrentDb.Execute "delete from " & exTblN
            DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, exTblN, exfileN, True
            CurrentDb.Execute "update " & exfileAttTblN & " set lastModf='" & exFLastModf & "'"
    End If: End If
End Sub

Function availExFile()
    On Error GoTo fExit
    Dim hndl
    hndl = FreeFile()
    Open exfileN For Binary Access Read Write Lock Read Write As hndl
    Close hndl
    availExFile = True
fExit:
    err.Clear
End Function
Avatar billede sifuentes Nybegynder
07. april 2011 - 22:22 #8
Når man excelere i at benytte programel til at slette data, skal man edermame være sikker på at man har et perfekt backupsystem, medmindre data er stort set værdiløse.
Avatar billede Slettet bruger
07. april 2011 - 23:32 #9
sifuentes: påpegning sikre konkrete implementations issues, er sikkert velkomne.
Har du prøvet mit eksempel?
Avatar billede hnto Nybegynder
24. juni 2011 - 13:12 #10
svar gives venligst hvis point skal tildeles
Avatar billede hnto Nybegynder
24. august 2011 - 11:10 #11
har aldrig fået det testet, og opgaven er løst via andre rutiner nu :-(

smid et svar så vi kan få dette lukket...
Avatar billede hnto Nybegynder
28. januar 2012 - 12:29 #12
hvis nogen vil have point er det nu :-)
Avatar billede hnto Nybegynder
02. juni 2012 - 16:55 #13
har været syg i længere tid derfor har der ikke været aktivitet fra min side. Er nu klar igen så venligst blot besvar så giver jeg point, da sagen ikke længere er aktuel
sorry...
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