Excel VBA:如何将工作表上的所有当前形状添加到形状表中?

Excel VBA:如何将工作表上的所有当前形状添加到形状表中?,excel,shapes,vba,Excel,Shapes,Vba,有点像VBA新手 我很清楚如何使用单个或多个图形对象创建ShapeRange: 是否有方法将工作表上当前存在的所有形状添加到shprng?换句话说,是否有一种方法可以从Shapes对象返回ShapeRange。。。?大概是这样的: Set shprng = sht.Shapes.Range.SelectAll '<--- Does not work: Type Mismatch Set shprng = sht.Shapes '<--- Same er

有点像VBA新手

我很清楚如何使用单个或多个图形对象创建ShapeRange:

是否有方法将工作表上当前存在的所有形状添加到shprng?换句话说,是否有一种方法可以从Shapes对象返回ShapeRange。。。?大概是这样的:

Set shprng = sht.Shapes.Range.SelectAll '<--- Does not work: Type Mismatch
Set shprng = sht.Shapes                 '<--- Same error
Set shprng = sht.Shapes.Range           '<--- Error: Argument not optional

谢谢

如果要通过选择图纸上的所有形状来创建Shaperage,可以先选择它们,然后从选择对象获取Shaperage

sht.Shapes.Range.SelectAll
Set shprng = Selection.ShapeRange
我通常不喜欢在VBA中使用Selection对象,因为它往往是不稳定的,在奇怪的情况下可能会导致错误。我认为更好的方法是构建一个形状索引数组,并使用该数组获取形状索引

Dim shape_index As Variant
Dim i As Long

ReDim shape_index(1 To sht.Shapes.Count)
For i = 1 To UBound(shape_index)
    shape_index(i) = i
Next

Set shprng = sht.Shapes.Range(shape_index)

如果要通过选择图纸上的所有形状来创建ShaperAge,请首先选择它们,然后从选择对象获取ShaperAge

sht.Shapes.Range.SelectAll
Set shprng = Selection.ShapeRange
我通常不喜欢在VBA中使用Selection对象,因为它往往是不稳定的,在奇怪的情况下可能会导致错误。我认为更好的方法是构建一个形状索引数组,并使用该数组获取形状索引

Dim shape_index As Variant
Dim i As Long

ReDim shape_index(1 To sht.Shapes.Count)
For i = 1 To UBound(shape_index)
    shape_index(i) = i
Next

Set shprng = sht.Shapes.Range(shape_index)

在我的Office 365中,TmDean的代码不起作用。有必要将变量显式声明为dinamic数组

尺寸形状索引作为变体“尺寸形状索引作为长度” 我想我会坚持多久 将shape_index1重新定义为sht.Shapes.Count 对于i=1到UBoundshape_索引 形状_indexi=i 下一个 设置shprng=sht.Shapes.Rangeshape\u索引
在我的Office 365中,TmDean的代码不起作用。有必要将变量显式声明为dinamic数组

尺寸形状索引作为变体“尺寸形状索引作为长度” 我想我会坚持多久 将shape_index1重新定义为sht.Shapes.Count 对于i=1到UBoundshape_索引 形状_indexi=i 下一个 设置shprng=sht.Shapes.Rangeshape\u索引
谢谢-这就完成了我想做的事情。您是否知道“形状”集合对象是否是活动维护的对象向量?我的意思是:假设sht.Shapes.Count=5,我将执行sht.Shapes2.Delete;sht.Shapes.Count现在是否等于4,Shapes3和Shapes4现在是否变为2和3?是的,Shapes对象将根据您的描述自动更新。旁注:两个形状可以具有相同的名称,以防代码失败。通过以下方式向shprng添加形状来绕过此问题:shprng.select:sht.Shapesi.select replace:=false:set shprng=selection.shaperange。如果activesheet是形状所在的工作表,则可以使用。谢谢您的更正。我已经将代码更新为按索引选择,我不知道为什么我没有首先这样做。谢谢-这就完成了我要做的。您是否知道“形状”集合对象是否是活动维护的对象向量?我的意思是:假设sht.Shapes.Count=5,我将执行sht.Shapes2.Delete;sht.Shapes.Count现在是否等于4,Shapes3和Shapes4现在是否变为2和3?是的,Shapes对象将根据您的描述自动更新。旁注:两个形状可以具有相同的名称,以防代码失败。通过以下方式向shprng添加形状来绕过此问题:shprng.select:sht.Shapesi.select replace:=false:set shprng=selection.shaperange。如果activesheet是形状所在的工作表,则可以使用。谢谢您的更正。我已经将代码更新为按索引选择,我不知道为什么我没有这么做。