永发信息网

applacation.calculate,在selectionchange事件中,不能粘贴 求解

答案:2  悬赏:60  手机版
解决时间 2021-03-02 08:29
applacation.calculate,在selectionchange事件中,不能粘贴 求解
最佳答案
Excel2003中如果你在"Worksheet_SelectionChange"事件中写了VBA代码的话粘贴功能就会失效.还没有一个很好的解决方案,据说是2003的Bug,下面的代码可以暂时解决这个问题,不过这个代码本身有一些小Bug:整行选的话会报错,把它catch掉就可以了:-)。
但是对正常使用不会有太大影响。
There is a temp solution for this problem:
//------------------------------------------------------------------------------------
Extra code in Worksheet_SelectionChange:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo err
'/错误处理,发生异常时转到err
Dim rngCutCopy As Range
Dim iCutCopymode As Integer
If CutCopyMode Then
Set rngCutCopy = CutCopyRange
Else
Set rngCutCopy = Nothing
End If
iCutCopymode = CutCopyMode
//Your Code

If iCutCopymode = xlCopy Then
rngCutCopy.Copy
ElseIf iCutCopymode = xlCut Then
rngCutCopy.Cut
End If
err:
'/异常时不做任何处理,只是为了屏蔽对话框
End Sub
//-------------------------------------------------------------------------------
Extra code in modules
Option Explicit
'/锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处
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 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 Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long)
'//--------------------------------------------------------------------------------------//
'//-----用于取得处于复制或者剪切状态的单元格区域的函数------//
'//--------------------------------------------------------------------------------------//
Public Function CutCopyRange () As Range
On Error GoTo Hanlder
Dim bytData() As Byte, hMem As Long, nClipsize As Long, lpData As Long
Dim sSource As String, sTemp() As String
Dim sWorkbook As String, sSheet As String, sRange As String
'/打开剪切板
OpenClipboard 0&
'/取得剪切板中有关Excel单元格复制的信息数据
hMem = GetClipboardData (49154)
'/假如存在数据
If CBool(hMem) Then
'/取得数据内存的大小
nClipsize = GlobalSize (hMem)
'/锁定此内存块,并返回内存块的起始地址
lpData = GlobalLock (hMem)
If lpData <> 0 Then
'/从新定义数组大小
ReDim bytData(0 To nClipsize - 1) As Byte
'/将内存复制到数组中
CopyMemory bytData(0), ByVal lpData, nClipsize
'/将二进制数组转换成字符串
sSource = StrConv (bytData, vbUnicode)
'/拆分字符串
sTemp = Split(sSource, Chr(0))
'/假使在拆分得到的字符串2中找到"\"(即工作薄已经保存)
If InStr (sTemp(1), "\") Then
'/取得工作薄的名称
sWorkbook = Mid(sTemp(1), InStrRev (sTemp(1), "\") + 1)
Else
'/取得工作薄的名称
sWorkbook = sTemp(1)
End If
'/取得工作表的名称
sSheet = Left(sTemp(2), InStr (sTemp(2), "!") - 1)
'/取得单元格区域的地址
sRange = R1C1 _To_A1(Mid(sTemp(2), InStr (sTemp(2), "!") + 1))
'/取得处于剪切或者复制状态的单元格
Set CutCopyRange = Workbooks(sWorkbook).Sheets(sSheet).Range(sRange)
End If
'/解锁 内存
GlobalUnlock hMem

'/假如未处于复制或者剪切状态
Else
Set CutCopyRange = Nothing
End If
'/关闭剪切板
CloseClipboard
Exit Function
Hanlder:
Debug.Print err.Number & err.Description
End Function
'//--------------------------------------------------------------------------
'//----用于将单元格的R1C1引用样式转换为A1样式------
'//--------------------------------------------------------------------------
Private Function R1C1 _To_A1(RgStr As String) As String
Dim sTemp() As String
If InStr (RgStr , ":") Then
sTemp = Split(RgStr , ":")
R1C1 _To_A1 = R1C1 _To_A1(sTemp(0)) & ":" & R1C1 _To_A1(sTemp(1))
Else
RgStr = Mid(RgStr , 2)
sTemp = Split(RgStr , "C")
R1C1 _To_A1 = Chr(64 + sTemp(1)) & sTemp(0)
End If
End Function
全部回答
是啊, 你在用 单元格对应行列 高亮显示?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
读好书乐趣无穷的下一句是什么
文登市明达服装有限公司怎么去啊,有知道地址
贵州省三穗中学地址在哪,我要去那里办事,
诈身份什么意思
人体的穴位是否固定
UpS电瓶汽车能使用吗?
求藏头诗表达爱意的 我喜欢陈慧
黄岩国际大酒店地址在哪,我要去那里办事
青田江南园林市政工程有限公司在哪里啊,我有
笔记本为什么会听到金属摩擦的声音?
开车向右调头应该打什么方向的转向灯
知道这个白酒多少钱一瓶的吗?先谢了,侯镇十
1915年在美国旧金山举行的巴拿马太平洋博览会
女孩子名字里含有京这个字的名
金坛市天合印花厂怎么去啊,有知道地址的么
推荐资讯
收藏夹中的网址太多了,如何清理收藏夹?
500万人民币在英国能买什么房子
在下列动物行为的研究过程中,应当使用什么仪
天天炫舞女生什么名字好听
有没有哪位大神能帮我攻击一个人的IP!成功的
怎么现在司机的素质都这么差?!不论是出租车
爱乌及屋怎么去啊,有知道地址的么
赵记烩面啤酒鸭宁津NO.1地址在什么地方,想过
找个在苏州做压力容器焊工的工作,求介绍
我十四岁想成为明星但是家庭条件不是很好又住
下列哪一项不是加入碳酸氢钠的作用A.调节pHB.
山寨平板变砖无法进入recovery怎么救活
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?