ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1248|回复: 9

[分享] 新版《别怕……》例题挑毛病,“5.2.7”头晕者看过来!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-9-29 20:48 | 显示全部楼层 |阅读模式
本帖最后由 e表格学习 于 2017-10-2 20:31 编辑

关于“5.2.7 用批注记录单元格中数据的修改情况”事件程序中的两个小毛病:
1.误将“Value”(意为“输入值”)写为“Formula”(意为“公式”)。
编者的本意是使用“Value”,而不是使用“Formula”,这从编者的声明变量“RngValue”中可以证明。
事实上,本例题中不宜使用Formula,因为Formula、Text会干扰初学者的主要学习点。
2.批注中第一行可能会出现空行,空行看起来不舒服。
添加了IF句后,避免了可能出现的空行。
下面是本人的修改程序:
  1. Option Explicit
  2. Dim RngValue As String '定义一个变量给模块,用于保存单元格中的数据
  3. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  4. If Target.Cells.Count <> 1 Then Exit Sub '选中多个单元格时退出程序
  5. If Target.Value = "" Then '根据选中的单元格内容给变量RngVaue赋值
  6. RngValue = "空"
  7. Else
  8. RngValue = Target.Value
  9. End If
  10. End Sub
  11. Private Sub Worksheet_Change(ByVal Target As Range)
  12. If Target.Cells.Count <> 1 Then Exit Sub
  13. Dim Cvalue As String '定义变量保存单元格修改后的内容
  14. If Target.Value = "" Then '判断单元格是否被修改为空单元格
  15. Cvalue = "空"
  16. Else
  17. Cvalue = Target.Value
  18. End If
  19. If RngValue = Cvalue Then Exit Sub '如果单元格修改前后的内容一样则退出程序
  20. Dim RngCom As Comment '定义一个批注类型的变量,名称为RngCom
  21. Dim ComStr As String '定义变量ComStr,用来保存批注的值
  22. Set RngCom = Target.Comment '将被修改单元格的批注赋给变量RngCom
  23. If RngCom Is Nothing Then Target.AddComment '如果单元格中没有批注则新建批注
  24. ComStr = Target.Comment.Text '将批注的内容保存到变量ComStr中

  25. '重新修改批注的内容=原批注内容+当前日期和时间+原内容+修改后的新内容
  26. If ComStr = "" Then '避免批注的第一行出现空行
  27. Target.Comment.Text Text:=Format(Now(), "yyyy-mm-dd hh:mm") & _
  28. " 原内容: " & RngValue & _
  29. ",修改为: " & Cvalue
  30. Else
  31. Target.Comment.Text Text:=ComStr & Chr(10) & _
  32. Format(Now(), "yyyy-mm-dd hh:mm") & _
  33. " 原内容: " & RngValue & _
  34. ",修改为: " & Cvalue
  35. End If
  36. Target.Comment.Shape.TextFrame.AutoSize = True '根据批注内容自动调整批注大小
  37. End Sub


复制代码


TA的精华主题

TA的得分主题

发表于 2017-9-29 22:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我只想说value与Formula都是单元格的属性,如果单元格不是公式,二者是等效的

TA的精华主题

TA的得分主题

发表于 2017-9-30 08:13 | 显示全部楼层
贴主是在学还是找茬?如果是学,非带公式类型的普通情况下,如2楼所说,等效。如果找茬,我觉得应该直接去找出书者予以说明,在这里表现你找茬能力,貌似没意义吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-2 10:37 | 显示全部楼层
本帖最后由 e表格学习 于 2017-10-2 20:38 编辑
huang1314wei 发表于 2017-9-29 22:26
我只想说value与Formula都是单元格的属性,如果单元格不是公式,二者是等效的


您说的,我之前已经注意到了。
对于初学者(原书编者的主要面对者),本题还是使用Value为好!因为当输入为公式时,程序的表现与编程者的愿望可能会不一致!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-2 10:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 e表格学习 于 2017-10-2 10:48 编辑
microyip 发表于 2017-9-30 08:13
贴主是在学还是找茬?如果是学,非带公式类型的普通情况下,如2楼所说,等效。如果找茬,我觉得应该直接去 ...


在学,同时找茬=挑毛病,正确!(个人学习留脚印)
有意义。初学者更容易理解、学习本题想要教授的要点:自动记录。避免了初学者去学习输入值与公式的异同这个“枝节”问题!
本人找的第二个“茬”有问题吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-2 20:29 | 显示全部楼层
再说原题错在哪里(兼与二楼、三楼的两位老师讨论)?
先看原程序:
Option Explicit
Dim RngValue As String     '定义一个变量给模块,用于保存单元格中的数据
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Target.Cells.Count <> 1 Then Exit Sub '选中多个单元格时退出程序
   If Target.Formula = "" Then    '根据选中的单元格内容给变量RngVaue赋值
        RngValue = ""
   Else                                          
        RngValue = Target.Text
   End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count <> 1 Then Exit Sub
    Dim Cvalue As String     '定义变量保存单元格修改后的内容                    
    If Target.Formula = "" Then    '判断单元格是否被修改为空单元格
        Cvalue = ""
    Else                                                                                                                                                            
           Cvalue = Target.Formula
    End If
    If RngValue = Cvalue Then Exit Sub '如果单元格修改前后的内容一样则退出程序
    Dim RngCom As Comment   '定义一个批注类型的变量,名称为RngCom
    Dim ComStr As String       '定义变量ComStr,用来保存批注的值
    Set RngCom = Target.Comment   '将被修改单元格的批注赋给变量RngCom
    If RngCom Is Nothing Then Target.AddComment    '如果单元格中没有批注则新建批注
    ComStr = Target.Comment.Text      '将批注的内容保存到变量ComStr
   
    '重新修改批注的内容=原批注内容+当前日期和时间+原内容+修改后的新内容
    Target.Comment.Text Text:=ComStr & Chr(10) & _
                        Format(Now(), "yyyy-mm-dd hh:mm") & _
                        " 原内容: " & RngValue & _
                        ",修改为: " & Cvalue
    End If
    Target.Comment.Shape.TextFrame.AutoSize = True '根据批注内容自动调整批注大小
End Sub
分析:
我给加粗加大的三个语句,是错误的原因!
实操证明:当之前输入为公式(即“=******”的形式)时,再双击公式所在单元格(但是不要作任何更改!)后回车,批注会增加一行,即程序错误地认为你对单元格进行了修改。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-2 20:45 | 显示全部楼层
本帖最后由 e表格学习 于 2017-10-2 20:50 编辑
microyip 发表于 2017-9-30 08:13
贴主是在学还是找茬?如果是学,非带公式类型的普通情况下,如2楼所说,等效。如果找茬,我觉得应该直接去 ...


本人又研究了一下:当输入为公式时,原程序运行结果可能与编程人的愿望不一致!这是由于程序中三个语句的不协调(请见楼下本人标注)引起的!

所以,还是统一、简单Value为好!

TA的精华主题

TA的得分主题

发表于 2017-10-3 08:19 | 显示全部楼层
e表格学习 发表于 2017-10-2 20:45
本人又研究了一下:当输入为公式时,原程序运行结果可能与编程人的愿望不一致!这是由于程序中三个语句 ...

不同属性有不同功能
.Value
.Value2
.Text
.Formula
.FormulaArray
……

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-13 13:24 | 显示全部楼层
已得到原著老师的指导:RNGVALUE=TARGET.TEXT应该改为RNGVALUE=TARGET.FORMULA

TA的精华主题

TA的得分主题

发表于 2018-8-2 20:19 | 显示全部楼层
e表格学习 发表于 2017-10-2 10:43
在学,同时找茬=挑毛病,正确!(个人学习留脚印)
有意义。初学者更容易理解、学习本题想要教授的要 ...

我非常赞同5楼的说法,我第一遍看这本书的时候,看到自动生成批准这里时,确实产生疑问,为什么不直接用value,而是要用formula,然后上网查了很多资料,最后才明白,没有公式的情况下,这两者是等效的,但是对于初学者,这里用VALUE,确实更容易理解!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 11:06 , Processed in 0.045247 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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