&引用;粘贴";excel VBA中的字符串变量,而不是剪贴板的内容?

&引用;粘贴";excel VBA中的字符串变量,而不是剪贴板的内容?,excel,vba,paste,Excel,Vba,Paste,我有一个字符串变量,它包含excel VBA中的HTML表。我知道,当这个表存储在剪贴板中,我调用.PasteSpecial时,Excel会进行一些漂亮的预处理,并以与表中显示相同的方式填充当前工作表中的单元格 但是,如果我简单地将cell/range的.Value设置为string变量,则不会进行此类预处理,整个字符串、HTML标记和所有内容都会转储到单元格中。我想要前一个结果,但我不能使用剪贴板,因为此应用程序正在其他地方使用它,并且不能保证我不会覆盖关键数据。它也被异步使用,因此我不能简单

我有一个字符串变量,它包含excel VBA中的HTML表。我知道,当这个表存储在剪贴板中,我调用.PasteSpecial时,Excel会进行一些漂亮的预处理,并以与表中显示相同的方式填充当前工作表中的单元格

但是,如果我简单地将cell/range的.Value设置为string变量,则不会进行此类预处理,整个字符串、HTML标记和所有内容都会转储到单元格中。我想要前一个结果,但我不能使用剪贴板,因为此应用程序正在其他地方使用它,并且不能保证我不会覆盖关键数据。它也被异步使用,因此我不能简单地保存剪贴板的当前内容,使用剪贴板,然后恢复剪贴板以前的内容


那么,在设置带格式字符串的范围的值时,有没有办法实现“粘贴预处理”呢?

如果有人知道答案,我仍然很想知道,但我决定继续,放弃将表存储在工作表中的想法。相反,我自己解析表,并使用InStr函数找到所需的值(因为它们大多是相邻的key=value对),这对于我的应用程序来说并不太慢

我想不出在没有剪贴板的情况下调用Excel的预处理器。对于解析,您可能需要签出Split函数。这里有一个例子

Sub ParseTable()

    Dim sHtmlTable As String
    Dim vaTable As Variant
    Dim i As Long

    Const STDSTART = "<td"
    Const STDEND = "</td"

    sHtmlTable = "<table border=""1""><tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr><tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr></table>"

    vaTable = Split(sHtmlTable, ">")

    For i = LBound(vaTable) To UBound(vaTable)
        If vaTable(i) = STDSTART Then
            Debug.Print Replace(vaTable(i + 1), STDEND, "")
        End If
    Next i

End Sub
子解析表()
Dim sHtmlTable作为字符串
可作为变体的
我想我会坚持多久
Const STDSTART=“这只是一个注释(stackeoverflow还不允许我对支撑方式进行注释)

您可能可以使用一些API按照您想要的方式来做

很久以前,我玩过它(寻找欺骗微软Word的方法),我记得你可以将任何内容存储到剪贴板,只要你输入内容类型的正确id(如纯文本、格式化文本、html等)。存储内容后,必须使用相应的API函数再次粘贴正确类型的内容

我没有取得预期的进展,而且时间紧迫,所以我放弃了这个想法。如果你想给它一个机会,请在MSDN中查找API调用(我现在没有,否则我会马上给你)

编辑:我找到了代码。以下所有代码都应保存在一个模块中:

' 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 lFormatID As Long) As String
'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(0&)) Then
'    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
剪贴板功能: 私有声明函数OpenClipboard Lib“USER32”(ByVal hWnd作为Long)作为Long 私有声明函数CloseClipboard Lib“USER32”(长度为 私有声明函数GetClipboardData Lib“USER32”(ByVal wFormat As Long)作为Long 私有声明函数IsClipboardFormatAvailable Lib“USER32”(ByVal wFormat As Long)尽可能长 私有声明函数RegisterClipboardFormat Lib“USER32”别名“RegisterClipboardFormatA”(ByVal lpString作为字符串)的长度为 '记忆功能: 私有声明函数GlobalLock Lib“kernel32”(ByVal hMem As Long)为Long 私有声明函数GlobalUnlock Lib“kernel32”(ByVal hMem As Long)为Long 私有声明函数GlobalSize Lib“kernel32”(ByVal hMem As Long)为Long 私有声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(lpvDest为Any,lpvSource为Any,ByVal cbCopy为Long) 公共函数GetClipboardForcustomFormat(ByVal sName作为字符串)的长度为 暗W格式与长W格式相同 wFormat=RegisterClipboardFormat(sName&Chr$(0)) 如果(wFormat>&HC000&),则 GetClipboardForcustomFormat=wFormat 如果结束 端函数 公共函数GetClipboardDataAsString(ByVal lFormatID As Long)作为字符串 '公共函数GetClipboardDataAsString(ByVal HwnOwner为长,ByVal lFormatID为长)为字符串 Dim bData()作为字节 暗淡的hMem一样长 模糊和长 变暗lPtr为长 '打开剪贴板进行访问: 如果(打开剪贴板(0&)),则 '如果(OpenClipboard(hWndOwner)),则 '检查此数据格式是否可用: 如果(IsClipboardFormatAvailable(lFormatID)0),则 '获取数据的内存句柄: hMem=GetClipboardData(lFormatID) 如果(hMem 0)那么 '获取此内存块的大小: lSize=全局大小(hMem) 如果(lSize>0),则 '获取指向内存的指针: lPtr=全球洛克(hMem) 如果(lPtr 0),则 '调整字节数组的大小以保存数据: 将bData(0到lSize-1)重新指定为字节 '将指针复制到数组中: CopyMemory数据(0)、ByVal lPtr、lSize '解锁内存块: GlobalUnlock hMem '现在以字符串形式返回数据: GetClipboardDataAsString=StrConv(bData,vbUnicode) 如果结束 如果结束 如果结束 如果结束 关闭剪贴板 如果结束 端函数
我刚刚注意到你说你不能使用剪贴板。很抱歉给你添了这么多麻烦。我正要删除我的帖子,但我认为还是让它像现在这样让我更仔细地阅读问题为好。