Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA方法';对象范围'_工作表形状失败。范围(数组)_Vba_Excel - Fatal编程技术网

VBA方法';对象范围'_工作表形状失败。范围(数组)

VBA方法';对象范围'_工作表形状失败。范围(数组),vba,excel,Vba,Excel,我正在尝试根据第一张图纸的值移动第二张图纸上的形状。我不断收到一个错误,行…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

我正在尝试根据第一张图纸的值移动第二张图纸上的形状。我不断收到一个错误,行…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

我很感激任何解决方案。

我很好奇崩溃时I的值是多少。代码基本上与录制的宏相同,但如果存在命名形状,则语法是正确的

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

当您在VBE中时,点击Ctrl+G打开即时窗口并检查输出。确保您有等腰三角形1到等腰三角形27(包括)

下一步运行宏的此修改

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
我不太喜欢在错误恢复下一步时使用
但是你正在处理一个避免检测的对象。VBE的即时窗口将报告它可能移动的形状。

如果
Pict.shapes.Range(数组(“等腰三角形”&I))。选择
工作和
Pict.shapes.Range(数组(“自由形式”&I))。选择“不存在”,则唯一的区别可能是并非所有的名称都存在。否则,为什么另一行可以工作?
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