Zufälliger Artikel

Problemstellung:

Wie kann ich mit API Datum- und Zeitangaben von Dateien manipulieren? 
Mit dem Filesystemobject der MS-Scripting Runtime ist es kein Problem die
3 Zeitangaben von Dateien auslesen (Erstellt, letzte Änderung und letzter Zugriff)

z.B. so:

Dim oFSO As New FileSystemObject
Dim oFile As File

Private Enum eFileTime
    FileCreate = 1
    FileLastAccess = 2
    FileLastModify = 3
End Enum

Private Function GetFileTime(sFile As String, eType As eFileTime)
    Dim vResult
    Set oFile = oFSO.GetFile(sFile)
    If eType = FileCreate Then
        vResult = oFile.DateCreated
    ElseIf eType = FileLastAccess Then
        vResult = oFile.DateLastAccessed
    Else
        vResult = oFile.DateLastModified
    End If
    GetFileTime = vResult
End Function

Private Sub Befehl0_Click()
    MsgBox "Erstellt: " & GetFileTime("D:\users\Daten2\DK_EinsatzBE.mdb", FileCreate) & vbNewLine & _
        "Letzter Zugriff: " & GetFileTime("D:\users\Daten2\DK_EinsatzBE.mdb", FileLastAccess) & vbNewLine & _
        "Letzte Änderung: " & GetFileTime("D:\users\Daten2\DK_EinsatzBE.mdb", FileLastModify)
End Sub

Ergebnis:

Aber es ist mit FSO eben nur möglich diese Angaben auszulesen aber nicht zu verändern.
Wie das geht möchte ich hier zeigen.

Lösung:

Folgenden Code in ein neues Modul kopieren.

Public Declare Function SystemTimeToFileTime _
    Lib "kernel32" ( _
    lpSystemTime As tpSystemTime, _
    lpFileTime As tpFileTime) As Long
Public Declare Function LocalFileTimeToFileTime _
    Lib "kernel32" ( _
    lpLocalFileTime As tpFileTime, _
    lpFileTime As tpFileTime) As Long
Public Declare Function OpenFile _
    Lib "kernel32" ( _
    ByVal lpFileName As String, _
    lpReOpenBuff As tpOpenFile, _
    ByVal wStyle As Long) As Long
Public Declare Function SetFileTime _
    Lib "kernel32" ( _
    ByVal hFile As Long, _
    lpCreationTime As tpFileTime, _
    lpLastAccessTime As tpFileTime, _
    lpLastWriteTime As tpFileTime) As Long
Public Declare Function CloseHandle _
    Lib "kernel32" ( _
    ByVal hObject As Long) As Long
Public Type tpSystemTime
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
Public Type tpFileTime
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Public Type tpOpenFile
    cBytes As Byte
    fFixedDisk As Byte
    nErrCode As Integer
    Reserved1 As Integer
    Reserved2 As Integer
    szPathName(128) As Byte
End Type
Public Const OF_READWRITE = &H2

Public Function SetTimeStamp(sFileName As String, _
    Optional dtCreationTime As Date, _
    Optional dtLastAccessTime As Date, _
    Optional dtLastWriteTime As Date) As Boolean
    Dim typST As tpSystemTime
    Dim typTemp As tpFileTime
    Dim i As Integer
    Dim arrTime(3) As Date
    Dim arrTimeStruct(3) As tpFileTime
    Dim typOF As tpOpenFile
    Dim lngRet As Long
    On Error GoTo SetTimeStamp_Error
    If dtCreationTime = 0 Then
        arrTime(0) = Now()
    Else
        arrTime(0) = CDate(dtCreationTime)
    End If
    If dtLastAccessTime = 0 Then
        arrTime(1) = arrTime(0)
    Else
        arrTime(1) = CDate(dtLastAccessTime)
    End If
    If dtLastWriteTime = 0 Then
        arrTime(2) = arrTime(1)
    Else
        arrTime(2) = CDate(dtLastWriteTime)
    End If
    For i = 0 To 2
        With typST
            .wYear = Year(arrTime(i))
            .wMonth = Month(arrTime(i))
            .wDayOfWeek = 0
            .wDay = Day(arrTime(i))
            .wHour = Hour(arrTime(i))
            .wMinute = Minute(arrTime(i))
            .wSecond = Second(arrTime(i))
            .wMilliseconds = 0
        End With
        lngRet = SystemTimeToFileTime(typST, typTemp)
        lngRet = LocalFileTimeToFileTime( _
            typTemp, arrTimeStruct(i))
    Next i
    lngRet = OpenFile(sFileName, typOF, OF_READWRITE)
    Call SetFileTime(lngRet, _
        arrTimeStruct(0), arrTimeStruct(1), arrTimeStruct(2))
    Call CloseHandle(lngRet)
    SetTimeStamp = True
    Exit Function
SetTimeStamp_Error:
    SetTimeStamp = False
End Function

Aufruf z.B.:

SetTimeStamp "F:\Access\Oberflächeproggie.xls", "30.05.2008 12:00"

 Würde das Erstelltdatum der Datei "F:\Access\Oberflächenproggi.xls" auf das Datum 30.05.2008 12:00 setzen.

Ähnliche Artikel

Home

1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

 Problemstellung:
Es gibt bestimmte Fragen die immer wieder auftreten.
Wie kann ich aus Access heraus eine Exceldatei öffnen oder ein Worddokument drucken usw.
Dafür bietet sich die API-Funktion "ShellExecute" an.
Aber wie geht das? Das erfahrt Ihr im Folgenden.

Voraussetzungen:
Das Bsp ist ab A00 lauffähig

unter A07 muss sich Bsp-DB in einen „Vertrauenswürdigen Standort“ befinden

 

Funktionsweise:
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                        (ByVal hwnd As Long, ByVal lpOperation As String, _
                         ByVal lpFile As String, _
                         ByVal lpParameters As String, ByVal lpDirectory As String, _
                         ByVal nShowCmd As Long) As Long

Funktions Parameter:

  • hwnd
    erwartet ein Fensterhandel zu dem sich das neue Fenster Modal verhält.
  • lpOperation
    hier wird eine Zeichenfolge erwartet die beschreibt welche Operation durchgeführt werden soll.
    Diese Operationen sind Kommandos die in der Windows Registry stehen und auch zur Auswahl stehen
    wenn man mittels der Rechten Maustaste im Windows Explorer auf eine Datei Klickt.
    Wird ein leerer String übergeben wird die Standard öffnungsmethode benutzt, wird diese Standard Methode
    nicht in der Windows Registry gefunden wird die Datei mit dem "Open"" Kommando geöffnet. Bei Windows 2000 und
    Später wird auch erst versucht das Dokument mit dem Standard Kommando zu öffnen. Ist kein Standard Kommando
    Definiert so bedient sich Windows 2000 dem ersten Registryeintrag der bei der Datei Assizoierten Datei gefunden wird.
    Gültige Kommandos sind die folgenden Strings.

    lpOperation Kommandos

    "edit" verhält sich so als wenn man im Kontextmenü des Explorers auf "Bearbeiten" Klickt

    "explore" wenn "lpFile" ein Verzeichnispfad ist wird der Windows Explorer mit dem Verzeichnis geöffnet

    "find" wenn "lpFile" ein Verzeichnispfad ist wird der Windows Suchen Dialog mit gesetztem Startverzeichnis zu diesem geöffnet

    "open" Öffnet die Datei mit dem Assizoiertem Programm

    "print" Druckt die Datei mit dem Assizoiertem Programm
  • lpFile
    erwartet ein Verzeichnisnamen, eine Datei oder das Dokument welches mit der Assizoiertem Programm geöffnet werden soll.
  • lpParameters
    hier kann man noch zusätzliche Programm Parameter übergeben.
  • lpDirectory
    legt das Arbeitsverzeichnis fest in dem das Programm Arbeitet welches geöffnet wird
  • nCmdShow
    erwartet ein Konstante die beschreibt wie das Fenster welches erscheint, ausgerichtet werden soll.


Konstanten für nCmdShow:

Public Enum WindowsConst
    SW_HIDE = 0             'Versteckt das Fenster
    SW_MAXIMIZE = 3         'Maximiert das Fenster
    SW_MINIMIZE = 6         'Minmiert das Fenster
    SW_NORMAL = 1           'Akteviert das Fenster
    SW_SHOW = 5             'Zeigt das Fenster an, auch wenn es versteckt ist
    SW_RESTORE = 9          'Stellt das Fenster wieder her
    SW_SHOWMAXIMIZED = 3    'Zeigt das Fenster an und Maximiert es
    SW_SHOWMINIMIZED = 2    'Zeigt das Fenster an und Minimiert es
    SW_SHOWMINNOACTIVE = 7  'Minimiert das Fenster aber akteviert es nicht
    SW_SHOWNA = 8           'Zeigt das Fenster an aber aktiviert es nicht
    SW_SHOWNOACTIVATE = 4   'Zeigt das Fenster an ohne es zu aktivieren
    SW_SHOWNORMAL = 1       'Zeigt das Fenster und aktiviert dies
End Enum

Rückgabewerte der Funktion:

Public Enum ErrorConst
    ERROR_BAD_FORMAT = 11&          'Die Datei ist keine Win32 Anwendung
    SE_ERR_ACCESSDENIED = 5         'Zugriff Verweigert
    SE_ERR_ASSOCINCOMPLETE = 27     'Datei Assoziation ist unvollständig
    SE_ERR_DDEBUSY = 30             'DDE ist nicht bereit
    SE_ERR_DDEFAIL = 29             'DDE forgang gescheitert
    SE_ERR_DDETIMEOUT = 28          'DDE zeitlimit wurde erreicht
    SE_ERR_DLLNOTFOUND = 32         'Die benötigte DLL wurde nicht gefunden
    SE_ERR_FNF = 2                  'Datei wurde nicht gefunden
    SE_ERR_NOASSOC = 31             'Datei ist nicht Assizoiert
    SE_ERR_OOM = 8                  'Nicht genügend Speicher
    SE_ERR_PNF = 3                  'Pfad wurde nicht gefunden
    SE_ERR_SHARE = 26               'Sharing verletzung
End Enum

Die Prozedur sähe dann so aus:

Public Enum OpenConst
    Bearbeiten = 1      'verhält sich so als wenn man im Kontextmenü des
                        'Explorers auf "Bearbeiten" Klickt
    Explorer = 2        'wenn "lpFile" ein Verzeichnispfad ist wird der
                        'Windows Explorer mit dem Verzeichnis geöffnet
    Suchen = 3          'wenn "lpFile" ein Verzeichnispfad ist wird der
                        'Windows Suchen Dialog mit gesetztem Startverzeichnis
                        'zu diesem geöffnet
    Oeffnen = 4         'Öffnet die Datei mit dem Assizoiertem Programm
    Drucken = 5         'Druckt die Datei mit dem Assizoiertem Programm
End Enum

Public Sub ExecuteFile(frm As Form, sFile As String, cOpen As OpenConst, _
                       cWindow As WindowsConst, _
                       Optional sDir As String = vbNullString, _
                       Optional sParameter As String = vbNullString)
'*******************************************
'Name:      ExecuteFile   (Sub)
'Purpose:
'Author:    Thomas Keßler
'Date:      August 23, 2007, 13:00:00
'Inputs:    frm=Formular, sFile=Dateiname, cOpen=Öffnungsmodus,
'           cWindow=Fenstermodus
'           sDir=Startverzeichnis, sParameter=Startparameter
'Output:
'*******************************************
Dim Retval As ErrorConst
Dim sOpen As String

    Select Case cOpen
        Case 1
            sOpen = "edit"
        Case 2
            sOpen = "explore"
        Case 3
            sOpen = "find"
        Case 4
            sOpen = "open"
        Case 5
            sOpen = "print"
    End Select
    
    Retval = ShellExecute(frm.hwnd, sOpen, sFile, sParameter, sDir, cWindow)

   Select Case Retval
    Case SE_ERR_NOASSOC
       Shell "RunDLL32 shell32.dll,OpenAs_RunDLL " & sFile
       'MsgBox "Datei ist nicht Assizoiert", vbInformation, "Fehler"
       Exit Sub
    Case SE_ERR_PNF
       MsgBox "Pfad wurde nicht gefunden", vbInformation, "Fehler"
       Exit Sub
    Case SE_ERR_FNF
       MsgBox "Datei wurde nicht gefunden", vbInformation, "Fehler"
       Exit Sub
    Case 8, 26, 32, 28, 29, 30, 27, 5, 11 'Alle anderen Fehler
       Exit Sub
   End Select
End Sub

Somit könnte der Aufruf zum öffnen einer Exceldatei so aussehen:

1
ExecuteFile Me, "C:\Test\test.xls", Oeffnen, SW_MAXIMIZE

Weitere Beispiele zum Aufruf befinden sich in der Bsp-DB
z.B.:
- öffnen von Dateien
- drucken von Dateien
- bearbeiten von Dateien
- Explorer mit bestimmten Verzeichnis öffnen
- Suchdialog in bestimmten Verzeichnis aufrufen

Dateien:

Arbeiten mit der ShellExecute-Methode

ab A00

Die Zip-Datei enthält eine Version ab A00-A03 und eine ab A07

Datum 05.02.2018
Dateigröße 75.45 KB
Download 1.396

Ähnliche Artikel

Kommentar schreiben

Sicherheitscode
Aktualisieren

Login Form

1.png1.png9.png1.png3.png6.png8.png
Heute19
Gestern75
Diese Woche417
Dieser Monat1301
Total1191368

  • IP: 54.81.71.187
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

1
Online

21. April 2018