加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VBA Worksheet 事件之 Change 应用

(2013-05-27 08:00:00)
标签:

vba

worksheet'change事件

len函数

ltrim函数

str函数

it

分类: VBA

背景:单元格内容改变,会引起相关的内容做对应的改变,如当在 A2 中输入一个数字,需要将其组成的数字拆分出来,将其放入对应位的单元格内,并在最高位前的单元格中加入一个 “$” 符号,形如:

http://s7/mw690/7f14264agdda002e07986&690Worksheet 事件之 Change 应用" TITLE="VBA Worksheet 事件之 Change 应用" />

使用快捷键 Alt F11 进入 VBE 窗口,双击 VBAProject(工作簿名)下的数据放入的 Sheet 名,输入如下代码即可实现:

 Private Sub Worksheet_Change(ByVal Target As Range)

     Dim m As Integer

     Dim temp As String

     temp = LTrim(Str(Target.Cells(1, 1).Value))

     m = Len(temp)

     If m <= 8 And m > 0 Then
        Application.EnableEvents = False '在进行下面的操作时禁止事件程序再次运行
        Range(Target.Offset(0, 1).Address, Target.End(xlToRight).Address).Clear

        '清除改变单元格右边所有单元格的内容

         Target.Cells(1, 1).Offset(0, 9 - m) = "$"
         Debug.Print "t1", Target.Cells(1, 1).Offset(0, 9 - m).Address

         Do While m > 0

             Target.Cells(1, 1).Offset(0, 9 - m 1).Value = Left(temp, 1)
             Debug.Print "t2", Target.Cells(1, 1).Offset(0, 9 - m 1).Address
             temp = Right(temp, Len(temp) - 1)

             m = m - 1
         Loop
        Application.EnableEvents = True '恢复事件程序的运行
      Else
        Application.EnableEvents = False '在进行下面的操作时禁止事件程序再次运行
        Target.Cells(1, 1).Offset(0, 1) = "$" & Left(temp, m - 8)
        temp = Right(temp, 8)
         'Debug.Print "t1", Target.Cells(1, 1).Offset(0, 9 - m).Address
         m = 8

         Do While m > 0

             Target.Cells(1, 1).Offset(0, 9 - m 1).Value = Left(temp, 1)
            'Debug.Print "t2", Target.Cells(1, 1).Offset(0, 9 - m 1).Address
             temp = Right(temp, Len(temp) - 1)

             m = m - 1
         Loop
        Application.EnableEvents = True '恢复事件程序的运行
    End If

 End Sub

 

这里有几点细节需要说明:

  • 使用 Len 函数计算数值长度时,对于数字,则计算其类型的长度,如

http://s6/mw690/7f14264agdda0380fb9d5&690Worksheet 事件之 Change 应用" TITLE="VBA Worksheet 事件之 Change 应用" />

    可以看到第二个 Len(num)得到的结果不是8,而是长整型的所占字符长度,为处理这个问题,程序中使用 Str 函数将数值类型转换成 String 型,这也就产生了第二个需要注意的问题。

  • 使用 Str 函数转换 数字类型到字符类型时,会在其前面产生一个空字符(符号占位符)

http://s4/mw690/7f14264agdda053278713&690Worksheet 事件之 Change 应用" TITLE="VBA Worksheet 事件之 Change 应用" />

可以看出,Len 得出的结果是 9 而不是 8.所以在程序处理中使用了Ltrim 函数去除左边的空格。

  • 在程序中使用 Offset 处理分离后的数字的存储单元格位置问题,这里就会引起一个无限循环激发 Change 事件的问题,为此,需要用到事件的一个属性 Application.EnableEvents ,在存储分解后的数字之前,暂时的将 Change 事件关闭,即设置 Application.EnableEvents = False,在数字存储完成之后,重新开启 Change 事件。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有