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

我写的代码如下:
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栏响应并记录操作时间。

问题出在最后一个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粘贴的时候,多行粘贴是否连续,中间有没有间隔行等

追问

用了一个奇怪的办法解决了这个问题……

把第二处的If Target.Count = 1 Then 删除了……

这样只要单行粘贴……就可以实现左边的移到右边时,右边自己记录操作时间…

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-02
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

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

追问

已经补充了图片和意图的说明。非常感谢!!

追答

我手机上的,没看到图片啊?

追问

我写成问题更新了……

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网