2

いくつかの図形とスニペット(1)を含むワークシートについて考えてみます。

'(1)
For i = 1 To Selection.Count
    MsgBox Selection(i).Name
Next

どのシェイプが選択されているかに関係なく(もちろん1つ以上である必要があります)、最初の2つのシェイプは常に返されるようです。
ShapeRange(2)の使用を検討してください。

'(2)
For i = 1 To Selection.Count
    MsgBox Selection.ShapeRange(i).Name
Next

これ(2)は、(3)と同様に、選択したシェイプの名前を実際に返します。

'(3)
For i = 1 To Selection.ShapeRange.Count
    MsgBox Selection.ShapeRange(i).Name
Next

(1)は、1つ未満の形状が選択された場合にエラーを生成しますが、(3)は正常に機能しているように見えます。ただし、グラフが唯一の選択であり、自動化エラーが返される場合を除きます。「呼び出されたオブジェクトはクライアントから切断されています。」

最初のコレクションが一般的に正しい形状を返さない理由がわかりません-Selectionコレクションは目に見えるよりも複雑であると想定しています。また、1つのグラフでSelection.ShapeRange.Countが失敗する理由もわかりません。が選択されていますが、1つのシェイプが選択されている場合は成功します。

これに当てられた光を大いに感謝します

4

2 に答える 2

2

Selection には、シェイプ以外のオブジェクトを含めることができます。選択範囲内のすべてのオブジェクトに name プロパティがあるわけではありません。複数の図形を選択するとエラーが発生するのは、おそらくそのためです。複数の図形を選択しているためです。選択したすべての形状をスキャンする適切な方法は、ここで説明した#3 です。

「オブジェクトが呼び出されました」というエラーは、Excel のバグのように聞こえます。エラーをキャッチして処理し、MS ナレッジ ベースを参照して、エラーの回避方法やエラーの発生を最小限に抑える方法について説明します。

于 2010-12-13T06:52:11.757 に答える
2

シートに 1 つのグラフと 5 つの四角形があり、Excel 2003 を使用しています。

最初に長方形を選択してからグラフを選択すると、(1) コードはエラーなしで機能します。期待どおり、選択した 2 つの図形の名前が返されます。

最初にグラフを選択してから四角形を選択すると、グラフが両方とも選択された図形であるかのように、グラフが 2 回返されます。これはバグだとしか思えません。しかし、選択を変更せずにコードを再度実行すると、最初に長方形を選択した場合と同じ結果が返されるため、奇妙なバグです。奇数。

選択されている図形が 1 つ未満の場合は、範囲が選択されていることを意味します。Excel では常に何かが選択されているため、図形が選択されていない場合は、Selection オブジェクトが Range オブジェクトを参照している可能性があります。使用できます

Typename(Selection)

選択されたものを決定します。Range が選択されていて、その範囲に名前が定義されていない場合、Name プロパティはエラーを返します。

Excel で「グラフの形」を選択することは非常に困難 (不可能?) です。グラフを単独で選択する場合は、選択ポイントを確認してください。それらは黒い四角です。コントロールキーを押しながら別の図形を選択します。チャート上の選択ポイントが白い円に変わります。単独で選択されている場合、Selection オブジェクトは実際には ChartArea オブジェクトです。Excel は、グラフを選択するときに、実際にはグラフのコンポーネント (既定では ChartArea) を選択する必要があると "推測" します。ChartArea には ShapeRange プロパティがないため、エラーが発生します。

最初に想定されるバグについては、それを証明するコードを次に示します。3 番目のセクションでは、Typename を確認していますが、何もしていないことに注意してください。これは、実際に何が選択されているかをExcelに知らせているようです

Sub testshapes()

    Dim i As Long
    Dim sType As String

    Sheet1.Shapes.Range(Array("Rectangle 5", "Chart 6")).Select

    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select

    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

    Sheet1.Shapes.Range(Array("Chart 6", "Rectangle 5")).Select

    sType = TypeName(Selection(1)) 'avoids chart selected first bug
    For i = 1 To Selection.Count
        Debug.Print Selection(i).Name
    Next i

End Sub

最初のセクションでは、正しい答えが得られます。2 番目のセクションでは、両方の debug.print ステートメントに対して「チャート 6」が表示されます。3 番目のセクションでは、正しい答えが得られます。

これがあなたの質問に完全に答えているかどうかはわかりませんが、それがあなたの質問に近づくことを願っています.

于 2010-12-13T16:30:38.423 に答える