Option Explicit
Dim myClipboard As Range
Public Sub toClipboard(Optional source As Range = Nothing)
If source Is Nothing Then Set source = Selection
source.Copy
Set myClipboard = source
End Sub
''# Add a reference to : FM20.dll or Microsoft Forms 2.0
''# Some more details at http://www.cpearson.com/excel/Clipboard.aspx
Option Explicit
Dim pSelSheet As String
Dim pSelRange As String
Dim gCopySheet As String
Dim gCopyRange As String
Dim gCount As Long
Dim prevCBText As String
Dim DataObj As New MSForms.DataObject
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Excel.Range)
CopyTest
pSelSheet = Sh.Name
pSelRange = Target.Address
''# This is only so you can see it working
gCount = gCount + 1
application.StatusBar = gCopySheet & ":" & gCopyRange & ", Count: " & gCount
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
CopyTest ''# You may need to call CopyTest from other events as well.
''# This is only so you can see it working
gCount = gCount + 1
application.StatusBar = gCopySheet & ":" & gCopyRange & ", Count: " & gCount
End Sub
Sub CopyTest()
Dim curCBText As String
Dim r As Range
DataObj.GetFromClipboard
On Error GoTo NoCBData
curCBText = DataObj.GetText
On Error Resume Next
''# Really need to test the current cells values
''# and compare as well. If identical may have to
''# update the gCopyRange etc.
If curCBText <> prevCBText Then
gCopySheet = pSelSheet
gCopyRange = pSelRange
prevCBText = curCBText
End If
Exit Sub
NoCBData:
gCopySheet = ""
gCopyRange = ""
prevCBText = ""
End Sub
3 回答
据我所知,你无法用vba做到这一点 . 但是,您可以编写自己的副本子并将源存储在全局变量中 .
像这样的东西:
复制范围时,地址将与其他格式一起复制到剪贴板 . 您可以使用Clipboard Viewer应用程序进行检查 . 因此,如果您需要复制的Range,请从剪贴板中获取它 . 这将是> $ A2:$ B5或类似的东西
我能想到这样做的唯一方法是跟踪用全局变量选择的最后一个范围,然后等到你认为复制操作完成 . 不幸的是,这既不容易
以下是一个有两个问题的快速尝试;
如果您复制两次相同的数据,则不会更新
如果从其他应用程序触发了复制或粘贴,则结果可能会有所不同 .
这是跟踪不存在的事件时最后的希望技巧之一 . 希望这可以帮助 .
哦,并原谅那些奇怪的评论''#他们只是在那里帮助SO的语法高亮显示 .