Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Johannes72 am April 04, 2013, 17:16:48

Titel: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 04, 2013, 17:16:48
Hallo zusammen

Ich bin schon seit geraumer Zeit auf der Suche nach einer Lösung für mein Problem und möchte mich nun an euch wenden und um Hilfe ersuchen.

Wenn ich eine Datei (.slx, .msg, .doc....) mit Strg-C bzw. V in ein Verzeichnis kopiere möchte ich danach auf einen Button clicken und den Namen dieser Datei in ein Textfeld einfügen. Leider habe ich niergens eine passende Lösung dafür gefunden oder ich hab sie nicht erkannt, kann auch sein.

Hat da jemand eine Lösung für mich,
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 04, 2013, 18:49:26
Hallo Johannes72

Ich versuche es für mich nochmals zu Verstehen was dein Vorhaben ist, du kopierst eine Datei in ein Verzeichnis und nach dem das geschehen ist möchstest du den Namen der Datei per Button in ein Textfeld kopieren.

Schau mal in der VBA Hilfe (F1):  Objekt.GetFileName(Pfadspez)

Bei der Funktion muss aber der Pfad bekannt sein

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 04, 2013, 20:20:59
Hallo

ich glaub dein Vorhaben ist nicht ganz ohne.

Wenn du CtrlC/CtrlV nur über den windowsexplorer machst dann könnte es ggf über das Clipboardformat "CF_HDROP" versuchen. Bei anderen Proggis ( z.b. Outlook ) werden andere Formate in die Zwischenablage geschubst. diese muss man dann aber auch kennen. daher wird ich dir raten dein vorhaben nochmals hinsichtlich der Arbeitsweise (erfassung der Daten) zu überdenken. 
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 05, 2013, 13:59:13
Hallo Johannes72

@daloix hat da schon Recht in der Aussage:
ZitatWenn du CtrlC/CtrlV nur über den windowsexplorer machst dann könnte es ggf über das Clipboardformat "CF_HDROP" versuchen. Bei anderen Proggis ( z.b. Outlook ) werden andere Formate in die Zwischenablage geschubst. diese muss man dann aber auch kennen. daher wird ich dir raten dein vorhaben nochmals hinsichtlich der Arbeitsweise (erfassung der Daten) zu überdenken. 

Habe mal ein wennig gesucht und das per API Aufruf gefunden:
Option Compare Database
Option Explicit

Private Declare Function OpenClipboard Lib "user32" _
  (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard _
  Lib "user32" () As Long
Private Declare Function CloseClipboard _
  Lib "user32" () As Long

Sub ZwischenablageLeeren()
  If OpenClipboard(0&) <> 0 Then
    Call EmptyClipboard              << hier wird die Zwischenablage gelöscht
    Call CloseClipboard
  End If
End Sub


Hier wird die Zwischenablage gelöscht, mit der Funktion "GetClipboardData" kann man Daten aus der Zwischenablage zurück geben lassen
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 05, 2013, 18:49:38
Hallo Leute

Die ganze Sache ich nicht ganz so einfach und sieht so aus.

Ich bekomme Aufträge z.B. per Mail, dann nehme ich dieses Mail und klicke auf kopieren. Dann gehe ich in meine Datenbank und dort habe ich ein Formular in dem unter anderem ein Webbrowser-Steuerelement sich befindet Dieses Steuerelement ist je nach Auftrag auf ein anderes Verzeichnis auf der HD eingerichtet. Dort klicke ich auf einen Button und mir wird diese Datei, eben eine msg oder auch eine xls, pdf..... in dieses Steuerelement eingefügt. So weit so gut und funktioniert auch einwandfrei. Nur für eine komplette Verknüfung fehlt mir noch der Dateiname inkl. Endung weil der Pfad ja ohnehin vorgegeben ist.

Daher die etwas ungewöhnliche Anforderung einen Dateinamen aus einer Datei in der Zwischenablage einzufügen.

@ Stapi:

ich bin zwar eine völlige Niete was programmieren angeht: aber dein Code löscht mir nur den Innhalt des Zwischenspeichers. Ich bin jetzt ein wenig  übervordert damit, weil ich nicht weiß wie mir das helfen soll???

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 05, 2013, 19:05:15
Hallo Johannes72

Du must schon auch was machen, ich schrieb dir:
ZitatHier wird die Zwischenablage gelöscht, mit der Funktion "GetClipboardData" kann man Daten aus der Zwischenablage zurück geben lassen

Es muss also die Funktion "GetClipboardData" in den von mir zur Verfügung gestellten Code eingefügt werden. Und das vor die zeile <<< Zwischenablage löschen. Da ich deine Funktion "Button" nicht kenne must du schon selbst ein wenig Hand anlegen.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 05, 2013, 20:04:15
Nun wenn der Path jetzt bekannt ist dann könntest du z.b. dieses Verzeichnis mittels des Formulartimers und der Funktion Dir versuchen zu überwachen. Aber evtl gibt ja auch das Webbrowser Dingens Events aus, die du ggf auswerten kannst. Alternativ, wenn du Outlook verwendest mußst dich halt mit den Clipboardformaten von Outlook auseinandersetzen und dich einlesen. Auch könntest du versuchen stattdessen Outlook fernzusteuern, damit umgehst du das Wirwardingens mit der Zwischenablage.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 06, 2013, 08:43:05
Guten Morgen

Das ich hier Code einfügen muss ist mir schon klar und ist gleichzeitig mein Problem. Ich hab bisher alles was ich brauchte irgendwie hin bekommen, Teilweise über umwege, wie die Sache mit den Dateien kopieren, teilweise habe ich mir Code irgendwo zusammengesucht und versucht ihn zu verwenden oder sonst irgendwie zu improvisieren. Aber hier stehe ich einfach an. Ich versuche schon seit Tagen dieses Problem zu lösen oder zu umgehen, schaffe es aber nicht. Die Funktion "GetClipboardData" war mir völlig unbekannt. Hab jetzt im www gesucht und einiges darüber gelesen. Aber ich hab nur, so hab ich das verstaden, Funktionen gefunden in denen ich div. Datein aus dem Clipboard einfügen kann und nichts über die Dateinamen.

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: bahasu am April 06, 2013, 09:31:19
Hi Johannes,

um die Pfad + Dateinamen aus dem Zwischenspeicher im Listenfeld des Formulars (siehe Anhang) anzuzeigen, sind die folgenden Schritte notwendig:
1. Im Explorer eine oder mehrere Dateien markieren
2. mit strg-C in den Zwischenspeicher bringen
3. zur access-Anwendung wechseln
4. Button anklicken

Entspricht das Deinen Vorstellungen?

Harald

PS
Im VBA-Teil des Formulars habe ich Links aufgeführt, die mir geholfen hatten, den Zwischenspeicher auszuwerten.
Ich hatte ein Listenfeld und kein Textfeld gewählt, um auch mehr als eine markierte Datei aunzuzeigen. Bitte ggf. anpassen



[Anhang gelöscht durch Administrator]
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 06, 2013, 13:22:06
Hallo

Ja, genau so hätte ich mir das vorgestellt.

Aber Anhang sehe ich keinen.......
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 06, 2013, 13:23:22
Ups, sorry, wer lesen kann ist im Vorteil.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 06, 2013, 13:38:22
Hallo Johannes

Wenn es das ist so wie du es gewünscht hast dann bitte im ersten Beitrag auf "gelöst" setzen.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 06, 2013, 13:47:07
He, super

Funktioniert auf anhieb, genau das was ich gesucht habe, jetzt brauch ich nur noch dran zu drehen daß er mir nur eine Datei einfügt.

Super

Vielen vielen Dank
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 06, 2013, 18:48:39
Hallo noch einmal

Ich habe nun fast den gesamten Nachmittach damit verbracht diese Funktion einzubauen und habe es nicht geschaft. Leider habe ich da "2 Haare in der Suppe" gefuden die ich nicht raus bringe. Leider, da hab ich mich zu früh gefreut heute Morgen.

Das erste Haar: der Pfad den er mir in das Listenfeld einfügt ist der ursprüngliche Pfad = Quellpfad und nicht der Pad wo die Datei hinkopiert wurde. Würde sich wohl am leichtesten beheben lassen wenn nicht der gesamte Pfad in das Listenfeld geschriebe wird sondern nur der Filename. Ich bin aber nicht drauf gekommen was ich da ändern muss.

Das zweite Haar werde ich wohl noch hin bekommen, da geht es darum das der Pfad nicht in meiner Tabelle gespeichert wird, warum weiss ich noch nicht muss ich mir erst genauer anschauen, könnte aber mit dem Listenfeld zusammenhängen, kann das sein???
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 06, 2013, 19:21:38
Zitatder Pfad den er mir in das Listenfeld einfügt ist der ursprüngliche Pfad = Quellpfad und nicht der Pad wo die Datei hinkopiert wurde.
Warum sollte es auch so sein? Zum Zeitpunkt des Drückens von ctrl/c eird die zwischenablage befüllt, der Zielpath ist hier ja dann noch nicht bekannt. auch wird mit dem drücken von ctrl/v die zwischenablage nicht geändert. Aber du hattes ja geschrieben das das webformular den path kennt, du brauchst nur den dateinamen in der funktion abschneiden und mit dem zielpath verknüpfen.
hier mal eine Möglichkeit wie du den Dateinamen aus einem Filepathstring extrahierst
Function FileFromFilePath(ByVal sfilepath As String) As String
   Dim v As Variant
   If Len(sfilepath) > 0 Then
       v = Split(sfilepath, "\")
       FileFromFilePath = v(UBound(v))
   End If
End Function


Da du jetzt ja weist wie das Clipboard ausgelesen wird, kannst du ja mittels VBA (dragnDrop oder Buttonlösung) Access das Kopieren der Dateien überlassen da der Zielpath wie du schon erwähntest bekannt ist.

ZitatDas zweite Haar werde ich wohl noch hin bekommen, da geht es darum das der Pfad nicht in meiner Tabelle gespeichert wird, warum weiss ich noch nicht muss ich mir erst genauer anschauen, könnte aber mit dem Listenfeld zusammenhängen, kann das sein???
Da wir deinen Code nicht kenne kann dazu jetzt auch nix gesagt werden,  das schlichte befüllen eines Listenfeldes befüllt noch lange nicht deine Tabellen.

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: bahasu am April 06, 2013, 19:23:22
Hi Johannes,

anbei eine Version, die den Dateinamen in einer Tabelle speichert.
Im Beispiel zuvor hatte ich die ermittelten Infos in einem ungebundenen Steuerelement angezeigt. Jetzt wird ein gebundenes verwendet.

Inwieweit der Zielpfad zu ermitteln ist, ist mir unbekannt: siehe auch Bemerkungen von daolix.


Alternativ ist auch ein anderes Vorgehen denkbar:
1. In access den Quell-Ordner und die Datei aussuchen und den Ziel-Ordner festlegen + speichern
2. per Klick oder anderem Kommando die selektierte Datei per "SHFileOperation" kopieren.

Diese Variante hat die Eigenschaft bzw. Vorteil, dass Du alles aus einer Umgebung machen kannst und nicht zwischen Explorer und access wechseln musst.

Harald

[Anhang gelöscht durch Administrator]
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 07, 2013, 09:46:11
Hallo und guten Morgen

Ich hab mir nur die beinen letzten Tips kurz angeschaut und glaube jetzt mir eine Lösung pasteln zu können.

Leider habe ich heute keine Zeit sondern werd das in den nächsten Tagen machen. Auf jeden Fall möchte ich mir noch einmal vielmals bei euch für die Hilfe bedanken. Diesen Code hätte ich sonst niemals zustade gebracht.

Vielen vielen Dank an alle.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 14, 2013, 08:06:58
Hallo Leute

Ich möchte mich bei euch für eure Hilfe bedanken. Ich habe nun das ganze in meine Datenbank eingebunden und es funktioniert einfach super. (Ich klicke auf einen Button und die Datei wird in ein Verzeichnis kopiert und der Name samt Pfad in mein Textfeld eingefügt.) alles genauso wie ich es mir vogestellt hatte.

Allerdings hätte ich noch eine Frage: Kann man das auch dahigehend ändern daß auch Mails also msg-Dateien erkannt werden. Wenn ich aus Outlook ein Mail in die Zwischenablage kopiere wird sie icht erkannt.

Kann mir da bitte noch einmal jemand helfen?

Danke
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 14, 2013, 18:40:40
Hallo

bei Outlookmessages (msg) welche per CtrlC/CtrlV kopiert wurden, werden die Dateinamen in den Clipboardformaten  FileGroupDescriptor (49428) / FileGroupDescriptorW (49429) abgelegt. Auch hier gilt aber, der Zielordner ist nicht bekannt. Zudem liegt die Information dazu in einer UDT samt Zähler und Array vor. Du musst jetzt prüfen welche Clipboardformate vorliegen ( FileGroupDescriptor oder CF_HDROP, diese kannst du mit Hilfe der Funktion EnumClipboardFormats ermitteln) und dann die entsprechende Ausleseroutine ausführen.




Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 15, 2013, 07:00:58
Guten Morgen

Das sind die beiden codes die ausgeführt werde:

Public Function GetClipboardFiles(ByRef Files() As String) As Long
      Dim nHandle As Long
    Dim nCount As Long
    Dim nLen As Long
    Dim sFile As String

    Dim nFormat As Long
    Dim hGlobal   As Long
    Dim i As Long

    ' Prüfen, ob Dateien in der Zwischenablage vorhanden
    If IsClipboardFormatAvailable(CF_HDROP) > 0 Then
        ' Zwischenablage öffnen
        If OpenClipboard(0) <> 0 Then
        ' Handle holen
            nHandle = GetClipboardData(CF_HDROP)
            If nHandle <> 0 Then
                ' jetzt alle Dateinamen ermitteln
                nCount = DragQueryFile(nHandle, -1, vbNullString, 0)
                ReDim Files(nCount - 1)
                For i = 0 To nCount - 1
                    nLen = DragQueryFile(nHandle, i, vbNullString, 0)
                    sFile = String$(nLen + 1, 0)
                    nLen = DragQueryFile(nHandle, i, sFile, Len(sFile))
                    Files(i) = Left$(sFile, nLen)
                Next i
            End If

            ' Zwischenablage schließen
            CloseClipboard
        End If
    End If

    GetClipboardFiles = nCount
End Function




und



Private Sub FileSuchen_Click()
    Dim nCount As Long
    Dim sFiles() As String
    Dim Temp As String
   
    nCount = GetClipboardFiles(sFiles())
   
    If nCount > 0 Then
        Temp = sFiles(0)
        If InStr(Temp, "\") > 0 Then Temp = Mid(Temp, InStrRev(Temp, "\") + 1)
        If InStr(Temp, ":") > 0 Then Temp = Mid(Temp, InStrRev(Temp, ":") + 1)
        Me.DateiName = (Text29) & "\" & Temp
        DoCmd.GoToControl "Webbrowser3"
        SendKeys "^v", True

    Else
        MsgBox "Zwischenablage enthält keine Dateien!", vbInformation
    End If
End Sub

Die sind im Grunde genau die Codes die oben gepostet wurden und sind nur leicht geändert. Was muss ich ändern.??? GetClipboardData(CF_HDROP) steht ja schon drinnen.

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 15, 2013, 15:23:57
Hier mal ne Funktion, doppelte Deklarationen must du löschen, fehlende hinzufügen.
Code (Wie immer, alles ohne Gewähr) [Auswählen]
'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Private Type FDShort '// aka FILEDESCRIPTOR
    bIchHabJetztKeineLustdieApiUDTsZuSuchen(71) As Byte
    bFile(259) As Byte
End Type

Private Type FGD
    cItems As Long
    fd(0 To 0) As FDShort
End Type

'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Declare Function OpenClipboard Lib "USER32.DLL" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "USER32.DLL" () As Long
Declare Function GetClipboardData Lib "USER32.DLL" (ByVal uFormat As Long) As Long
Declare Function GlobalLock Lib "KERNEL32.DLL" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "KERNEL32.DLL" (ByVal hMem As Long) As Long
Declare Sub CopyMemory Lib "KERNEL32.DLL" Alias "RtlMoveMemory" (ByVal pDestination As Long, ByVal pSource As Long, ByVal cbLength As Long)


Function FileNameFromFileGroupDescriptor(byref sf() as string) As long
    Dim lHndl As Long
    Dim pMem As Long
    Dim lItems As Long
    Dim fd() As FDShort
    Dim i As Long
    If OpenClipboard(0) Then
        lHndl = GetClipboardData(49428)
        If lHndl Then
            pMem = GlobalLock(lHndl)
            If pMem Then
                CopyMemory VarPtr(lItems), ByVal pMem, 4
                If lItems Then
                    ReDim sf(1 To lItems)
                    ReDim fd(1 To lItems)
                    CopyMemory VarPtr(fd(1)), ByVal pMem + 4, lItems * Len(fd(1))
                    For i = 1 To lItems
                        sf(i) = VBA.StrConv(fd(i).bFile, vbUnicode)
                        sf(i) = Left$(sf(i), InStr(sf(i), Chr$(0)) - 1)
                    Next
                    FileNameFromFileGroupDescriptor = lItems
                End If
            End If
        End If
    End If
    If pMem Then GlobalUnlock pMem
    CloseClipboard
End Function


deine Funktion must du entsprechend erweitern:

Public Function GetClipboardFiles(ByRef Files() As String) As Long
    ....
    If IsClipboardFormatAvailable(CF_HDROP) > 0 Then
        ...
    elseif  IsClipboardFormatAvailable(49428) then
        nCount = FileNameFromFileGroupDescriptor(Files())
    end if
    GetClipboardFiles = nCount
end Function



Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 16, 2013, 17:43:33
Hallo

Der erste Teil ist mir klar, da brauch ich nur meinen Code dadurch ersetzen.... Das schaffe ich.

Für den zweiten Teil bin ich aber zu doof. Ich komm nicht drauf wie ich den dort einsetzten muß.

Bitte bitte, würdest Du mir da noch einmal helfen??

Vielen Dank
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 17, 2013, 14:41:22
Ich weis jetzt nicht was du genau meinst, da von "ersetzen" nie die Rede war, du solltest den Code nur hinzufügen, und deine Funktion GetClipboardFiles entsprechend anpassen.
Hier mal das ganze nochmal komplett.

Code (erhebt keinen Anspruch auf Vollständigkeit) [Auswählen]

'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Private Type FDShort '// aka FILEDESCRIPTOR
   bIchHabJetztKeineLustdieApiUDTsZuSuchen(71) As Byte
   bFile(259) As Byte
End Type

Private Type FGD
   cItems As Long
   fd(0 To 0) As FDShort
End Type

'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Declare Function OpenClipboard Lib "USER32.DLL" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "USER32.DLL" () As Long
Declare Function GetClipboardData Lib "USER32.DLL" (ByVal uFormat As Long) As Long
Declare Function GlobalLock Lib "KERNEL32.DLL" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "KERNEL32.DLL" (ByVal hMem As Long) As Long
Declare Sub CopyMemory Lib "KERNEL32.DLL" Alias "RtlMoveMemory" (ByVal pDestination As Long, ByVal pSource As Long, ByVal cbLength As Long)
Private Declare Function EnumClipboardFormats Lib "USER32.DLL" (ByVal uFormat As Long) As Long
Private Declare Function GetClipboardFormatName Lib "USER32.DLL" Alias "GetClipboardFormatNameW" (ByVal uFormat As Long, ByVal lpString As Long, ByVal nMaxCount As Long) As Long



Function FileNameFromFileGroupDescriptor(ByRef sf() As String) As Long
    Dim lHndl As Long
    Dim pMem As Long
    Dim lItems As Long
    Dim fd() As FDShort
    Dim i As Long
    Dim f As Long
   
    f = GetClipboardFormatAvailableByName("FileGroupDescriptor")
    If f Then
        If OpenClipboard(0) Then
            lHndl = GetClipboardData(f)
            If lHndl Then
                pMem = GlobalLock(lHndl)
                If pMem Then
                    CopyMemory VarPtr(lItems), ByVal pMem, 4
                    If lItems Then
                        ReDim sf(1 To lItems)
                        ReDim fd(1 To lItems)
                        CopyMemory VarPtr(fd(1)), ByVal pMem + 4, lItems * Len(fd(1))
                        For i = 1 To lItems
                            sf(i) = VBA.StrConv(fd(i).bFile, vbUnicode)
                            sf(i) = Left$(sf(i), InStr(sf(i), Chr$(0)) - 1)
                        Next
                        FileNameFromFileGroupDescriptor = lItems
                    End If
                End If
            End If
        End If
        If pMem Then GlobalUnlock pMem
        CloseClipboard
    End If
End Function


'// ----------------------------------------------------------------------------------------------------------------
'//  Deine Funktionen
'// ----------------------------------------------------------------------------------------------------------------
Public Function GetClipboardFiles(ByRef Files() As String) As Long
     Dim nHandle As Long
   Dim nCount As Long
   Dim nLen As Long
   Dim sFile As String

   Dim nFormat As Long
   Dim hGlobal   As Long
   Dim i As Long

   ' Prüfen, ob Dateien in der Zwischenablage vorhanden
   If IsClipboardFormatAvailable(CF_HDROP) > 0 Then
       ' Zwischenablage öffnen
       If OpenClipboard(0) <> 0 Then
       ' Handle holen
           nHandle = GetClipboardData(CF_HDROP)
           If nHandle <> 0 Then
               ' jetzt alle Dateinamen ermitteln
               nCount = DragQueryFile(nHandle, -1, vbNullString, 0)
               ReDim Files(nCount - 1)
               For i = 0 To nCount - 1
                   nLen = DragQueryFile(nHandle, i, vbNullString, 0)
                   sFile = String$(nLen + 1, 0)
                   nLen = DragQueryFile(nHandle, i, sFile, Len(sFile))
                   Files(i) = Left$(sFile, nLen)
               Next i
           End If

           ' Zwischenablage schließen
           CloseClipboard
       End If
   '// ----------------------------------------------------------------------------------------------------------------
   '//  Deinen Code erweitern
   '// ----------------------------------------------------------------------------------------------------------------
   ElseIf IsClipboardFormatAvailableByName("FileGroupDescriptor") Then
       nCount = FileNameFromFileGroupDescriptor(Files())
   '// ----------------------------------------------------------------------------------------------------------------
   End If

   GetClipboardFiles = nCount
End Function



Private Sub FileSuchen_Click()
   Dim nCount As Long
   Dim sFiles() As String
   Dim Temp As String
 
   nCount = GetClipboardFiles(sFiles())
 
   If nCount > 0 Then
       Temp = sFiles(lbound(sFiles))
       If InStr(Temp, "\") > 0 Then Temp = Mid(Temp, InStrRev(Temp, "\") + 1)
       If InStr(Temp, ":") > 0 Then Temp = Mid(Temp, InStrRev(Temp, ":") + 1)
       Me.DateiName = (Text29) & "\" & Temp
       DoCmd.GoToControl "Webbrowser3"
       SendKeys "^v", True

   Else
       MsgBox "Zwischenablage enthält keine Dateien!", vbInformation
   End If
End Sub

'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Function GetClipboardFormatAvailableByName(ByVal sFormat As String) As Long
    Dim f As Long
    If OpenClipboard(0) Then
        f = EnumClipboardFormats(0)
        Do While f
            If ClipBoardGetFormatName(f) = sFormat Then
                GetClipboardFormatAvailableByName = f
                Exit Do
            End If
            f = EnumClipboardFormats(f)
        Loop
        CloseClipboard
    End If
End Function


'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Function IsClipboardFormatAvailableByName(ByVal sFormat As String) As Boolean
    Dim f As Long
    If OpenClipboard(0) Then
        f = EnumClipboardFormats(0)
        Do While f
            If ClipBoardGetFormatName(f) = sFormat Then
                IsClipboardFormatAvailableByName = True
                Exit Do
            End If
            f = EnumClipboardFormats(f)
        Loop
        CloseClipboard
    End If
End Function

'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
Function ClipBoardGetFormatName(f As Long) As String
    Select Case f
        Case 1: ClipBoardGetFormatName = "CF_TEXT"
        Case 2: ClipBoardGetFormatName = "CF_BITMAP"
        Case 3: ClipBoardGetFormatName = "CF_METAFILEPICT"
        Case 4: ClipBoardGetFormatName = "CF_SYLK"
        Case 5: ClipBoardGetFormatName = "CF_DIF"
        Case 6: ClipBoardGetFormatName = "CF_TIFF"
        Case 7: ClipBoardGetFormatName = "CF_OEMTEXT"
        Case 8: ClipBoardGetFormatName = "CF_DIB"
        Case 9: ClipBoardGetFormatName = "CF_PALETTE"
        Case 10: ClipBoardGetFormatName = "CF_PENDATA"
        Case 11: ClipBoardGetFormatName = "CF_RIFF"
        Case 12: ClipBoardGetFormatName = "CF_WAVE"
        Case 13: ClipBoardGetFormatName = "CF_UNICODETEXT"
        Case 14: ClipBoardGetFormatName = "CF_ENHMETAFILE"
        Case 15: ClipBoardGetFormatName = "CF_HDROP"
        Case 16: ClipBoardGetFormatName = "CF_LOCALE"
        Case 17: ClipBoardGetFormatName = "CF_DIBV5"
        Case 18: ClipBoardGetFormatName = "CF_MAX"  ' varies by Windows version
        Case &H80: ClipBoardGetFormatName = "CF_OWNERDISPLAY"
        Case &H81: ClipBoardGetFormatName = "CF_DSPTEXT"
        Case &H82: ClipBoardGetFormatName = "CF_DSPBITMAP"
        Case &H83: ClipBoardGetFormatName = "CF_DSPMETAFILEPICT"
        Case &H8E: ClipBoardGetFormatName = "CF_DSPENHMETAFILE"
        Case Else
            Dim sz As String
            Dim l As Long
            sz = String$(260, 0)
            l = GetClipboardFormatName(f, StrPtr(sz), Len(sz))
            ClipBoardGetFormatName = Left$(sz, l)
    End Select
End Function








Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 17, 2013, 19:30:11
Hallo

Als erstes möchte ich mich noch einmal für Deine Hilfe bedanken um dann auch gleich wieder ungut zu werden...... Ich schaffe es nicht Deinen Code zum laufen zu bringen..... Im Anhang ist eine Fehlermeldung die ich nicht und nicht weg bringe.

Bitte kannst Du mir wieder helfen?

Vielen Dank

[Anhang gelöscht durch Administrator]
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 17, 2013, 21:06:07
hallo
wird wohl daran liegen das du den code einfach nur kopiert und ausgeführt hast, ohne ihn vorher zu kompilieren, denn dann wäre dort schon eine informativere Fehlermeldung erschienen. Also Code vor ausführung immer kompilieren.

anbei ne kleine DB, ohne Verwendung des WebBrowserDingens, da sich mir die Verwendung dessen nicht erschliesst.

Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 18, 2013, 18:02:41
Hallo

Erstens möchte ich mich wieder für Deine Bemühungen bedanken. Ich hab Deine Datei noch nicht versucht und werde wohl heute auch nicht dazu kommen.

Zur Erklärung mit dem Webbrowser-Steuerelement. Damit ich die Dateien die ich iin der Zwischenablage habe in ein vorher in der DB definiertes Verzeichnis auf der HD kopieren kann, habe ich mir so ein Steuerelement erstellt das auf eben dieses Verzeichnis verlinkt ist und dort werden die Dateien eingefügt. Ist möglicherweise nicht der optimale Weg für einen Programmierer.... tja, ich bin nun mal keiner und es funktioniert für meine Verwendung.

Danke
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 19, 2013, 15:44:32
Hallo

Ich habe heute den halben Vormittag damit verbracht den Code den ich von Deiner DB kopiert habe zum laufen zu bringen. Es ist mir leider nicht gelungen.

Ich hab zuerst Deine DB versucht und es hat auch dort nicht geglappt.

Wenn ich eine Datei einfügen möchte, sagt er immer "Keine Datei in Zwischenschenspeicher". Ich habs dann aber dennoch versucht den Code so hin zu bekommen das es funktioniert, habs aber nicht geschaft.

Funktioniert Dein Beispiel bei Dir?
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 19, 2013, 16:33:52
ZitatIch hab zuerst Deine DB versucht und es hat auch dort nicht geglappt.

Wenn ich eine Datei einfügen möchte, sagt er immer "Keine Datei in Zwischenschenspeicher". Ich habs dann aber dennoch versucht den Code so hin zu bekommen das es funktioniert, habs aber nicht geschaft.

Funktioniert Dein Beispiel bei Dir?
de­fi­ni­tiv ja. Wenn ich eine Outlookmessage oder angehängte Datei via ctrl/C aus Outlook kopiere und in der DB die Zwischenablage per klick auslese, wird der Dateiname (subject.msg oder Anhangs.Datei) angezeigt. Warum es bei dir nicht läuft kann ich nicht sagen.

Alternativ solltest du versuchen, sofern es die Firmenrestriktionen erlauben, Outlook über COM anzusteuern, und den Posteingang via VBA auslesen.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 19, 2013, 17:30:02
Hallo

Leider. ich habs jetzt auch auf einem anderen Rechner versucht, das Beispiel von dir funktioniert nicht bei mir.

Nachdem ich mich nun seit Tagen mit diesem Problem beschäftige und es nicht schaffe es zu lösen, hätte ich noch einen anderen Lösungsansatz. Von dem ich allerdings genau so wenig eine Idee habe wie ich das umsetzten soll.

Die Idee ist folgende:

Wenn ich den Code

            DoCmd.GoToControl "Webbrowser3"
            SendKeys "^v", True

ausführe, wird die Datei in ein Webbrowser-Steuerelement kopiert und ist dort dann auch markiert. Kann mann mit einem VB-Code eine markierte Datei umbenennen??????

Hab da jetzt eine ganze Zeit lang danach gesucht aber nur den mir bekannten Befehl "rename" gefunden. Doch hier braucht man nicht nur den neuen Namen sondern eben auch den alten.... Und damit wäre ich wieder bei dem Problem das ich jetzt habe. Würde es dafür eine einfache Lösung geben???

Also nocheinmal in Kurzversion:

Datei einfügen und einen beliebigen Dateinamen den man nicht kennt umbenennen....

Eingetlich ganz einfach, wenn´s funktioniert


Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 19, 2013, 19:22:32
okay hab vorhergehendse bsp mal aktualisiert. Aktualisierte Version siehe anhang



[Anhang gelöscht durch Administrator]
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 20, 2013, 08:58:02
Guten Morgen

Habe den neuen Code schon ausprobiert und möchte mich noch einmal bei dir bedanken. Das hätte ich selber nie geschafft.

Ich kann jetzt auf "Knopfdruck" die .msg´s einfügen so wie ich es wollte.

Andere Dateien funktionieren zwar nicht, da muß ich noch versuchen die Funktion zu ändern. Werde ich heute am Nachmittag/Abend versuchen. Das "Hauptproblem" hatte ich einfach mit den Mails.... das habe ich tagelang nicht geschafft.

Vielen Dank für Deine Hilfe.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 21, 2013, 12:04:51
Hallo Johannes72

Das verstehe ich aktuell leider nicht.
ZitatAndere Dateien funktionieren zwar nicht, da muß ich noch versuchen die Funktion zu ändern. Werde ich heute am Nachmittag/Abend versuchen
Das war wenn ich erinnern darf doch dein Start Beitrag, der von @bahasu auch mit Lösungsvorschlägen zu deiner Zufriedenheit gelöst worden ist.
Dann folgte die Problematic Dateien das aus der E-Mail einzufügen, auch hier für gab es von @daloix Lösungen.
Ich verfolge nun den Beitrag von beginn und stelle für mich fest das du scheinbar den Umfang deines Startbeitrag hier Stückweise Preis gibst, dann per copy&paste der Code in deine Datenbak kopiert wird und du erwartest das er Problemlos ohne Anpassung von deiner Seite läuft.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 22, 2013, 07:08:00
Hallo

Es sieht so aus. Bei der ersten Version hat das einfügen von .pdf´s usw. funktioniert aber nicht von .msg´s. Bei der letzten Version ist es genau umgekehrt. Darum habe ich geschrieben, daß ich versuchen werde den Code anzupassen und ansonsten werde ich einfach 2 Schaltflächen machen (eine für Mails und eine andere) Daß ich mir den Code anpassen muss ...... tja, werde ich natürlich im Rahmen meiner Möglichkeiten versuchen. Auf jeden Fall kann ich mit den nun verhandenen Möglichkeiten mir was bauen mit dem ich auf jeden Fall leben kann.

Das ursprüngliche Problem war eigentlilch ja "ohnehin nur" den Namen der Dateien in ein Feld zu bekommen. Das ist dank eurer Hilfe ja gelungen.
Das es jetzt möglicherweise nicht die optimale Lösung ist die es geben würde, ist schon möglich. Aber, ich komme mit dem was ich jetzt habe sehr gut aus, das ein oder andere kann ich mir möglichkerweise auch noch selber ändern und ich möchte euch nicht über Wochen mit meinen "Wünschen" quälen. 

Und darum noch einmal:
Vielen Dank für eure Hilfe.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 22, 2013, 15:05:56
Hallo Johannes72

du hattest hier (http://www.access-o-mania.de/forum/index.php?topic=17045.msg98394#msg98394) Code gepostet (von bahasu entwickelt) der die anderen Dateien ja zu deiner Zufriedenheit erfasst. Da dieses von dir gepostete Codefragment unvollständig ist, fehlende Deklarationen, und ich diese jetzt nicht suchen wollte, hab ich Teile des Codes auskommentiert. Ich hab nur das ursprünglich Codefragment erweitert. Deine Aufgabe ist es nun diese Auskommentierungen wieder rückgänging zu machen durch entfernen der ' in den entsprechenden Zeilen.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 22, 2013, 18:06:11
Hallo

Ist es wirklich so schwierig oder bin ich einfach zu doof. Ich habe es heute Nachmittag nicht geschafft aus 2 Formularen den Code in ein Formaular zu kopieren so das ich zwei Schaltflächen habe die entweder Mails oder andere Dateien einfügen.

Ich habe den Code des Formulars umkopiert und die Funktion und die Schaltfläche umgetauft..... Der Butten heiß sicher so wie im Code benannt.... keine Funktion.


Wenn ich die Komentare auflöse bekomme ich Fehlermeldung im Anhang....

Ich bin tatsächlich zu doof oder ich steh so derart auf der Leitung das ich es nicht schaffe.

[Anhang gelöscht durch Administrator]
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Stapi am April 22, 2013, 18:10:12
Hallo Johannes72

Möchte bitte festhalten doof ist hier keiner.
Dein angefügter Anhang ist von mir zu öffnen aber troz Brille kann ich es ganz sicher nicht im Ansatz lesen, wie hier die Fehlermeldung lautet.
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: daolix am April 22, 2013, 18:21:44
Ich habs befürchtet
da fehlt wahrscheinlich die Deklaration für DragQueryFile, welche mit dem Code von bahasu kommt. such mal im Code von bahasu folgend oder ähnlich Zeile und kopiere diese:
DECLARE FUNCTION DragQueryFile LIB "SHELL32.DLL" ALIAS "DragQueryFileA" (BYVAL hDrop AS long, BYVAL uiFile AS long, byval lpStr AS string, BYVAL cch AS long) AS long

ps: Den Anhang konnte ich jetzt auch nicht lesen.




Titel: Re: Dateiname aus Zwischenablage
Beitrag von: bahasu am April 22, 2013, 18:31:58
Hi,

bei copy & paste bitte auch die Deklarationen einsetzen:
Hier der Auszug aus meinem Code mit Literaturangabe:
'http://www.vbarchiv.net/tipps/details.php?id=2115

' benötigte API-Deklarationen
    Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
    Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal HDROP As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
    Private Declare Function CloseClipboard Lib "user32" () As Long
    Private Const CF_HDROP As Long = 15


Harald
Titel: Re: Dateiname aus Zwischenablage
Beitrag von: Johannes72 am April 23, 2013, 16:03:13
Ja, daran hat´s gelegen.

Die Zeile:  DragQueryFile Lib "shell32.dll" ..... hat gefehlt. Jetzt funktiniert alles genau wie ich es wollte.


Vielen, vielen Dank.