file - VBA:从剪贴板读取文件

标签 file vba clipboard

我正在尝试在 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/

相关文章:

Java Android - 仍然获取旧文件

excel - 获取应用程序定义或对象定义的错误

Excel VBA排序不起作用worksheet.range引用的正确语法是什么

windows - 将 Octave /matlab 输出写入剪贴板

c# - 如何发送到剪贴板 datagridview 内容,如 CTRL-C

CreateFileMapping 多线程

ios从应用程序发送图像到邮件客户端不显示

c# - 如何编写一个简单的 C# 脚本将文件复制到上一级目录?

VBA 字典,需要类 424 对象错误