プロが教えるわが家の防犯対策術!

いつもお世話になっております。

ある図形[名前:グループ1](イメージとテキストをグループ化したもの)と
ある図形[名前:グループ2](イメージとテキストをグループ化したもの)を
コネクター[名前:コネクター1]で接続しています。
(□―□ コンナカンジ・・・)

画面上のどちらかの図形をクリックした時に、
(1)クリックされた図形の名前を取得
(2)クリックされた図形に繋がっているコネクタの情報を取得、
(3)さらにそのコネクタの接続先の図形の名前を取得する
・・・というようなVBAのプログラムを組んでいるのですが・・・、

(1)(クリックされたオートシェイプの名前を取得)
Dim objShape As Shape
Dim ShapeName as string

Set objShape = ActiveSheet.Shapes(Application.Caller)
ShapeName = objShape.name

(2)(繋がっているコネクタの情報を取得)
※正確には画面上の全シェイプをチェックしコネクタなら配列に格納
For Each sh In ActiveSheet.Shapes
'コネクタ検索
If (sh.Connector = msoTrue) Then
Set con(i) = sh
i = i + 1
End If
Next

この後、
If strShapeName = con(i).ConnectorFormat.BeginConnectedShape.Name then・・・

If strShapeName = con(i).ConnectorFormat.EndConnectedShape.Name Then・・・

というチェックをし、Trueなら、選択した図形にくっついているコネクタなんだな・・・というチェックをしたいのですが、ここで質問です。

(1)の段階で選択された図形の名前は、"グループ1"。
しかし、(2)のcon(i).ConnectorFormat.BeginConnectedShape.Nameでコネクタと繋がっている同じ図形の名前は、VBA上では何故か"Freeform 1"という名前を取得してしまいます。
これでは永遠に一致する事はありません。
Excelのワークシート上の左上にある名前空間(?シェイプを選択すると名前が出てくるところ・・・)には"グループ1"と表示されます。
しかし、ここに"Freeform 1"と入れても同じ図形が選択されます。

同じ図形なのに何故二つの名前を持ってしまっているのでしょうか・・・?

そしてどうやったら、con(i).ConnectorFormat.BeginConnectedShape.Nameで、"グループ1"の名前を取得するのでしょうか??

どなたかご教授下さい。

A 回答 (1件)

「グループ1」「グループ2」といった"名前"ですが、


自動的につけられた「既定の名前」なのでしょうか?
それとも、手動で変更した名前なのでしょうか?

「既定の名前」であれば「グループ 1」のように半角スペースが入るはずですし、
コネクタは「オートシェイプ 1」の形式になるはずなので、後者でしょうか?

どちらかによって状況が少し変わってくるのですが…。

----------------------------

>同じ図形なのに何故二つの名前を持ってしまっているのでしょうか・・・?

エクセル上に図形を作成すると、その図形には「既定の名前」がつきます。
「既定の名前」は図形の種類+連番の形式で作成されますが、
日本語表示と英語表示があって、例えば、
ワークシート上で「四角形 1」と表示される図形は、
VBA上では「Rectangle 1」となります。

ワークシート上あるいはVBA上で名前を変更すると、
そちらの名前が優先して表示されますが、
「既定の名前」がなくなったわけではなく、
引き続いて「既定の名前」で操作することができます。
変更された名前には日本語表示/英語表示といったものはありません。

----------------------------

>これでは永遠に一致する事はありません。

>どうやったら、con(i).ConnectorFormat.BeginConnectedShape.Nameで、
>"グループ1"の名前を取得するのでしょうか??

一致しないとしたら、たぶん別の理由からだと思われます。

VBA上では図形の名前は一貫して英語表示で取り扱われるので、
「英語表示」と「英語表示」(あるいは「変更された名前」と「変更された名前」)を
比較することになり、問題は生じません。

「グループ1」というのが変更された名前であれば、
VBA上でも「グループ1」という名前が返ってくるはずです。
一方、「グループ1」というのが既定の名前「グループ 1」であれば、
VBA上で返ってくる名前は「Group 1」のはずです。

おそらく、"グループ1"と"Freeform 1"は同じ図形を指してはいません。

前者は、
「イメージとテキストをグループ化したもの」="グループ 1"="Group 1"
を指しているのに対し、
後者は、
「グループ化された図形の、イメージの部分」単体="フリーフォーム 1"="Freeform 1"
を指しているのではないかと思います。

「グループ全体の名前」と「グループの部品の名前」を比較しているのが、
不一致の原因ということです。

"Freeform 1"という名前を返す図形について、
.ParentGroup.Nameで、その図形が属するグループの名前を取得して、
グループの名前どうしを比較するようにすれば解決するのではないかと思われます。

以上ご参考まで。長乱文陳謝。
    • good
    • 0
この回答へのお礼

deus_ex_machinaさん!!

本当に解り易く、ご丁寧にご説明頂きまして、本当に感謝致します!!
実際にはシェイプの名前は生成時に私が独自に命名したものになります。

私が命名した名前と、VBA上でコネクタに接続しているシェイプの名前が違うのではなく、名前は同じだけれども、コネクタが接続している"部品"が違っていたのですね!!

>「グループ化された図形の、イメージの部分」単体=
>"フリーフォーム 1"="Freeform 1"
>を指しているのではないかと思います。

この部分でピンときました!!

本当にありがとうございました!
感謝致します!!

お礼日時:2008/01/21 16:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A