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,
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
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.
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 SubHier wird die Zwischenablage gelöscht, mit der Funktion "GetClipboardData" kann man Daten aus der Zwischenablage zurück geben lassen
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???
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.
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.
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.
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]
Hallo
Ja, genau so hätte ich mir das vorgestellt.
Aber Anhang sehe ich keinen.......
Ups, sorry, wer lesen kann ist im Vorteil.
Hallo Johannes
Wenn es das ist so wie du es gewünscht hast dann bitte im ersten Beitrag auf "gelöst" setzen.
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
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???
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 FunctionDa 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.
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]
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.
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
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.
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.
Hier mal ne Funktion, doppelte Deklarationen must du löschen, fehlende hinzufügen.
'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
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
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
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.
'// ----------------------------------------------------------------------------------------------------------------
'//
'// ----------------------------------------------------------------------------------------------------------------
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
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]
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.
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
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?
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?
definitiv 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.
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
okay hab vorhergehendse bsp mal aktualisiert. Aktualisierte Version siehe anhang
[Anhang gelöscht durch Administrator]
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.
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.
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.
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.
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]
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.
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.
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
Ja, daran hat´s gelegen.
Die Zeile: DragQueryFile Lib "shell32.dll" ..... hat gefehlt. Jetzt funktiniert alles genau wie ich es wollte.
Vielen, vielen Dank.