Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1880 / 13645 ツリー ←次へ | 前へ→

【71269】オートシェイプにコネクタがつながっているかどうかを調べる sakumambo 12/2/16(木) 22:25 質問[未読]
【71270】Re:オートシェイプにコネクタがつながって... kanabun 12/2/16(木) 22:52 発言[未読]
【71271】Re:オートシェイプにコネクタがつながって... sakumambo 12/2/17(金) 0:36 質問[未読]
【71273】Re:オートシェイプにコネクタがつながって... kanabun 12/2/17(金) 8:23 発言[未読]
【71274】Re:オートシェイプにコネクタがつながって... kanabun 12/2/17(金) 8:31 発言[未読]
【71299】Re:オートシェイプにコネクタがつながって... sakumambo 12/2/18(土) 10:54 質問[未読]
【71300】Re:オートシェイプにコネクタがつながって... hint 12/2/18(土) 16:55 発言[未読]

【71269】オートシェイプにコネクタがつながってい...
質問  sakumambo  - 12/2/16(木) 22:25 -

引用なし
パスワード
   オートシェイプにコネクタがつながっているかどうかを調べるにはオートシェイプのどのプロパティを見ればいいのでしょうか?
マクロを記録していろいろやってみたのですが分かりませんでした。

【71270】Re:オートシェイプにコネクタがつながっ...
発言  kanabun  - 12/2/16(木) 22:52 -

引用なし
パスワード
   ▼sakumambo さん:
>オートシェイプにコネクタがつながっているかどうかを調べるには
> オートシェイプのどのプロパティを見ればいいのでしょうか?
まず Shapes をLoopして Connector をみつけ、
それが どのAutoShapeとつながってるかを調べる、
という手順をとるらしいです。


Sub Try1()
 Dim shp As Shape
 Dim dic As Object
 Set dic = CreateObject("Scripting.Dictionary")
 For Each shp In ActiveSheet.Shapes
   If shp.Connector Then 'AutoShapeがコネクターだったら
    With shp.ConnectorFormat
     If .BeginConnected Then _
       dic(.BeginConnectedShape.Name) = Empty
     If .EndConnected Then _
       dic(.EndConnectedShape.Name) = Empty
    End With
   End If
 Next
 
 Debug.Print "Connectorに接続する図形は"
 Debug.Print Join(dic.Keys(), vbCrLf)
End Sub

【71271】Re:オートシェイプにコネクタがつながっ...
質問  sakumambo  - 12/2/17(金) 0:36 -

引用なし
パスワード
   ▼kanabun さん:
コネクタがつながっていないオートシェイプを探したいです。
コネクタがつながっていないオートシェイプが存在するのは作図ミスなのでそれを発見しなければならないといことで、困っています。
用途を書かずすみませんでした。

【71273】Re:オートシェイプにコネクタがつながっ...
発言  kanabun  - 12/2/17(金) 8:23 -

引用なし
パスワード
   ▼sakumambo さん:
>▼kanabun さん:
>コネクタがつながっていないオートシェイプを探したいです。
>コネクタがつながっていないオートシェイプが存在するのは作図ミスなのでそれを発見しなければならないといことで、困っています。
>用途を書かずすみませんでした。

そうすると、最初に Dictionaryに図形名を全部登録しておいて、
それから先ほどの「コネクターが接続している図形」名を調べ、その
名前がDictionaryにあれば削除していき、 ... Dictionaryに残った図形
名が、コネクタが接続されていない、ということかな?

Sub コネクタが接続されていないAutoShape()
 Dim shp As Object
 Dim dic As Object
 Dim ss As String
 
 Set dic = CreateObject("Scripting.Dictionary")
 'すべての図形名を辞書に登録
 For Each shp In ActiveSheet.DrawingObjects
   dic(shp.Name) = Empty
 Next
 'コネクタにつながっている図形を除外
 For Each shp In ActiveSheet.DrawingObjects
   With shp.ShapeRange
    If .Connector Then 'コネクターだったら
     With .ConnectorFormat
       If .BeginConnected Then
         ss = .BeginConnectedShape.Name
         If dic.Exists(ss) Then dic.Remove ss
       End If
       If .EndConnected Then
         ss = .EndConnectedShape.Name
         If dic.Exists(ss) Then dic.Remove ss
       End If
     End With
    End If
   End With
 Next
 
 If dic.Count > 0 Then
   MsgBox Join(dic.Keys(), vbCrLf), , _
       "Connectorにつながっていない図形は"
 Else
   MsgBox "すべての図形はConnectorと接続中"
 End If
End Sub

【71274】Re:オートシェイプにコネクタがつながっ...
発言  kanabun  - 12/2/17(金) 8:31 -

引用なし
パスワード
   ▼sakumambo さん:
すみません。↑ に、一行挿入してください


 For Each shp In ActiveSheet.DrawingObjects
   With shp.ShapeRange
    If .Connector Then 'コネクターだったら
     If dic.Exists(shp.Name) Then dic.Remove shp.Name'◆
     With .ConnectorFormat

'◆図形がコネクターだったら、辞書からそのコネクターの名前を
削除しておきます。

【71299】Re:オートシェイプにコネクタがつながっ...
質問  sakumambo  - 12/2/18(土) 10:54 -

引用なし
パスワード
   ▼kanabun さん:
どうもです。
その方法しかないのでしょうか。
つまり、オートシェイプのノードにコネクタがつながっているかどうかの情報は、コネクタ側にしか情報がないということでよいのでしょうか。
オートシェイプのnode系統にプロパティがあると信じていたのですが、コネクタ側にもオートシェイプ側にも接続情報を持たせるのは整合性のうえで無駄なのは確かなので、そういうことなのだろうとは思います。
こう書いてみて、kanabunさんの答えがあっているのだろうと思いますが、念押しの回答をいただけると精神的に安心できます。
わがままですみません。

【71300】Re:オートシェイプにコネクタがつながっ...
発言  hint  - 12/2/18(土) 16:55 -

引用なし
パスワード
   横から失礼します。
>つまり、オートシェイプのノードにコネクタがつながっているかどうかの情報は、
>コネクタ側にしか情報がないということでよいのでしょうか。
自分で事実を確認するのが一番ですよ。

Sub test()
  Dim shp As Shape
  For Each shp In ActiveSheet.Shapes
    Stop
  Next
End Sub
を実行して、止まったところで、ローカルウインドウを見てください。
shpの Connector の値はどうなっていますか?
shpの ConnectorFormat の中身はどうなっていますか?

コネクター以外のshapeに、何か利用できるプロパティが見つかりますか?
もしあれば、教えてください。

1880 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free