excel的VBA代码卡好像循环卡死了,求解决办法

我写的代码如下:PrivateSubWorksheet_Change(ByValTargetAsRange)IfTarget.Count=1ThenIfTarget.Co... 我写的代码如下:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
If Target.Column = 2 Then '1表示第1列的内容改变时
Cells(Target.Row, 1) = Now '2表示在第2行记录修改时间
End If
End If
If Target.Count = 1 Then
If Target.Column = 12 Then '1表示第12列的内容改变时
Cells(Target.Row, 6) = Now '2表示在第6行记录修改时间
End If
End If
If Not IsEmpty(Column = 9) Then
Cells(Target.Row, 12) = "已用"
End If
End Sub
1栏用来记录2.3.4.5栏的登记时间(以2栏为准)
而当2.3.4.5栏的记录粘贴到另一侧7.8.9.10栏表示已经使用过的时候
6栏会响应并记录操作时间。(以7栏为准)
但是Worksheet_Change好像并不响应多单元格的粘贴。
所以就想了个折中的办法,增加一个逻辑判断机制,
if 9栏不为空,则12栏自动增加数据“已用”
if 12栏有数据修改,则6栏响应并记录操作时间。
展开
 我来答
philkingdh
推荐于2016-03-10 · TA获得超过385个赞
知道小有建树答主
回答量:162
采纳率:0%
帮助的人:139万
展开全部

问题出在最后一个IF

If Not IsEmpty(Column = 9) Then
Cells(Target.Row, 12) = "已用"
End If

我不太理解你的函数的目的是什么,

前面都理解:是出现变化的单元格数量=1(Target.Count = 1),以及对应的列号=(Target.Column = 12)时进行对应的填充操作

但是最后一个IF在任何Worksheet_Change都会执行

《If Not IsEmpty(Column = 9) Then》 这句话中的Column没有任何赋值,

那么Column = 9为假

Not IsEmpty(Column = 9)就为真

所以Cells(Target.Row, 12) = "已用" 必然执行


然后这个IF中的“Cells(Target.Row, 12) = "已用"”本身是个Worksheet_Change事件,会导致循环执行Worksheet_Change

所以解决的方法要么给最后一个IF添加先提条件

或者

在函数开始添加Application.EnableEvents = False

结尾添加Application.EnableEvents = True

再或者

请把你需要达到的目的说一下


Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False‘添加的--------
If Target.Count = 1 Then
If Target.Column = 2 Then '1表示第1列的内容改变时
Cells(Target.Row, 1) = Now '2表示在第2行记录修改时间
End If
End If
If Target.Count = 1 Then
If Target.Column = 12 Then '1表示第12列的内容改变时
Cells(Target.Row, 6) = Now '2表示在第6行记录修改时间
End If
End If
If Not IsEmpty(Column = 9) Then
Cells(Target.Row, 12) = "已用"
End If
Application.EnableEvents = True‘添加的--------
End Sub
更多追问追答
追问

1栏用来记录2.3.4.5栏的登记时间(以2栏为准)

而当2.3.4.5栏的记录粘贴到另一侧7.8.9.10栏表示已经使用过的时候

6栏会响应并记录操作时间。(以7栏为准)

但是Worksheet_Change好像并不响应多单元格的粘贴。

所以就想了个折中的办法,增加一个逻辑判断机制,

if  9栏不为空,则12栏自动增加数据“已用”

if  12栏有数据修改,则6栏响应并记录操作时间。

追答
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False '添加的--------
'------------第一部分没有问题------------
If Target.Count = 1 Then
If Target.Column = 2 Then '1表示第1列的内容改变时
Cells(Target.Row, 1) = Now '2表示在第2行记录修改时间
End If
End If

'------------这部分你是多多单元格粘贴,所以要大于等于1------------
If Target.Count >= 1 Then
    If Target.Column = 7 Then '7表示第7列的内容改变时
        x = Target.Rows.Count'判断粘贴多少行
        If x >= 1 Then'循环填充时间
            For n = 0 To x - 1
              Cells(Target.Row + n, 6) = Now
            Next
        End If
    End If
End If
Application.EnableEvents = True '添加的--------
End Sub

这里面还有不少缺点,由于部分需求不太明白,自己先尝试,有问题在交流 

例如:

        你向78910粘贴的时候,多行粘贴是否连续,中间有没有间隔行等

hbpaoxiao2
2014-09-02 · TA获得超过2896个赞
知道大有可为答主
回答量:1962
采纳率:72%
帮助的人:859万
展开全部
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count <> 1 Then exit sub
    If Target.Column = 2 Then '1表示第1列的内容改变时??这里是第2列啊?
        Cells(Target.Row, 1) = Now '2表示在第2行记录修改时间  你这里写的是第一行……
    else If Target.Column = 12 Then '1表示第12列的内容改变时
        Cells(Target.Row, 6) = Now '2表示在第6行记录修改时间
    End If
    If Not IsEmpty(Column = 9) Then '??这里没看懂要表达什么?
        Cells(Target.Row, 12) = "已用"
    End If
End Sub

有什么问题请继续追问,有些地方我没看懂啊

更多追问追答
追问
已经补充了图片和意图的说明。非常感谢!!
追答
我手机上的,没看到图片啊?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式