我正在尝试在 VBA 宏中加载一个从资源管理器窗口复制的文件。
我可以使用 DataObject::GetFromClipboard 轻松地从剪贴板获取数据,但 DataObject 的 VBA 接口(interface)似乎没有处理纯文本以外的任何其他格式的方法。只有 GetText 和 SetText 方法。
如果我无法直接从 DataObject 获取文件流,文件名也可以,所以也许 GetText 可能被迫返回剪贴板上的文件名?
在任何地方都找不到 VBA 的文档。 :(
也许有人可以向我指出具有此类功能的 VBA API 包装类?
最佳答案
这对我有用(在模块中);
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal uFormat As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal uFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal drop_handle As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
Private Const CF_HDROP As Long = 15
Public Function GetFiles(ByRef fileCount As Long) As String()
Dim hDrop As Long, i As Long
Dim aFiles() As String, sFileName As String * 1024
fileCount = 0
If Not CBool(IsClipboardFormatAvailable(CF_HDROP)) Then Exit Function
If Not CBool(OpenClipboard(0&)) Then Exit Function
hDrop = GetClipboardData(CF_HDROP)
If Not CBool(hDrop) Then GoTo done
fileCount = DragQueryFile(hDrop, -1, vbNullString, 0)
ReDim aFiles(fileCount - 1)
For i = 0 To fileCount - 1
DragQueryFile hDrop, i, sFileName, Len(sFileName)
aFiles(i) = Left$(sFileName, InStr(sFileName, vbNullChar) - 1)
Next
GetFiles = aFiles
done:
CloseClipboard
End Function
用途:
Sub wibble()
Dim a() As String, fileCount As Long, i As Long
a = GetFiles(fileCount)
If (fileCount = 0) Then
MsgBox "no files"
Else
For i = 0 To fileCount - 1
MsgBox "found " & a(i)
Next
End If
End Sub
关于file - VBA:从剪贴板读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2913373/