Ret*_*zan 4 clipboard vba file
我正在尝试在已经从资源管理器窗口复制的VBA宏中加载文件.
我可以使用DataObject :: GetFromClipboard轻松地从剪贴板获取数据,但是DataObject的VBA接口似乎没有处理除纯文本之外的任何其他格式的方法.只有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