プロが教える店舗&オフィスのセキュリティ対策術

今年入社した新人で、コンピュータ系の会社に勤めてます。
プログラミング経験は全くないので細かく教えていただきたいです。

エクセルのマクロを使って、以下のような処理をしたいと
思っています。

エクセルシート上に長方形のオートシェイプが何個かあります。
(バーのような細いものです。)
それをクリックすると「他の図形とコネクタ線でつなぎますか?」と
いう質問がでて、「はい」を選択します。
そして他のつなぎたいオートシェイプをクリックすると、
その元の図形の右端とつなぎたい図形の左端がカギ線矢印コネクタでつながる、といったマクロを作りたいです。

一応msgboxまではできていますが、つなぐための文がわかりません。

Sub AutoShape_Connect()
If MsgBox ("他の図形とコネクタ線でつなぎますか?" ,vbYesNo + vbQuestion = vbYes then

うまく伝わっていますでしょうか?
ぜひよろしくお願いします。

A 回答 (3件)

一応報告。


[vista/2007]でも動作確認しました。
あとは#2のコードで研究してみてください。
でわ、この辺で。
    • good
    • 0
この回答へのお礼

できました!!

細かく教えていただきありがとうございました。
VBAの勉強を今後も続けていきます。
本当にありがとうございました!

お礼日時:2008/08/17 20:14

Option Explicit



Sub prep() 'テストシート作成
  With Sheets.Add
    .Rectangles.Add(100, 100, 100, 10).OnAction = "try"
    .Rectangles.Add(300, 100, 100, 10).OnAction = "try"
  End With
End Sub

Sub try()
  Static x As String
  Dim ws  As Worksheet

  If Len(x) = 0 Then
    If MsgBox("connect?", vbYesNo) = vbNo Then Exit Sub
    x = Application.Caller
  Else
    Set ws = ActiveSheet
    With ws.Shapes.AddConnector(msoConnectorElbow, 0, 0, 0, 0)
      .Line.EndArrowheadStyle = msoArrowheadTriangle
      With .ConnectorFormat
        .BeginConnect ws.Shapes(x), 4
        .EndConnect ws.Shapes(Application.Caller), 2
      End With
    End With
    x = ""
    Set ws = Nothing
  End If
End Sub

上記コードを新規WorkBookの標準モジュールに置いて、Sub prep()を実行してください。
その結果、追加されたシートのシェイプをクリックしてテストしてみてください。
それでエラーが出るようならエラーメッセージも教えてください。
ちなみにExcelのバージョンは何ですか?
もし2007だったら動作確認してません。
([win2000/xl2000][winXP/xl2003]で動作確認済み)
    • good
    • 1

Excelには、便利なマクロの記録機能があります。

[ツール]-[マクロ]-[新しいマクロの記録...]です。
単純な『カギ線矢印コネクタでつながる、といったマクロ』については
まずはこれを活用して調べる事をおすすめします。

さらに、本ケースはちょっと工夫しなければいけません。
後述の方法は、[Caller プロパティ]と[Static ステートメント]について知っておく必要があります。
詳しくはヘルプで調べてください。

『マクロの登録を使って』という事なので、
Application.Callerプロパティで、マクロ実行したシェイプの名前を取得できます。
これをStatic変数に受ける事で、1回目の実行か2回目の実行かを判断し、
同時に、コネクト元とコネクト先のシェイプの名前を取得して処理します。

Sub try()
  Static x As String
  
  If Len(x) = 0 Then
    If MsgBox("connect?", vbYesNo) = vbNo Then Exit Sub
    x = Application.Caller
  Else
    With ActiveSheet
      With .Shapes.AddConnector(msoConnectorElbow, 0, 0, 0, 0)
        .Line.EndArrowheadStyle = msoArrowheadTriangle
        .ConnectorFormat.BeginConnect .Parent.Shapes(x), 4
        .ConnectorFormat.EndConnect .Parent.Shapes(Application.Caller), 2
      End With
    End With
    x = ""
  End If
End Sub



別案で、Excel自体の機能を活用する方法ならもっと簡単です。
Sub try2()
  If MsgBox("connect?", vbYesNo) = vbNo Then Exit Sub
  Application.CommandBars.FindControl(ID:=2642).accDoDefaultAction
End Sub
操作手順についても、大差ないと思いますが。

この回答への補足

ありがとうございます。早速試してみました。
try2()を試してみましたが、コネクタをつなぐ
コマンドが実行されました。

もう一つ質問させていただきたいのですが、
コネクタをつないでくれるところまで
オートシェイプをクリックしただけで自動でできないでしょうか?
try()の方が自動で右端と左端をつないでくれるものだと
思うのですが、こちらは実行してみたところ
エラーがでてしまいました。

.ConnectorFormat.BeginConnect .Parent.Shapes(x), 4

この文で処理が止まってしまいました・・・。
すみません、もしわかりましたら
回答お願いします。

補足日時:2008/08/16 13:32
    • good
    • 0

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