Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Dateioperationen mit der SHFileOperation-Funktion
zurück: SPEZIAL: neuer flexibler Fortschrittsbalken (ProgressBar) weiter: OnKey im Userform Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Information Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Isabelle :-)
Menschin


Verfasst am:
16. Okt 2013, 22:55
Rufname:
Wohnort: Westlicher Spiralarm der Galaxis


Dateioperationen mit der SHFileOperation-Funktion - Dateioperationen mit der SHFileOperation-Funktion

Nach oben
       Version: Office XP (2002)

Hallöchen,

Die SHFileOperation-Funktion bietet im Vergleich zu den normalen Dateioperationen von Excel eine Fülle von Möglichkeiten. So können mehrere Dateien oder Ordnern praktisch mit einer einzigen Anweisung kopiert, verschoben, gelöscht oder umbenannt werden.

Umbenennen beim Kopieren und Verschieben ist natürlich auch möglich. Und es werden, wenn als Ziel eines Kopier- oder Verschiebevorgangs Ordner angegeben sind, diese bei Bedarf automatisch angelegt.

Zudem ist es damit möglich Ordner die nicht leer sind zu löschen und zu verschieben. Selbst auf ein anderes Laufwerk was mit den normalen Funktionen von Excel nicht möglich ist.

Die Funktion macht genau dasselbe was ihr im Windows-Explorer auch machen könnt. Z.B. beim kopieren optional Dateien umbenennen wenn es den Namen der Datei im Zielordner schon gibt. Beispiel: "Mappe1.xls " wird zu "Mappe1 - Kopie.xls ". Die so umbenannten Dateien können auch angezeigt werden und falls du darauf zugreifen willst, kannst du dir ein Array der Namen aus der Klasse zurückgeben lassen.

Werden mehrere Dateien / Ordner gleichzeitig bearbeitet, zeigt die Funktion den Standard-Fortschrittsdialog des Windows-Explorers, was sich optional auch unterdrücken lässt.

Damit das Ganze im Code nicht zu aufwendig wird, habe ich die Funktion in eine Klasse verpackt.

In einem Klassenmodul mit dem Namen "clsFileOperation":

Code:
Option Explicit

Private Declare Function SHFileOperationW Lib "shell32.dll" ( _
    ByRef lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Sub SHFreeNameMappings Lib "shell32.dll" ( _
    ByVal hNameMappings As Long)
Private Declare Function FormatMessageA Lib "kernel32.dll" ( _
    ByVal dwFlags As Long, _
    ByRef lpSource As Any, _
    ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, _
    ByVal lpBuffer As String, _
    ByVal nSize As Long, _
    ByRef Arguments As Long) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32.dll" ( _
    ByRef dest As Any, _
    ByRef src As Any, _
    ByVal bytes As Long)
Private Declare Function lstrcpynW Lib "kernel32.dll" ( _
    ByVal lpString1 As Long, _
    ByVal lpString2 As Long, _
    ByVal iMaxLength As Long) As Long

Private Type SHFILEOPSTRUCT
    hwnd As Long        'Dialogs modal to
    wFunc As Long       'Function to do
    pFrom As Long       'Source files / folder
    pTo As Long         'Target files / folder
    fFlags As Integer   'Flag for options see FOF-constants below
    fAborted As Long    'Flag was set if user abort any dialog of the function
    hNameMaps As Long   'Contain a stucture of automatically renamed files
    sProgress As Long   'Only to Windows 98
End Type

Private Type SHNAMEMAPPING
    pszOldPath As Long
    pszNewPath As Long
    cchOldPath As Long
    cchNewPath As Long
End Type

Private Type HANDLETOMAPPINGS
    MappingCounter As Long
    MappingAddress As Long
End Type

Const LANG_NEUTRAL As Long = &H0

Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = &H2000
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800
Private Const FORMAT_MESSAGE_FROM_STRING As Long = &H400
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF&

Private Const FOF_MULTIDESTFILES As Long = &H1      'The pTo member specifies multiple destination files (one for each source file in pFrom).
Private Const FOF_CONFIRMMOUSE = &H2                'Not used.
Private Const FOF_SILENT As Long = &H4              'Do not display a progress dialog box.
Private Const FOF_RENAMEONCOLLISION As Long = &H8   'Give the file being operated on a new name if a file with the target name already exists at the destination.
Private Const FOF_NOCONFIRMATION As Long = &H10     'Respond with Yes to All for any dialog box that is displayed.
Private Const FOF_WANTMAPPINGHANDLE = &H20          'Get list of renamed files.
Private Const FOF_ALLOWUNDO = &H40                  'Move files into recycelin-bin.
Private Const FOF_FILESONLY = &H80                  'Only files if filename like *.*.
Private Const FOF_SIMPLEPROGRESS = &H100            'Show progress (only to Windows 98).
Private Const FOF_NOCONFIRMMKDIR As Long = &H200    'Create folder automatical if necessary.
Private Const FOF_NOERRORUI As Long = &H400         'Do not display a dialog to the user if an error occurs.
Private Const FOF_NOCOPYSECURITYATTRIBUTES = &H800  'Do not copy the security attributes of the file. The destination file receives the security attributes of its new folder.
Private Const FOF_NORECURSION = &H1000              'Only perform the operation in the local directory. Do not operate recursively into subdirectories, which is the default behavior.
Private Const FOF_NOCONNECTEDELEMENTS = &H2000      'Do not move connected files as a group. Only move the specified files.
Private Const FOF_WANTNUKEWARNING = &H4000          'Send a warning if a file is being permanently destroyed during a delete operation rather than recycled. This flag partially overrides FOF_NOCONFIRMATION.
Private Const FOF_NOUI = FOF_SILENT Or FOF_NOCONFIRMATION Or _
    FOF_NOERRORUI Or FOF_NOCONFIRMMKDIR             'Perform the operation silently, presenting no UI to the user.

Private Const DE_NOFILE As Long = &H2
Private Const DE_NODESTFOLDER As Long = &H5
Private Const DE_SAMEFILE As Long = &H71
Private Const DE_MANYSRC1DEST  As Long = &H72
Private Const DE_DIFFDIR  As Long = &H73
Private Const DE_ROOTDIR  As Long = &H74
Private Const DE_OPCANCELLED  As Long = &H75
Private Const DE_DESTSUBTREE  As Long = &H76
Private Const DE_ACCESSDENIEDSRC  As Long = &H78
Private Const DE_PATHTOODEEP  As Long = &H79
Private Const DE_MANYDEST  As Long = &H7A
Private Const DE_FORBIDDENCHARACTERINDEST As Long = &H7B
Private Const DE_INVALIDFILES  As Long = &H7C
Private Const DE_DESTSAMETREE  As Long = &H7D
Private Const DE_FLDDESTISFILE  As Long = &H7E
Private Const DE_FILEDESTISFLD  As Long = &H80
Private Const DE_FILENAMETOOLONG  As Long = &H81
Private Const DE_DEST_IS_CDROM  As Long = &H82
Private Const DE_DEST_IS_DVD  As Long = &H83
Private Const DE_DEST_IS_CDRECORD  As Long = &H84
Private Const DE_FILE_TOO_LARGE  As Long = &H85
Private Const DE_SRC_IS_CDROM  As Long = &H86
Private Const DE_SRC_IS_DVD  As Long = &H87
Private Const DE_SRC_IS_CDRECORD  As Long = &H88
Private Const DE_ERROR_MAX  As Long = &HB7
Private Const DE_ERROR_UNKNOWN  As Long = &H402
Private Const DE_CANCELBYUSER As Long = &H4C7
Private Const DE_ERRORONDEST  As Long = &H10000
Private Const DE_ROOTDIR_ERRORONDEST  As Long = &H10074

Private menmFileOperation As FILE_OPERATION
Private mblnMultiDestFiles As Boolean
Private mblnSilent As Boolean
Private mblnRenameonCollision As Boolean
Private mblnNoConfirmation As Boolean
Private mblnWantMappingHandle As Boolean
Private mblnAllowUndo As Boolean
Private mblnFilesOnly As Boolean
Private mblnSimpleProgress As Boolean
Private mblnNoConfirmMkDir As Boolean
Private mblnNoErrorUI As Boolean
Private mblnNoCopySecurityAttributes As Boolean
Private mblnNoRecursion As Boolean
Private mblnNoConnectedElements As Boolean
Private mblnWantNukeWarning As Boolean
Private mblnNoUI As Boolean
Private mblnShowMappedFile As Boolean
Private mblnNoMessage As Boolean
Private mlngInputFileCount As Long
Private mlngOutputFileCount As Long
Private mavntInputFile As Variant
Private mavntOutputFile As Variant
Private mastrMappedFile() As String
Private mstrInputFolder As String
Private mstrOutputFolder As String

Friend Property Get FileOperation() As FILE_OPERATION
    FileOperation = menmFileOperation
End Property

Friend Property Let FileOperation(ByVal pvenmFileOperation As FILE_OPERATION)
    menmFileOperation = pvenmFileOperation
End Property

Friend Property Get MultiDestFiles() As Boolean
    MultiDestFiles = mblnMultiDestFiles
End Property

Friend Property Let MultiDestFiles(ByVal pvblnMultiDestFiles As Boolean)
    mblnMultiDestFiles = pvblnMultiDestFiles
End Property

Friend Property Get Silent() As Boolean
    Silent = mblnSilent
End Property

Friend Property Let Silent(ByVal pvblnSilent As Boolean)
    mblnSilent = pvblnSilent
End Property

Friend Property Get RenameonCollision() As Boolean
    RenameonCollision = mblnRenameonCollision
End Property

Friend Property Let RenameonCollision(ByVal pvblnRenameonCollision As Boolean)
    mblnRenameonCollision = pvblnRenameonCollision
End Property

Friend Property Get NoConfirmation() As Boolean
    NoConfirmation = mblnNoConfirmation
End Property

Friend Property Let NoConfirmation(ByVal pvblnNoConfirmation As Boolean)
    mblnNoConfirmation = pvblnNoConfirmation
End Property

Friend Property Get WantMappingHandle() As Boolean
    WantMappingHandle = mblnWantMappingHandle
End Property

Friend Property Let WantMappingHandle(ByVal pvblnWantMappingHandle As Boolean)
    mblnWantMappingHandle = pvblnWantMappingHandle
End Property

Friend Property Get AllowUndo() As Boolean
    AllowUndo = mblnAllowUndo
End Property

Friend Property Let AllowUndo(ByVal pvblnAllowUndo As Boolean)
    mblnAllowUndo = pvblnAllowUndo
End Property

Friend Property Get FilesOnly() As Boolean
    FilesOnly = mblnFilesOnly
End Property

Friend Property Let FilesOnly(ByVal pvblnFilesOnly As Boolean)
    mblnFilesOnly = pvblnFilesOnly
End Property

Friend Property Get SimpleProgress() As Boolean
    SimpleProgress = mblnSimpleProgress
End Property

Friend Property Let SimpleProgress(ByVal pvblnSimpleProgress As Boolean)
    mblnSimpleProgress = pvblnSimpleProgress
End Property

Friend Property Get NoConfirmMkDir() As Boolean
    NoConfirmMkDir = mblnNoConfirmMkDir
End Property

Friend Property Let NoConfirmMkDir(ByVal pvblnNoConfirmMkDir As Boolean)
    mblnNoConfirmMkDir = pvblnNoConfirmMkDir
End Property

Friend Property Get NoErrorUI() As Boolean
    NoErrorUI = mblnNoErrorUI
End Property

Friend Property Let NoErrorUI(ByVal pvblnNoErrorUI As Boolean)
    mblnNoErrorUI = pvblnNoErrorUI
End Property

Friend Property Get NoCopySecurityAttributes() As Boolean
    NoCopySecurityAttributes = mblnNoCopySecurityAttributes
End Property

Friend Property Let NoCopySecurityAttributes(ByVal pvblnNoCopySecurityAttributes As Boolean)
    mblnNoCopySecurityAttributes = pvblnNoCopySecurityAttributes
End Property

Friend Property Get NoRecursion() As Boolean
    NoRecursion = mblnNoRecursion
End Property

Friend Property Let NoRecursion(ByVal pvblnNoRecursion As Boolean)
    mblnNoRecursion = pvblnNoRecursion
End Property

Friend Property Get NoConnectedElements() As Boolean
    NoConnectedElements = mblnNoConnectedElements
End Property

Friend Property Let NoConnectedElements(ByVal pvblnNoConnectedElements As Boolean)
    mblnNoConnectedElements = pvblnNoConnectedElements
End Property

Friend Property Get WantNukeWarning() As Boolean
    WantNukeWarning = mblnWantNukeWarning
End Property

Friend Property Let WantNukeWarning(ByVal pvblnWantNukeWarning As Boolean)
    mblnWantNukeWarning = pvblnWantNukeWarning
End Property

Friend Property Get NoUI() As Boolean
    NoUI = mblnNoUI
End Property

Friend Property Let NoUI(ByVal pvblnNoUI As Boolean)
    mblnNoUI = pvblnNoUI
End Property

Friend Property Get ShowMappedFile() As Boolean
    ShowMappedFile = mblnShowMappedFile
End Property

Friend Property Let ShowMappedFile(ByVal pvblnShowMappedFile As Boolean)
    mblnShowMappedFile = pvblnShowMappedFile
End Property

Friend Property Get NoMessage() As Boolean
    NoMessage = mblnNoMessage
End Property

Friend Property Let NoMessage(ByVal pvblnNoMessage As Boolean)
    mblnNoMessage = pvblnNoMessage
End Property

Public Property Get InputFileCount() As Long
    InputFileCount = mlngInputFileCount
End Property

Public Property Let InputFileCount(ByVal pvlngInputFileCount As Long)
    mlngInputFileCount = pvlngInputFileCount
End Property

Public Property Get OutputFileCount() As Long
    OutputFileCount = mlngOutputFileCount
End Property

Public Property Let OutputFileCount(ByVal pvlngOutputFileCount As Long)
    mlngOutputFileCount = pvlngOutputFileCount
End Property

Public Property Get InputFile() As Variant
    InputFile = mavntInputFile
End Property

Public Property Let InputFile(ByRef pvavntInputFile As Variant)
    mavntInputFile = pvavntInputFile
End Property

Public Property Get OutputFile() As Variant
    OutputFile = mavntOutputFile
End Property

Public Property Let OutputFile(ByRef pvavntOutputFile As Variant)
    mavntOutputFile = pvavntOutputFile
End Property

Friend Property Get MappedFile() As String()
    MappedFile = mastrMappedFile
End Property

Friend Property Let MappedFile(ByRef pvastrMappedFile() As String)
    mastrMappedFile = pvastrMappedFile
End Property

Public Property Get InputFolder() As String
    InputFolder = mstrInputFolder
End Property

Public Property Let InputFolder(ByVal pvstrInputFolder As String)
    mstrInputFolder = pvstrInputFolder
End Property

Public Property Get OutputFolder() As String
    OutputFolder = mstrOutputFolder
End Property

Public Property Let OutputFolder(ByVal pvstrOutputFolder As String)
    mstrOutputFolder = pvstrOutputFolder
End Property

Friend Function ExecuteFileOperation() As Boolean

    Dim udtFileOperator As SHFILEOPSTRUCT
    Dim strInputFile As String, strOutputFile As String
    Dim lngReturn As Long
    Dim intFlag As Integer

    'Fehlerbehandlung initialisieren
    On Error GoTo err_exit

    'Aus den übergebenen Arrays Strings erzeugen
    strInputFile = CreateFileString("InputFile", "InputFolder", "InputFileCount")
    strOutputFile = CreateFileString("OutputFile", "OutputFolder", "OutputFileCount")

    'Wenn die Anzahl der Eingabe- und Ausgabedateien nicht übereinstimmt
    If InputFileCount <> OutputFileCount Then

        'Wenn die Dateien umbenannt werden sollen
        If FileOperation = FO_RENAME Then

            'Fehlermeldung erzeugen
            Call Err.Raise(Number:=vbObjectError + 2 ^ 0, _
                Description:="The count of files disparate.")

        End If
    End If

    'Wenn die Dateien umbenannt werden sollen
    If FileOperation = FO_RENAME Then

        'Wenn es mehrere Ausgabedateien gibt
        If OutputFileCount > 1 Then

            'Modus wechseln um mehrere Dateien umzubenennen
            FileOperation = FO_MOVE

        End If
    End If

    'Wenn es mehrere Ausgabedateien gibt und das Flag MultiDestFiles nicht gesetzt ist
    If OutputFileCount > 1 And Not MultiDestFiles Then

        'Fehlermeldung erzeugen
        Call Err.Raise(Number:=vbObjectError + 2 ^ 1, _
            Description:="Several output-files but the flag ''MultiDestFiles'' is not set.")

    End If

    'Flag erzeugen
    intFlag = CreateFlag

    'Struktur initialisieren
    With udtFileOperator

        .hwnd = Application.hwnd
        .wFunc = FileOperation
        .pFrom = StrPtr(strInputFile)
        .pTo = StrPtr(strOutputFile)
        .fFlags = intFlag

    End With

    'fFlags an das Ende der Struktur kopieren
    Call RtlMoveMemory(ByVal (VarPtr(udtFileOperator.fFlags) + 2), _
        ByVal VarPtr(udtFileOperator.fAborted), 12)

    'Operation ausführen
    lngReturn = SHFileOperationW(udtFileOperator)

    'fFlags zurückkopieren
    Call RtlMoveMemory(ByVal VarPtr(udtFileOperator.fAborted), _
         ByVal (VarPtr(udtFileOperator.fFlags) + 2), 12)

    'Wenn der Rückgabewert der Operation nicht 0 war (0=kein Fehler bei der Ausführung)
    If lngReturn <> 0 Then

        'Fehlermeldung erzeugen
        Call Err.Raise(Number:=lngReturn, _
            Description:=ErrorDescription(lngReturn))

    'Wenn der Benutzer einen Dateidialog abgebrochen hat
    ElseIf udtFileOperator.fAborted Then

        'Fehlermeldung erzeugen
        Call Err.Raise(Number:=vbObjectError + 2 ^ 2, _
            Description:="The operation was canceled by the user.")

    'Wenn es Namenskonflikte gab und die Namen zugeordnet wurden
    ElseIf udtFileOperator.hNameMaps <> 0 Then

        'Zugeordnete Namen aus der Struktur holen
        Call GetMappedFile(udtFileOperator.hNameMaps)

        'Wenn die zugeordneten Namen angezeigt werden sollen
        If ShowMappedFile Then Call ShowMappedFileToUser

        GoTo exit_function

    End If

    'Erfolg der Operation zurückmelden
    ExecuteFileOperation = True

    Exit Function

err_exit:

    If Err.LastDllError <> 0 Then

        'Wenn die Meldung nicht unterdrückt werden soll, dann DLL_Fehler anzeigen
        If Not NoMessage Then Call MsgBox("Error: " & CStr(Err.LastDllError) & vbLf & vbLf & _
            GetSystemError, vbCritical, "System fault")

    Else

        'Wenn die Meldung nicht unterdrückt werden soll, dann "normale" Fehlermeldung anzeigen
        If Not NoMessage Then Call MsgBox("Error: " & CStr(Err.Number) & vbLf & vbLf & _
            Err.Description, vbCritical, "Program fault")

    End If

exit_function:

    'Struktur der zugeordneten Namen im Speicher löschen
    Call FreeNameMappings(udtFileOperator.hNameMaps)

End Function

Private Sub FreeNameMappings( _
    ByVal prlngMapedFile As Long)

    'wenn Namen zugeordnet wurden dann Struktur im Speicher löschen
    If prlngMapedFile <> 0 Then Call SHFreeNameMappings(prlngMapedFile)

End Sub

Private Function ErrorDescription( _
    ByVal pvblnErrorNumber As Long) As String

    'Rückgabefehler der Operation auswerten

    Select Case pvblnErrorNumber

        Case DE_NOFILE: ErrorDescription = _
            "No source files are found."

        Case DE_NODESTFOLDER: ErrorDescription = _
            "No destination folder found."

        Case DE_SAMEFILE: ErrorDescription = _
            "The source and destination files are the same file."

        Case DE_MANYSRC1DEST: ErrorDescription = _
            "Multiple file paths were specified in the source " & _
            "buffer, but only one destination file path."

        Case DE_DIFFDIR: ErrorDescription = _
            "Rename operation was specified but the destination path " & _
            "is a different directory. Use the move operation instead."

        Case DE_ROOTDIR: ErrorDescription = _
            "The source is a root directory, which cannot be moved or renamed."

        Case DE_OPCANCELLED: ErrorDescription = _
            "The operation was canceled by the user, or silently " & _
            "canceled if the appropriate flags were supplied to SHFileOperation."

        Case DE_DESTSUBTREE: ErrorDescription = _
            "The destination is a subtree of the source."

        Case DE_ACCESSDENIEDSRC: ErrorDescription = _
            "Security settings denied access to the source."

        Case DE_PATHTOODEEP: ErrorDescription = _
            "The source or destination path exceeded or would exceed MAX_PATH."

        Case DE_MANYDEST: ErrorDescription = _
            "The operation involved multiple destination paths, " & _
            "which can fail in the case of a move operation."

        Case DE_FORBIDDENCHARACTERINDEST: ErrorDescription = _
            "Forbidden character in destination path."

        Case DE_INVALIDFILES: ErrorDescription = _
            "The path in the source or destination or both was invalid."

        Case DE_DESTSAMETREE: ErrorDescription = _
            "The source and destination have the same parent folder."

        Case DE_FLDDESTISFILE: ErrorDescription = _
            "The destination path is an existing file."

        Case DE_FILEDESTISFLD: ErrorDescription = _
            "The destination path is an existing folder."

        Case DE_FILENAMETOOLONG: ErrorDescription = _
            "The name of the file exceeds MAX_PATH."

        Case DE_DEST_IS_CDROM: ErrorDescription = _
            "The destination is a read-only CD-ROM, possibly unformatted."

        Case DE_DEST_IS_DVD: ErrorDescription = _
            "The destination is a read-only DVD, possibly unformatted."

        Case DE_DEST_IS_CDRECORD: ErrorDescription = _
            "The destination is a writable CD-ROM, possibly unformatted."

        Case DE_FILE_TOO_LARGE: ErrorDescription = _
            "The file involved in the operation is too " & _
            "large for the destination media or file system."

        Case DE_SRC_IS_CDROM: ErrorDescription = _
            "The source is a read-only CD-ROM, possibly unformatted."

        Case DE_SRC_IS_DVD: ErrorDescription = _
            "The source is a read-only DVD, possibly unformatted."

        Case DE_SRC_IS_CDRECORD: ErrorDescription = _
            "The source is a writable CD-ROM, possibly unformatted."

        Case DE_ERROR_MAX: ErrorDescription = _
            "MAX_PATH was exceeded during the operation."

        Case DE_ERROR_UNKNOWN: ErrorDescription = _
            "An unknown error occurred. This is typically due to an invalid path in the " & _
            "source or destination. This error does not occur on Windows Vista and later."

        Case DE_CANCELBYUSER: ErrorDescription = _
            "Process is canceled by User"

        Case DE_ERRORONDEST: ErrorDescription = _
            "An unspecified error occurred on the destination."

        Case DE_ROOTDIR_ERRORONDEST: ErrorDescription = _
            "Destination is a root directory and cannot be renamed."

    End Select
End Function

Private Function GetSystemError() As String

    Dim strErrorBuffer As String * 200
    Dim lngErrMsg As Long, lngReturn As Long

    'Fehler der DLL lesen
    lngErrMsg = Err.LastDllError

    'Suche in der Systemnachrichtentabelle die Nachrichtendefinition
    lngReturn = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM Or _
        FORMAT_MESSAGE_IGNORE_INSERTS, ByVal 0&, lngErrMsg, _
        LANG_NEUTRAL, strErrorBuffer, Len(strErrorBuffer), 0&)

    'Wenn keine Nachricht gefunden wurde
    If lngReturn = 0 Then

        'Unbekannten Fehler zurückgeben
        GetSystemError = "An unknown systemerror occurred."

    'andernfalls
    Else

        'Spezifischen Fehler zurückgeben
        GetSystemError = Left$(strErrorBuffer, lngReturn - 2)

    End If
End Function

Private Function GetMappedFile( _
    ByVal prlngMapedFile As Long) As String()

    Dim udtMappingInfo As HANDLETOMAPPINGS, udtNameMapping As SHNAMEMAPPING
    Dim lngMappingCounter As Long, ialngFileCounter As Long
    Dim strOriginalName As String, strFinalName As String
    Dim astrFileNames() As String

    'Ersten Dateipointer und Anzahl der zugeordneten Dateien aus der Struktur kopieren
    Call RtlMoveMemory(udtMappingInfo, _
        ByVal prlngMapedFile, LenB(udtMappingInfo))

    'Array für die zugeordneten Dateinamen anlegen
    ReDim astrFileNames(0 To 1, 0 To udtMappingInfo.MappingCounter - 1)

    'Schleife über die zugeordneten Dateinamen in der Struktur
    For lngMappingCounter = 0 To udtMappingInfo.MappingCounter - 1

        'Pointer der zugeordneten Dateinamen und deren Länge aus der Struktur kopieren
        Call RtlMoveMemory(udtNameMapping, ByVal CLng(udtMappingInfo.MappingAddress + _
            LenB(udtNameMapping) * lngMappingCounter), LenB(udtNameMapping))

        'Alten zugeordneten Dateinamen über den Pointer lesen
        astrFileNames(0, lngMappingCounter) = GetStringFromPointer( _
            udtNameMapping.pszOldPath, udtNameMapping.cchOldPath)

        'Neuen zugeordneten Dateinamen über den Pointer lesen
        astrFileNames(1, lngMappingCounter) = GetStringFromPointer( _
            udtNameMapping.pszNewPath, udtNameMapping.cchNewPath)

    Next

    'Array der zugeordneten Dateinamen an Eigenschaft übergeben
    MappedFile = astrFileNames

End Function

Private Function GetStringFromPointer( _
    ByVal pvlngPathPointer As Long, _
    ByVal pvlngPathLen As Long) As String

    Dim strBuffer As String

    'Puffer für den Dateinamen anlegen
    strBuffer = Space$(pvlngPathLen + 1)

    'Dateinamen aus dem Quellstring in den Puffer kopieren
    Call lstrcpynW(StrPtr(strBuffer), pvlngPathPointer, pvlngPathLen + 1)

    'Extrahierten Dateinamen übergeben
    GetStringFromPointer = Left$(strBuffer, pvlngPathLen)

End Function

Private Function CreateFileString( _
    ByVal pvstrFileProperty As String, _
    ByVal pvstrFolderProperty As String, _
    ByVal pvstrFileCountProperty As String) As String

    Dim avntFile As Variant, vntItem As Variant
    Dim strFolder As String
    Dim lngCount As Long

    'Array der Dateinamen aus der Eigenschaft holen
    avntFile = CallByName(Me, pvstrFileProperty, VbGet)

    'Ordner aus der Eigenschaft holen
    strFolder = CallByName(Me, pvstrFolderProperty, VbGet)

    'Wenn die Dateinamen ein Array sind
    If IsArray(avntFile) Then

        'Schleife über alle Einträge im Array
        For Each vntItem In avntFile

            'Wenn der Eintrag nicht leer ist
            If Trim$(vntItem) <> vbNullString Then

                'Eintrag zum String hinzufügen und 0-Charakter anhängen
                CreateFileString = CreateFileString & strFolder & _
                    vntItem & vbNullChar

                'Zähler für die Dateien
                lngCount = lngCount + 1

            End If
        Next

        'Anzahl der Dateien in Eigenschaft schreiben
        Call CallByName(Me, pvstrFileCountProperty, VbLet, lngCount)

        'Am Ende noch einen weiteren 0-Charakter anhängen
        CreateFileString = CreateFileString & vbNullChar

        Exit Function

    'Andernfalls
    Else

        'Fehlermeldung erzeugen
        Call Err.Raise(Number:=vbObjectError + 2 ^ 3, _
            Description:=pvstrFileProperty & " is no array")

    End If
End Function

Private Function CreateFlag() As Integer

    'Aus den gesetzten Eigenschaften das Flag für die Operation zusammenbauen

    If MultiDestFiles Then CreateFlag = CreateFlag Or FOF_MULTIDESTFILES
    If Silent Then CreateFlag = CreateFlag Or FOF_SILENT
    If RenameonCollision Then CreateFlag = CreateFlag Or FOF_RENAMEONCOLLISION
    If NoConfirmation Then CreateFlag = CreateFlag Or FOF_NOCONFIRMATION
    If WantMappingHandle Then CreateFlag = CreateFlag Or FOF_WANTMAPPINGHANDLE
    If AllowUndo Then CreateFlag = CreateFlag Or FOF_ALLOWUNDO
    If FilesOnly Then CreateFlag = CreateFlag Or FOF_FILESONLY
    If SimpleProgress Then CreateFlag = CreateFlag Or FOF_SIMPLEPROGRESS
    If NoConfirmMkDir Then CreateFlag = CreateFlag Or FOF_NOCONFIRMMKDIR
    If NoErrorUI Then CreateFlag = CreateFlag Or FOF_NOERRORUI
    If NoCopySecurityAttributes Then CreateFlag = CreateFlag Or FOF_NOCOPYSECURITYATTRIBUTES
    If NoRecursion Then CreateFlag = CreateFlag Or FOF_NORECURSION
    If NoConnectedElements Then CreateFlag = CreateFlag Or FOF_NOCONNECTEDELEMENTS
    If WantNukeWarning Then CreateFlag = CreateFlag Or FOF_WANTNUKEWARNING
    If NoUI Then CreateFlag = CreateFlag Or FOF_NOUI

End Function

Private Sub ShowMappedFileToUser()

    Dim ialngIndex As Long
    Dim lngOutputCount As Long, lngInputCount As Long
    Dim avntOutputFile As Variant, avntInputFile As Variant
    Dim vntOutputItem As Variant, vntInputItem As Variant
    Dim astrMappedFile() As String
    Dim strOutputFolder As String, strInputFolder As String

    'Die zugeordneten Dateinamen aus der Eigenschaft holen
    astrMappedFile = MappedFile

    'Die Dateien aus den Eigenschaften holen
    avntOutputFile = OutputFile
    avntInputFile = InputFile

    'Die Ordner aus den Eigenschaften holen
    strOutputFolder = OutputFolder
    strInputFolder = InputFolder

    With frmMappedFile.ListBox1

        'Schleife über alle zugeordneten Dateinamen
        For ialngIndex = 0 To UBound(astrMappedFile, 2)

            'Schleife über die Zieldateinamen
            For Each vntOutputItem In avntOutputFile

                'Zähler für die Zieldateinamen
                lngOutputCount = lngOutputCount + 1

                'Wenn die Namen übereinstimmen dann Schleife verlassen
                If strOutputFolder & vntOutputItem = astrMappedFile(0, ialngIndex) Then Exit For

            Next

            'Schleife über die ursprünglichen Dateinamen
            For Each vntInputItem In avntInputFile

                'Zähler für die ursprünglichen Dateinamen
                lngInputCount = lngInputCount + 1

                'Sind die Zähler identisch dann Schleife verlassen
                If lngInputCount = lngOutputCount Then Exit For

            Next

            'Ursprünglicher Dateiname
            Call .AddItem(strInputFolder & vntInputItem)

            'Geplanter Dateiname
            Call .AddItem("Should renamed to -->")
            Call .AddItem(strOutputFolder & vntOutputItem)

            'Tatsächlicher Dateiname
            Call .AddItem("Is rename to -->")
            Call .AddItem(astrMappedFile(1, ialngIndex))

            'Leere Zeile
            Call .AddItem

        Next
    End With

    'Wenn die Meldung nicht unterdrückt werden soll dann anzeigen
    If Not NoMessage Then Call MsgBox("It is not possible to name " & _
        "all files as required.", vbExclamation, "Exclamation")

    'Userform anzeigen
    frmMappedFile.Show

End Sub


Dazu ein paar Beispiel wie die Klasse angesteuert wird:

Code:
Option Explicit

Public Enum FILE_OPERATION
    FO_MOVE = &H1
    FO_COPY = &H2
    FO_DELETE = &H3
    FO_RENAME = &H4
End Enum

Public Sub Beispiel_Move_Liste_in_Tabelle_mit_umbenennen()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation
    Dim avntInputFile As Variant, avntOutputFile As Variant

    With Tabelle1
        avntInputFile = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value2
        avntOutputFile = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value2
    End With

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_MOVE                'Verschieben

        .InputFolder = SOURCE_FOLDER_PATH       'Quellordner
        .OutputFolder = TARGET_FOLDER_PATH      'Zielordner

        .MultiDestFiles = True                  'Mehrere Ausgabedateien
        .RenameonCollision = True               'Kopie erstellen wenn Datei schon existiert
        .WantMappingHandle = True               'Kopie ermitteln
        .NoUI = True                            'Keine Dialoge anzeigen

        .ShowMappedFile = True                  'Kopie anzeigen

        .InputFile = avntInputFile              'Dateinamen
        .OutputFile = avntOutputFile            'Dateinamen

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Move_Alle_Dateien_eines_Ordners_vorhandene_ueberschreiben()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_MOVE                        'Verschieben

        .FilesOnly = True                               'Nur Dateien kopieren
        .NoUI = True                                    'Keine Dialoge anzeigen

        .InputFile = Array(SOURCE_FOLDER_PATH & "*.*")  'Alle Dateien
        .OutputFile = Array(TARGET_FOLDER_PATH)         'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Move_Alle_Excelmappen_eines_Ordners_vorhandene_ueberschreiben()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_MOVE                            'Verschieben

        .NoConfirmation = True                              '"Yes to all" in allen Dialogen

        .InputFile = Array(SOURCE_FOLDER_PATH & "*.xls*")   'Alle Excelmappen
        .OutputFile = Array(TARGET_FOLDER_PATH)             'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Move_kompletten_Ordner_mit_umbenennen()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "D:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_MOVE                            'Verschieben

        .InputFile = Array(SOURCE_FOLDER_PATH)              'Quellordner
        .OutputFile = Array(TARGET_FOLDER_PATH)             'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub



Public Sub Beispiel_Copy_Liste_in_Tabelle_mit_umbenennen()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation
    Dim avntInputFile As Variant, avntOutputFile As Variant

    With Tabelle1
        avntInputFile = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value2
        avntOutputFile = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value2
    End With

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_COPY                'Kopieren

        .InputFolder = SOURCE_FOLDER_PATH       'Quellordner
        .OutputFolder = TARGET_FOLDER_PATH      'Zielordner

        .MultiDestFiles = True                  'Mehrere Ausgabedateien
        .RenameonCollision = True               'Kopie erstellen wenn Datei schon existiert
        .WantMappingHandle = True               'Kopie ermitteln
        .NoUI = True                            'Keine Dialoge anzeigen

        .ShowMappedFile = True                  'Kopie anzeigen

        .InputFile = avntInputFile              'Dateinamen
        .OutputFile = avntOutputFile            'Dateinamen

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Copy_Alle_Dateien_eines_Ordners_vorhandene_ueberschreiben()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_COPY                        'Kopieren

        .FilesOnly = True                               'Nur Dateien kopieren
        .NoUI = True                                    'Keine Dialoge anzeigen

        .InputFile = Array(SOURCE_FOLDER_PATH & "*.*")  'Alle Dateien
        .OutputFile = Array(TARGET_FOLDER_PATH)         'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Copy_Alle_Excelmappen_eines_Ordners_vorhandene_ueberschreiben()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_COPY                            'Kopieren

        .NoConfirmation = True                              '"Yes to all" in allen Dialogen

        .InputFile = Array(SOURCE_FOLDER_PATH & "*.xls*")   'Alle Excelmappen
        .OutputFile = Array(TARGET_FOLDER_PATH)             'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Copy_kompletten_Ordner_mit_umbenennen()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"
    Const TARGET_FOLDER_PATH As String = "D:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_COPY                            'Kopieren

        .InputFile = Array(SOURCE_FOLDER_PATH)              'Quellordner
        .OutputFile = Array(TARGET_FOLDER_PATH)             'Zielordner

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub



Public Sub Beispiel_Delete_Liste_in_Tabelle_kein_Papierkorb()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation
    Dim avntInputFile As Variant

    With Tabelle1
        avntInputFile = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value2
    End With

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_DELETE              'Loeschen

        .InputFolder = SOURCE_FOLDER_PATH       'Quellordner

        .NoUI = True                            'Keine Dialoge anzeigen

        .InputFile = avntInputFile              'Dateinamen
        .OutputFile = Array(vbNullString)       'Leeres Array

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Delete_Liste_in_Tabelle_in_Papierkorb()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation
    Dim avntInputFile As Variant

    With Tabelle1
        avntInputFile = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value2
    End With

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_DELETE              'Loeschen

        .InputFolder = SOURCE_FOLDER_PATH       'Quellordner

        .AllowUndo = True                       'In den Papierkorb verschieben
        .NoConfirmation = True                  '"Yes to all" in allen Dialogen

        .InputFile = avntInputFile              'Dateinamen
        .OutputFile = Array(vbNullString)       'Leeres Array

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Delete_alle_Excelmappen_kein_Papierkorb()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_DELETE                          'Loeschen

        .NoConfirmation = True                              '"Yes to all" in allen Dialogen

        .InputFile = Array(SOURCE_FOLDER_PATH & "*.xls*")   'Dateinamen
        .OutputFile = Array(vbNullString)                   'Leeres Array

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Delete_kompletten_Ordner_in_Papierkorb()

    Const SOURCE_FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_DELETE              'Loeschen

        .AllowUndo = True                       'In den Papierkorb verschieben
        .NoConfirmation = True                  '"Yes to all" in allen Dialogen

        .InputFile = Array(SOURCE_FOLDER_PATH)  'Ordner
        .OutputFile = Array(vbNullString)       'Leeres Array

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub



Public Sub Beispiel_Rename_Liste_in_Tabelle()

    Const FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation
    Dim avntInputFile As Variant, avntOutputFile As Variant

    With Tabelle1
        avntInputFile = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value2
        avntOutputFile = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp)).Value2
    End With

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_RENAME          'Umbenennen

        .InputFolder = FOLDER_PATH          'Quellordner
        .OutputFolder = FOLDER_PATH         'Zielordner

        .MultiDestFiles = True              'Mehrere Ausgabedateien
        .RenameonCollision = True           'Kopie erstellen wenn Datei schon existiert
        .WantMappingHandle = True           'Kopie ermitteln
        .NoUI = True                        'Keine Dialoge anzeigen

        .NoMessage = True                   'Keine Meldungen ausgeben

        .ShowMappedFile = True              'Kopie anzeigen

        .InputFile = avntInputFile          'Alte Dateinamen
        .OutputFile = avntOutputFile        'Neue Dateinamen

        If Not .ExecuteFileOperation Then

            Call MsgBox("Beim Umbenennen der Dateien ist ein Fehler aufgetreten." & vbLf & vbLf & _
                "Bitte sofort den Admin (Tel. 1234) verständigen.", vbCritical, "Dateifehler")

        End If
    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Rename_Einzelne_Datei()

    Const FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_RENAME      'Umbenennen

        .InputFolder = FOLDER_PATH      'Quellordner
        .OutputFolder = FOLDER_PATH     'Zielordner

        .NoUI = True

        .InputFile = Array("Alt.xls")   'Alte Dateinamen
        .OutputFile = Array("Neu.xls")  'Neue Dateinamen

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Rename_Dateinamen_und_Endungen_aendern()

    Const FOLDER_PATH As String = "C:\Test1\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_RENAME                              'Umbenennen

        .InputFolder = FOLDER_PATH                              'Quellordner
        .OutputFolder = FOLDER_PATH                             'Zielordner

        .MultiDestFiles = True                                  'Mehrere Ausgabedateien
        .NoUI = True                                            'Keine Dialoge anzeigen

        .InputFile = Array("AAA.vbs", "BBB.bat", "CCC.csv")     'Alte Dateinamen
        .OutputFile = Array("XXX.txt", "YYY.txt", "ZZZ.txt")    'Neue Dateinamen

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub

Public Sub Beispiel_Rename_Dateinamen_in_mehreren_Ordnern_aendern()

    Const FOLDER_PATH1 As String = "C:\Test1\"
    Const FOLDER_PATH2 As String = "C:\Test2\"

    Dim objFileOperationClass As clsFileOperation

    Set objFileOperationClass = New clsFileOperation

    With objFileOperationClass

        .FileOperation = FO_RENAME                                                  'Umbenennen

        .MultiDestFiles = True                                                      'Mehrere Ausgabedateien
        .NoUI = True                                                                'Keine Dialoge anzeigen

        .InputFile = Array(FOLDER_PATH1 & "AAA.xls", FOLDER_PATH2 & "BBB.xls")      'Alte Dateinamen
        .OutputFile = Array(FOLDER_PATH1 & "XXX.xls", FOLDER_PATH2 & "YYY.xls")     'Neue Dateinamen

        Call .ExecuteFileOperation

    End With

    Set objFileOperationClass = Nothing

End Sub



Ich lade meine Mustermappe mal hoch. Solltest du beim Testen eine Fehlermeldung bekommen in der nur einen Nummer und kein Text steht, dann schreib mir bitte eine PM mit der Nummer und dem Code den du benutzt hast. Ich habe nämlich selbst schon 3 Fehler gefunden welche in der Beschreibung von Microsoft nicht drin waren. So kann ich die Routine zum Auswerten der Fehler ergänzen. Solltest du eine besonders ausgefuchste Variante der Verwendung entdecken, dann schick sie mir per PM, ich werde sie dann, unter nennen deines Namens als Autor, in die Sammlung mit aufnehmen.

_________________
LG Isi

Die Mitgliedschaft im Forum erhöht deine Chance auf eine Antwort von mir um 99,999%



SHFileOperation.zip
 Beschreibung:

Download
 Dateiname:  SHFileOperation.zip
 Dateigröße:  68.32 KB
 Heruntergeladen:  26 mal

Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Hilfe: *T*AW: Dateioperationen mit der SHFileOperation-Funktion 0 Thomas Kirsch 34 13. Nov 2013, 06:28
Thomas Kirsch *T*AW: Dateioperationen mit der SHFileOperation-Funktion
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: JavaScript