Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5936|回复: 8

使用Worksheet_Change,触发多行怎么得到效果

[复制链接]
发表于 2017-3-12 07:22 | 显示全部楼层 |阅读模式
这个代码能不能帮我看下,                               
复制多行内容到D E F列。G列得不到更新                               
请问代码,怎么写,谢谢                               
还有复制的行数是个变量,可能是一行,二行,几千行…………                               
不管在D   E    F     列复制多少行,G列都能得到对应的值。。。                               
弄了好久,都没实现,特到贵地来求助各位,谢谢!!!        看起来有点累,水平有限        。.以前用的是SUM函数,但数据太多,拖累文档。所以想用VBA。               
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. 'If Target.Count > 1 Then Exit Sub
  3.         If Target.Row < 11 Then Exit Sub
  4.         If Target.Column = Columns("D").Column And Target.Rows.Count = 1 Then
  5.             ActiveSheet.Cells(Target.Row, Columns("G").Column) = Round(Target * Target.Offset(0, 1) * Target.Offset(0, 2) * 0.000001, 2)
  6. 'If Target.Column = Columns("D").Column And Target.Rows.Count <> 1 Then    这下面应该怎么写,谢谢!基础不好呀
  7.     ElseIf Target.Column = Columns("E").Column And Target.Rows.Count = 1 Then
  8.              ActiveSheet.Cells(Target.Row, Columns("G").Column) = Round(Target * Target.Offset(0, -1) * Target.Offset(0, 1) * 0.000001, 2)
  9.         ElseIf Target.Column = Columns("F").Column And Target.Rows.Count = 1 Then
  10.             ActiveSheet.Cells(Target.Row, Columns("G").Column) = Round(Target * Target.Offset(0, -1) * Target.Offset(0, -2) * 0.000001, 2)
  11.     End If
  12.         If ActiveSheet.Cells(Target.Row, Columns("G").Column).Value < 0.2 Then
  13.             ActiveSheet.Cells(Target.Row, Columns("G").Column).Value = 0.2
  14.     End If
  15. End Sub
复制代码



VBA学习.zip

17.67 KB, 下载次数: 15

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-3-12 08:32 | 显示全部楼层
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Column > 3 And Target.Column < 7 Then
  3.         If Len(Target(1)) Then
  4.             For i = Target.Row To Target.Row + Target.Rows.Count - 1
  5.                 Cells(i, 7) = Cells(i, 7)(1, -2) * Cells(i, 7)(1, -1) * 0.000001
  6.             Next
  7.         End If
  8.     End If
  9. End Sub
复制代码


VBA学习.rar (20.92 KB, 下载次数: 36)

评分

参与人数 2 +7 收起 理由
laoau138 + 6 来学习
llxyxll + 1 赞一个

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-3-12 21:14 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2017-3-12 21:26 | 显示全部楼层

高人,能不能解释下,这名话的意思

If Len(Target(1)) Then
回复

使用道具 举报

 楼主| 发表于 2017-3-13 06:13 | 显示全部楼层
还有一个疑问,这句代码是怎么运行的?能为我讲讲吗,谢谢。For i = Target.Row To Target.Row + Target.Rows.Count - 1

1   target.row指的是当前单元格的行号。如果选取是多行,能返回什么行号。
2    Target.Row + Target.Rows.Count - 1        
这句不理解,目标行号加目标行总数减一。
返回什么结果





回复

使用道具 举报

发表于 2017-3-13 08:50 | 显示全部楼层
llxyxll 发表于 2017-3-13 06:13
还有一个疑问,这句代码是怎么运行的?能为我讲讲吗,谢谢。For i = Target.Row To Target.Row + Target.Ro ...

F8你可以单步调试看看
回复

使用道具 举报

发表于 2017-3-13 08:51 | 显示全部楼层
llxyxll 发表于 2017-3-12 21:26
高人,能不能解释下,这名话的意思

If Len(Target(1)) Then

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column > 3 And Target.Column < 7 Then
      '触发事件只针对D~F列
        If Len(Target(1)) Then
            '区域中第一个单元格不为空。不为空说明粘贴了数值,则向下执行。
            For i = Target.Row To Target.Row + Target.Rows.Count - 1
              'target.row 粘贴区域第一行。Target.Rows.Count 粘贴区域总行数。
              '第一行+总行数-1 计算出区域最后一行。
                Cells(i, 7) = Cells(i, 7)(1, -2) * Cells(i, 7)(1, -1) * 0.000001
               '计算结果到G列相应位置。
            Next
        End If
    End If
End Sub


如需其它功能楼主可继续在代码里添加。


回复

使用道具 举报

 楼主| 发表于 2017-3-13 21:04 | 显示全部楼层
本帖最后由 llxyxll 于 2017-3-14 07:29 编辑
雪舞子 发表于 2017-3-13 08:51
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column > 3 And Target.Column <  ...

谢谢老师的热心帮助,学习了不少。
还烦请你帮我看下,再你的基础上我加了句判断单元格是不是数字,不过这次工作表事件放在工作簿事作了。你
帮我看看这样写那不对!谢谢
  1. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  2. '    If Target.Row < 11 Or Target.Column > Columns("j").Column Then Exit Sub
  3. '        Target.Value = ClearContents
  4. '        MsgBox ("请输入数字文本")
  5. '        Exit Sub
  6. '    End If
  7.   If Target.Column > 3 And Target.Column < 7 Then
  8.            If Len(Target(1)) Then
  9.                 For i = Target.Row To Target.Row + Target.Rows.Count - 1
  10.                     If IsNumeric(Target.Value) = False Then
  11.                         Target.Value = ClearContents
  12.                         MsgBox ("请输入数字文本")
  13.                         Exit Sub
  14.                         Exit For
  15.                     Else
  16.                         Cells(i, 7) = Round(Cells(i, 7)(1, -2) * Cells(i, 7)(1, -1) * Cells(i, 7)(1, 0) * 0.000001, 2)
  17.                     End If
  18.                 Next
  19.             End If
  20.     End If
  21. End Sub
复制代码


VBA学习.zip

23.26 KB, 下载次数: 6

回复

使用道具 举报

发表于 2017-3-16 10:45 | 显示全部楼层
执行结果是否正确可以按F8调试一下。

你这样判断是否为数字是得不到正确结果的。

循环体内 IsNumeric() 函数的参数应为具体的遍历的单元格参数。

参考如下:
  1. Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  2.     If Target.Column > 3 And Target.Column < 7 Then
  3.         For i = 1 To Target.Count
  4.             If IsNumeric(Target(i)) = False Then
  5.                 Target.ClearContents
  6.                 MsgBox ("请输入数字文本")
  7.                 Exit Sub
  8.             End If
  9.         Next
  10.         For i = Target.Row To Target.Row + Target.Rows.Count - 1
  11.             Cells(i, 7) = Round(Cells(i, 7)(1, -2) * Cells(i, 7)(1, -1) * Cells(i, 7)(1, 0) * 0.000001, 2)
  12.         Next
  13.     End If
  14. End Sub
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-13 04:29 , Processed in 0.257143 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表