|
可以用API直接从内存中读取:- Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
- Private Declare Function CloseClipboard Lib "user32" () As Long
- Private Declare Function RegisterClipboardFormat Lib "user32.dll" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
- Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
- 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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
- Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
- Private Function GetCutCopyRange() As Range
- Dim sBuffer As String
- Dim sItem As Variant
- Dim hMem As Long
- Dim nSize As Long
- Dim lpData As Long
- Dim lFormat As Long
- Dim sWorkbook As String
- Dim sSheet As String
- Dim sRange As String
-
- OpenClipboard 0&
- lFormat = RegisterClipboardFormat("Link")
- If lFormat <> 0 Then
- hMem = GetClipboardData(lFormat)
- If hMem <> 0 Then
- lpData = GlobalLock(hMem)
- If lpData <> 0 Then
- nSize = GlobalSize(hMem)
- sBuffer = Space(nSize)
- CopyMemory ByVal StrPtr(sBuffer), ByVal lpData, ByVal nSize
- sBuffer = StrConv(sBuffer, vbUnicode)
- End If
- GlobalUnlock hMem
- Else
- CloseClipboard
- Exit Function
- End If
- End If
- CloseClipboard
- sItem = Split(sBuffer, Chr(0))
- sItem(1) = Mid(sItem(1), InStr(sItem(1), "[") + 1)
- sWorkbook = Left(sItem(1), InStr(sItem(1), "]") - 1)
- sSheet = Mid(sItem(1), InStr(sItem(1), "]") + 1)
- sRange = sItem(2)
- Set GetCutCopyRange = Workbooks(sWorkbook).Sheets(sSheet).Range(Application.ConvertFormula(sRange, xlR1C1, xlA1))
- End Function
复制代码 测试代码如下(先选中一个单元格区域复制或剪切后再从VB编辑器中运行test宏 - 从工具-宏中运行宏会取消工作表的复制/剪切状态):- Sub test()
- Dim r As Range
- Dim s As String
- Set r = GetCutCopyRange
- If r Is Nothing Then
- s = "目前剪贴板中没有Excel单元格区域"
- Else
- s = "工作簿:" & vbTab & r.Worksheet.Parent.FullName & vbCrLf
- s = s & "工作表:" & vbTab & r.Worksheet.Name & vbCrLf
- s = s & "单元格区域:" & vbTab & r.Address
- End If
- MsgBox s
- End Sub
复制代码
[ 本帖最后由 小fisher 于 2010-9-28 08:57 编辑 ] |
|