Excel Userform - 从剪贴板获取HTML

时间:2013-06-03 22:12:08

标签: excel-vba userform vba excel

Excel 2010,2013

我在剪贴板上有一些HTML,我想通过Excel UserForm解析它。

我可以使用VB.Net检索剪贴板上的格式,并在返回的数组中列出“HTML格式”。 EXCEL VBA中的Howerver s = MyDataobj.GetText("HTML Format")失败。事实上,我无法将任何参数传递给GetText()以返回任何内容。我可以将剪贴板粘贴到电子表格中,Excel可以很好地粘贴HTMl表。

将数据放在剪贴板上的程序是Lotus Notes,因此谁知道可能存在的外来格式。

有没有办法在VBA中发现可从DataObject获得的可用格式(以及用于检索数据的幻数/字符串)?

这是我提取文本的代码。我应该能够通过GetText检索其他格式,但我不知道要传递的参数值。

        Public Function GetText() As String
        On Error GoTo Local_err
            Dim MyData   As DataObject
            Dim strClip   As String

            Set MyData = New DataObject
            MyData.GetFromClipboard
            GetText = MyData.GetText
        local_exit:
            Exit Function
        Local_err:
            MsgBox Err & " " & Err.Description & vbCrLf & vbCrLf & "GetText from Clipboard: text not found"
            Resume local_exit
            Resume
        End Function

2 个答案:

答案 0 :(得分:3)

使用VBA,您可以获得来自数据对象的文本。我估计你需要api来电 - Chip Pearson有示例代码:http://www.cpearson.com/excel/Clipboard.aspx可以帮助你。

答案 1 :(得分:0)

可以从VBA中的剪贴板访问其他格式。

此“食谱”(位于vbaccelerator)可以解决问题:

1)创建一个新的代码模块,并将以下代码放入其中:

' Clipboard functions:
Private Declare Function OpenClipboard Lib "USER32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "USER32" () As Long
Private Declare Function GetClipboardData Lib "USER32" (ByVal wFormat As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "USER32" (ByVal wFormat As Long) As Long
Private Declare Function RegisterClipboardFormat Lib "USER32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
' Memory functions:
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Public Function GetClipboardIDForCustomFormat(ByVal sName As String) As Long
    Dim wFormat As Long
    wFormat = RegisterClipboardFormat(sName & Chr$(0))
    If (wFormat > &HC000&) Then
        GetClipboardIDForCustomFormat = wFormat
    End If
End Function

Public Function GetClipboardDataAsString(ByVal hWndOwner As Long, ByVal lFormatID As Long) As String
    Dim bData() As Byte
    Dim hMem   As Long
    Dim lSize  As Long
    Dim lPtr   As Long

    ' Open the clipboard for access:
    If (OpenClipboard(hWndOwner)) Then
        ' Check if this data format is available:
        If (IsClipboardFormatAvailable(lFormatID) <> 0) Then
            ' Get the memory handle to the data:
            hMem = GetClipboardData(lFormatID)
            If (hMem <> 0) Then
                ' Get the size of this memory block:
                lSize = GlobalSize(hMem)
                If (lSize > 0) Then
                    ' Get a pointer to the memory:
                    lPtr = GlobalLock(hMem)
                    If (lPtr <> 0) Then
                        ' Resize the byte array to hold the data:
                        ReDim bData(0 To lSize - 1) As Byte
                        ' Copy from the pointer into the array:
                        CopyMemory bData(0), ByVal lPtr, lSize
                        ' Unlock the memory block:
                        GlobalUnlock hMem

                        ' Now return the data as a string:
                        GetClipboardDataAsString = StrConv(bData, vbUnicode)

                    End If
                End If
            End If
        End If
        CloseClipboard
    End If

End Function

2)在您的代码中插入类似

Dim myContent As String 
myContent = GetClipboardDataAsString(0, 49382)

其中49382是HTML的格式ID。

您可以使用NirSofts Freeware InsideClipboard来显示当前剪贴板中可能存在的多个内容以及相关的格式ID。