Private Sub Worksheet_Change(ByVal Target As Range)
  Dim x As Integer
  Dim y As Integer
  x = Target.Row
If Target.Count > 1 Then Exit Sub
   If Target.Column = 2 Then
   For y = 1 To x - 1
       If Range("by") = Range("bx") Then
       Application.Speech.Speak "条码重复,请检查条码"
       MsgBox ("条码重复,请检查条码")
      Range("B" & x).Clear: Range("B" & x).Select
 Next y
       Else: Target.Offset(, 1).Select
       End If
       If Range("B" & x) <> "" And Range("C" & x) <> "" And Range("B" & x) <> Range("C" & x) Then
         Application.Speech.Speak "字符长度或内容不一致,请检查条码"
         MsgBox ("字符长度或内容不一致,请检查条码")
         Range("B" & x).Clear: Range("C" & x).Clear: Range("B" & x).Select
   If Target.Column = 3 Then Target.Offset(1, -1).Select
End If
End Sub

解决方案 »

  1.   

    不要迷信书、考题、老师、回帖;
    要迷信CPU、编译器、调试器、运行结果。
    并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
    任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
      

  2.   

    代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
    提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
    单步调试和设断点调试是程序员必须掌握的技能之一。注释掉所有On Error Resume Next语句,在VBA IDE中运行,
    出错后点击调试,光标会停在出错的那条语句处,
    或者
    事先在怀疑可能有逻辑错误的语句处设置断点,运行经过断点时中断,此时可以在立即窗口中使用
    ?变量名

    ?函数名(函数参数)

    过程名(参数)
    辅助调试。
      

  3.   

    鬼才知道,你这个是vba,是和你的excel文档结构相关的,光看代码怎么知道。比如说你a b c三列,里面是不是这么存的,有没有条形码,等等。
    楼上说的,贴进去运行下是最简单的知道行不行的办法。
      

  4.   

    大概看了一下,程序的进程顺序有问题,在FOR中有IF语句,应该首先结束IF,才能结束FOR,你的这个首先结束了FOR后才结束IF,典型的进程逻辑错误。