VBA方法'对象范围'_Worksheet失败Shapes.Range(Array

我正在尝试根据第一张纸的值在第二张纸上移动graphics。 我不断收到一个错误…. Shapes.Range(Array(….下面是代码。

Sub graphics_mover() ' graphics_mover Macro Dim SWL_row As Double, PWL_row As Double Dim rng As Variant, i As Integer, colNum As Integer, Data As Worksheet, Pict As Worksheet Set Data = ThisWorkbook.Worksheets(1) 'Set Pict = ThisWorkbook.Worksheets(2) Set Pict = Workbooks("Well Pictographs2.xlsm").Worksheets(2) i = 1 For i = 1 To 27 SWL_row = Data.Cells(2, i + 1).Value SWL_row = Int(SWL_row / 50 + 1) Pict.Shapes.Range(Array("Isosceles Triangle " & i)).Select Selection.Top = SWL_row * 15 + 4 PWL_row = Data.Cells(3, i + 1).Value PWL_row = Int(PWL_row / 50 + 1) Pict.Shapes.Range(Array("Freeform " & i)).Select Selection.Top = PWL_row * 15 + 1 i = i + 1 Next i '-------------------------- End Sub 

导致错误的行是:

  Pict.Shapes.Range(Array("Freeform " & i)).Select 

我感谢任何解决scheme。

我很好奇,当你坠毁的时候, 的价值是什么。 代码与logging的macros大体相同,但是如果存在指定的形状,则语法是正确的。

首先运行这个小片段,将所有形状的名称输出到VBE的立即窗口(Ctrl + G)。

 Sub List_Shapes() Dim i As Long With Workbooks("Well Pictographs2.xlsm").Worksheets(2) For i = 1 To .Shapes.Count Debug.Print .Shapes(i).Name Next i End With End Sub 

当你在VBE中时,点击Ctrl + G打开立即窗口并检查输出。 确保你有等腰三angular形1等腰三angular形27 (含)。

接下来运行你的macros的这个修改。

 Sub graphics_mover() Dim SWL_row As Double, PWL_row As Double Dim rng As Variant, i As Integer, colNum As Integer, Data As Worksheet, Pict As Worksheet On Error Resume Next Set Data = ThisWorkbook.Worksheets(1) With Workbooks("Well Pictographs2.xlsm").Worksheets(2) For i = 1 To 27 SWL_row = Data.Cells(2, i + 1).Value SWL_row = Int(SWL_row / 50 + 1) If Not .Shapes("Isosceles Triangle " & i) Is Nothing Then .Shapes("Isosceles Triangle " & i).Top = SWL_row * 15 + 4 Debug.Print "moved " & .Shapes("Isosceles Triangle " & i).Name End If PWL_row = Data.Cells(3, i + 1).Value PWL_row = Int(PWL_row / 50 + 1) If Not .Shapes("Freeform " & i) Is Nothing Then .Shapes("Freeform " & i).Top = PWL_row * 15 + 1 Debug.Print "moved " & .Shapes("Freeform " & i).Name End If Next i End With End Sub 

我不喜欢使用On Error Resume Next但是您正在处理一个避免检测的对象。 VBE的立即窗口将报告它可以移动的形状。