Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: 七栋五零二

[分享] VBA班第6课:课堂笔记

[复制链接]
 楼主| 发表于 2007-7-7 21:31 | 显示全部楼层

Offset属性(Range对象)

适用于Range 对象

 

描述

返回一个 Range 对象,此对象代表偏离于指定区域的区域。只读。

 

句法

expression.Offset(RowOffset, ColumnOffset)

expression

必选。该表达式返回 Range 对象。

RowOffset

Variant 类型,可选。区域偏移量中的行数(正数、负数或零)。默认值为 0(零)。

 

ColumnOffset

Variant 类型,可选。区域偏移量中的列数(正数、负数或零)。默认值为 0

Target.Offset(0, -1)意思是Target同行(行偏移为0),前一列(-1)

Target.Row为Target的行号

Target.Column 列号

 

SelectionChange事件的讨论就到这里,下面我们来学习Change事件

Change

当工作表中的单元格内容发生改变时产生此事件。

现在开始第二个事件,大家清除掉已经写的代码

Change

当工作表中的单元格内容发生改变时产生此事件。

Worksheet_Change(ByVal Target As Range)

参数与SelectionChange相同,只有一个,是发生改变的单元格

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:33 | 显示全部楼层

大家粘贴下面代码

Private Sub Worksheet_Change(ByVal Target As Range)

  MsgBox Target.Address

End Sub

             

(1)双击任单元格,按回车

(2)在任意单元格输入数值

(3)用鼠标选定一个区域,按Delete键

 

通过上面的实验,大家应大体了解这个事件发生的条件和Target参数了吧

现在回到VBE,暂时屏蔽掉代码

再回到EXCEL主界面

在A3中输入公式=a1+a2

然后再激活代码,回来在A1和A2中输入数看看效果

A3的值虽然也会改变,但不会触发实践,因为它的公式没有变

所以一定程度上说,这个事件监测的是公式

 

只需要大家知道这个规则,我们不去探讨EXCEL的内部机制

在A2与A1中输入值,都会触发事件

你可以选定A1和A2,按DELETE

 

回复

使用道具 举报

发表于 2007-7-7 21:39 | 显示全部楼层

班长辛苦了[em26][em26][em26][em25][em25][em25]
回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:40 | 显示全部楼层

下面的由你来做.跟不上了.[em03][em03]
回复

使用道具 举报

发表于 2007-7-7 23:27 | 显示全部楼层

A1:A3都改变了,报告只说A1:A2
是因为A3的公式没变

思考题:去掉A3的公式,当A1或A2发生改变时,让A3的值始终保持=A1+A2

Change事件到此,课间休息后我们讲后面的事件

Change好像没有Cancel参数,能不能让Change失效,就像其他事件一样。改了白改,还变回去?
禁用事件
application.enableeven=false

改了白改,还变回去?
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  Application.Undo
  Application.EnableEvents = True
End Sub

Application.EnableEvents = False这句话的意思是停止响应事件

4组:Luckyguy 20:46:56
借用lvfeng1123的代码
Private Sub Worksheet_Change(ByVal Target As Range)    ' 思考题
    If Union(Target, Range("A1")).Address = Target.Address Or Union(Target, Range("A2")).Address = Target.Address Then
        Range("A3") = Range("A1").Value + Range("A2").Value
    End If
End Sub

[此贴子已经被作者于2007-7-7 23:35:06编辑过]
回复

使用道具 举报

发表于 2007-7-8 09:48 | 显示全部楼层

谢谢班长和学习委员![em23][em26][em27]
回复

使用道具 举报

发表于 2007-7-8 09:53 | 显示全部楼层

呵呵   收藏了
回复

使用道具 举报

 楼主| 发表于 2007-7-7 20:59 | 显示全部楼层

因为这是Sheet1的代码,WorkSheet就是Sheet1自身

大家看到一个过程框架

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 

End Sub

 

看上去是一个过程,只是是一个空过程,其中没有代码

现在大家在其中添加一句代码

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  MsgBox Target.Address

End Sub

切换回EXCEL主届面

现在可以在Sheet1工作表上用鼠标随便点一些单元格看看

 

 

回到VBE,删去我们刚刚添加的那句代码

让我们来想想刚才我们所做的

当我们点击单元格,(注:双击,单元格变成输入状态,再输入状态变为选定状态就有提示框出来了 )工作表的选定区域就发生了改变

当工作表的选定区域就发生了改变时,系统就会调用Worksheet_SelectionChange过程

这就是我们所说的工作表事件


 

回复

使用道具 举报

 楼主| 发表于 2007-7-7 21:19 | 显示全部楼层

我们刚才用的是SelectionChange事件

现在大家对事件应该有了印象了吧(不需回答)

正如你所看到的,工作表一共有9个事件

这些事件过程如果加入代码,便会在特定的情况下被调用

 

 

 

现在大家从事件列表框选择Change事件,把刚才的代码加入进去

Private Sub Worksheet_Change(ByVal Target As Range)

  MsgBox Target.Address

End Sub

切换回EXCEL主届面

Sheet1工作表上用鼠标随便点一些单元格看看 

现在不会出现刚才的提示框,因为代码没有被运行

不同的操作对应不同的事件

回复

使用道具 举报

发表于 2007-7-7 23:34 | 显示全部楼层

因为单元格的值发生改变后,UNDO改回去,便由触发,造成“死”循环,这时需要通知EXCEL暂时不响应事件,防止“死”循环

假定单元格原来的值是5,你输入7后,单元格由5-》7触发一次

undo后再7->5,又会触发

如此往复

UNDO是什么

Application.Undo就是撤消上一操作,即改回去

相当于按工具栏的撤消按钮

本来想后面讲Application.EnableEvents = False


1组シAbigale 20:54:50
Private Sub Worksheet_Change(ByVal Target As Range)
 
  Range("A3").Value = Range("A1").Value + Range("A2")

  MsgBox Target.Address
End Sub

当任一单元格改变时,触发事件
事件中的Range("A3").Value = Range("A1").Value + Range("A2")使A3发生改变,再次触发。。。

上面是1组シAbigale代码不停止的原因

a3改变-触发事件-事件中使a3再改变-再触发-。。。

4组:Luckyguy(705224574) 20:59:26
虽然值没变,但给它赋值就会触发Change事件,对吧
完全正确

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-31 22:31 , Processed in 0.380721 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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