网友需求:选中工作表中的两个矩形后,执行代码实现两个矩形对齐排列,如下图所示。
这个代码并不复杂,对于以哪个图形为基准并无要求,代码如下。
Sub demo()
Set s4 = Selection(1)
Set s3 = Selection(2)
Debug.Print s3.Top, s3.Left, s3.Height
Debug.Print s4.Top, s4.Left, s4.Height
s4.Left = s3.Left
s4.Top = s3.Top + s3.Height
End Sub
【代码解析】
第2和3行代码将两个图形对象分别赋值给变量
第4和5行代码在立即窗口中输出图形对象的相关属性。
第6行代码调整图形对象左对齐对齐。
第7行代码调整图形对象上下叠放。
选中两个图形,在VBE中执行代码,效果杠杠的。为了方便使用,插入ActiveX按钮,并写入事件代码。
Private Sub CommandButton1_Click()
Call demo
End Sub
选中两个图形,点击按钮,出现如下错误
在立即窗口中查看一下s3和s4的对象类型,发现都是Range对象,说明点击按钮执行代码时,Selection对象发生了变化,不再是Shape对象,而是变为活动单元格。
?typename(s3)
Range
?typename(s4)
Range
产生这个变化的原因,ActiveX控件也属于Shape对象,因此点击按钮时,相当于点击了另一个Shape对象,最初的选中两个图形的状态已经不存在,并且按钮的选中状态不会像图形一样持续,所以代码执行时Selection实际为活动工作中的选中单元格区域。
?Activesheet.shapes.count
3
想要解决这个问题也很简单,在工作表中使用窗体控件,就可以完美的实现点击按钮,图形重排的效果。