wxiaow

V1

2023/01/03阅读:26主题:兰青

单元格蕴含的设计哲学

单元格蕴含的设计哲学

据不可靠数据统计,单元格操作使用最多的操作为 复制粘贴剪切删除,此外清除单元格内容格式批注以及所有数据包括格式)在前文已介绍过,不再赘述。

Copy属性

通常将某一单元格或某一单元格区域复制到工作簿的其他地方的一般操作是:选中当前区域 -> 复制 -> 选中目的区域 -> 粘贴

相应的VBA代码为:

Range("A1").Select
Selection.Copy
Range("B1").Select
AvtivateSheet.Paste

而使用自定义的VBA编码,就可以减少多次的选中单元格的操作(.Select),直接在源单元格和目的单元格之间操作即可。

仍旧以将A1单元格的数据复制到B1单元格为例。

Range("A1").Copy Destination:=Range("B1")

省略参数名称Destination,简写方式为:

range("A1").Copy Range("B1")

刚才使用VBA代码将一个单元格复制到另一个单元格,那么将一个的单元格区域如何复制到另一个单元格区域呢?

读到这里,大家是否会有这样一个顾虑,复制单元格的内容到另一个单元格是大小刚好匹配的关系,但是将一个的单元格区域的内容复制到另一个单元格区域,这两个单元格区域的大小关系的匹配如何确定呢?

或者说从较小的单元格区域复制到较大的单元格区域,数据怎么放呢? 如果从较大的单元格区域放到较小的单元格区域会不会出现数据溢出呢?就像将一大缸水放到水杯里,肯定会有水溢出来。

但是作为成熟的数据存储+数据处理软件,Excel肯定不会放任诸如此类的事情发生。

那么Excel是如何避免这种事情发生的呢?

当我们合并两个单元格时,合并后的单元格区域的名称就变成了左上角单元格的名称,即A1单元格和B1单元格合并,形成新的单元格区域的名称为A1,由此可知单元格区域的是按照一定的规则从左下角向右下角逐行填充的。

因此,在将单元格区域向单元格填充时,多余的数据会自动按照此规则从左上角向右小角逐行填充。

如将B4:D6单元格区域的数值复制到G4单元格,其含义为将将B4:D6单元格区域的数值复制到以G4单元格为左上角的G4:I6的单元格区域内。

Range("B4:D6").Copy Destination:=Range("G4")

如果此时VBA编码为Range("B4:D6").Copy Destination:=Range("G4:H4"),那么效果还是如此吗?

答案依然是如此,只不过这一次不是把一缸水放到水瓶里面,而是放到一个稍大的桶里面,依然没有改变水会溢出来的本质矛盾。因此,Excel还是会按照规则(从左下角向右下角逐行填充)扩充的单元格,直至能够完美的把水装满,即扩充目的单元格直至与源单元格大小相匹配。那么,Excel是怎么扩充的单元格的呢?在后文会为大家解开谜题。

Before
Before
After
After

注:

注意区别Activate方法和Select方法的不同之处。

  • 通常情况下,对单元格进行点选操作时。Select和Activate的功能是一样的。

  • 选中单元格区域后,再使用Activate方法激活该区域内的任一单元格,该单元格区域其他仍然呈选中状态,只改变活动单元格为激活的单元格;

  • 如果在选中单元格之后,再使用Select方法选中区域内的任一单元格,则只有用Select方法选中选择的单元格呈选中状态,其他单元格则变为未选中状态。

Cut属性

注:

Copy属性与Cut属性语法基本相同,都是对当前单元格内容进行“移动”,即目的地基本相同,唯一的差别在于是否需要备份,因此可以将Cut属性看成无备份的Copy属性,反之可将Copy属性看成有备份的Cut属性。

如将B4:D6单元格区域的数值剪切到G4单元格,其含义为将将B4:D6单元格区域的数值剪切到以G4单元格为左上角的G4:I6的单元格区域内。

Range("B4:D6").Cut Destination:=Range("G4")

省略参数名称Destination,简写方式为:

range("A1").Cut Range("B1")

同样的,对于单元格区域剪切的形式与单元格区域复制的形式并无二致。

Delete属性

在删除单元格的时候,总会弹出来选项窗口,询问删除后的页面执行右侧单元格左移下方单元格上移整行整列操作。

——删除操作演示窗口——

在VBA编码的环境中也不外乎如此。

# 删除单元格时,右侧单元格左移
Range("A1").Delete Shift:=xlToLeft

# 删除单元格时,下方单元格上移
Range("A1").Delete Shift:=xlToUp

# 删除单元格时,同步删除单元格所在行
Range("A1").EntireRow.Delete 

# 删除单元格时,同步删除单元格所在列
Range("A1").EntireColumn.Delete

此外,如果在删除单元格时不设置参数(Shift),意味着默认选择下方单元格上移。即,Range("A1").Delete等价于Range("A1").Delete Shift:=xlToUp

Address

前文曾描述工作表可以行列二维抽象表示,类似二维坐标轴,其X轴的正方向为右,其Y轴额正方向为下。

因此每一个单元格都可以由行列组成的编号唯一定位,因此这个也成为单元格名称,并且为了便于计算,Excel还提供了绝对路径相对路径

绝对路径与相对路径在前文已介绍,并且Excel支持对单一行或者单一列进行锁定,即A1单元格的绝对路径为$A$1,相对路径为A1,锁住行的A1单元格为$A1,锁住列的A1单元格为A$1

因此,A1单元格的地址使用VBA编码表示为,

# $A$1
Range("A1").Address

Offset属性

offset顾名思义,偏移。也就是说,以当前位置为基准,向上、下、左、右等方向前进。

那么从A1单元格出发,先向下移动2行,再向右移动3列,到达的单元格是多少呢?

Range("A1").Offset(2,3).Address  # $C$4

注: 前文曾描述工作表可以行列二维抽象表示,类似二维坐标轴,其X轴的正方向为右,其Y轴额正方向为下。

单元格向右、向下为正整数表示, 向左、上为负整数表示。

总结:

修改Offset的参数可以控制移动的方向和距离。

  • 如果参数是正数,表示向下或向右移动;
  • 如果参数为负数,表示向上或向左移动;
  • 如果参数为0,则不移动。

Resize属性

在描述复制单元格的时候就已经有体现出Resize的思想,即当将大单元格区域复制到小单元格区域的时候,会出现大小不匹配的情况,那么怎么解决呢?不可能缩小大单元格区域,那不是削足适履嘛。比较好的解决的方法是重新设置小单元格区域的大小,直至和大单元格区域完全吻合。

因此,自然而然地引出重新设置单元格区域大小的功能,Resize。

如将A1单元格区域向右扩大2列,向下扩大3行,最终形成的单元格区域是多少呢?

# 将A1单元格扩大为 $A$1:$C$4
Range("A1").Resize(2, 3).Address

如将 5: 9区域,缩小为2行2列的区域,最终形成的单元格区域是多少呢?

# 将D5:vF9缩小为 
Range("D5:F9").Resize(2,2).Address

分类:

后端

标签:

数据库

作者介绍

wxiaow
V1

把学的写出来,是方法,也是一种态度。