6.3.3-保存形状¶
默认生成的形状是在固定位置,这跟我们最终想要的位置肯定是不符的,所以此时加入了手工移动部分,为了让下次打开的时候,形状位置是移动后的位置,需要把最后的位置信息等写入数据库。
代码如下
Sub 保存问题当前位置()
Set sht = ThisWorkbook.Worksheets("问题管理")
' 获取行数
maxRow = sht.Cells(Rows.Count, "Q").End(xlUp).Row
For i = 3 To maxRow Step 1
shapeName = sht.Cells(i, "Q").Value
Set newShape = sht.Shapes.Range(Array(shapeName))
positionX = newShape.Left
positionY = newShape.Top
widthVal = newShape.Width
heightVal = newShape.Height
lineColorRGB = newShape.Line.ForeColor.RGB
fillColorRGB = newShape.Fill.ForeColor.RGB
' 更新
inputRow = i
sht.Cells(inputRow, "R").Value = positionX
sht.Cells(inputRow, "S").Value = positionY
sht.Cells(inputRow, "T").Value = widthVal
sht.Cells(inputRow, "U").Value = heightVal
sht.Cells(inputRow, "V").Value = fillColorRGB
sht.Cells(inputRow, "W").Value = lineColorRGB
Next
End Sub
从以上代码可以看出,该过程不是直接遍历当前图片上已有的形状,而是对数据库中信息进行遍历,获取每一个形状的名称,进而获取这个形状对象,如下代码。这里就会存在一个可能的Bug,就是之前未将数据库中所有的形状显示在图片上,这样就会查找不到对象,会报错。为了避免这种情况出现,一定要先显示所有问题,在下一节中会进行说明
Set newShape = sht.Shapes.Range(Array(shapeName))
获取每个形状对象后,再获取其位置大小颜色等信息,更新到数据库中。核心信息为形状的在VBA中的变量名称,所以在上一节中生成形状时需要将其内部名称保存到数据库
shapeName = newShape.Name
sht.Cells(inputRow, "Q").Value = shapeName