- ベストアンサー
Excel VBAオブジェクト(図形)の保護
- Excel VBAのオブジェクト(図形)の保護について質問させて頂きます。
- 予約表の図形の矢印を動かせないようにし、名前と*を消すと矢印が消えるようにしたいです。
- 具体的なコーディング方法について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
もう見ていないかな? アイデアの提示だけではなんなので、自分なりのコードで試してみました。 偶数行に、値を入れ、次いで右方のセルに「*」を入れると、一つ上の行に矢印を引きます。 このときOnActionでマクロを仕込んでおきます。 引いた矢印は保護が掛けられて消せません。(簡便のためセルのデータの保護等は考慮していません) 矢印下のスタート位置のセルの値と、終了位置の「*」を消した後、矢印をクリックすると、仕込んで置いたマクロが動いて保護が外れます。下記コードではついでに消してしまっています。 ご希望の仕様と異なりますが、複雑なイベントマクロを読み解いて、更に複雑な動作を組み込む元気がありませんので、参考になる部分があればご活用下さい。(Changeイベントで全図形をスキャンして、TopLeftCell,BottomRightCellの合致をみて図形を特定し、保護を外して削除するといった事は可能と思います) '☆シートモジュール Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long Dim myColumn As Long Dim startCell As Range Dim myShape As Shape If Target.Cells.Count > 1 Then Exit Sub If (Target.Row Mod 2) > 0 Then Exit Sub If Target.Value <> "*" Then Exit Sub For i = 1 To Target.Column - 1 If Target.Offset(, -1 * i).Value <> "" And Target.Offset(, i).Value <> "*" Then Set startCell = Target.Offset(, -1 * i) Exit For End If Next i Me.Unprotect If Not startCell Is Nothing Then Set myShape = Me.Shapes.AddLine(startCell.Left, startCell.Top - startCell.Height / 2, Target.Left + Target.Width, Target.Top - startCell.Height / 2) '.Line myShape.OnAction = "shapeUnprotect" With myShape.Line .ForeColor.SchemeColor = 0 .EndArrowheadStyle = msoArrowheadStealth .Weight = 1.5 End With End If Me.Protect DrawingObjects:=True End Sub '☆標準モジュール Sub shapeUnprotect() Dim myShape As Shape Set myShape = ActiveSheet.Shapes(Application.Caller) 'なぜかBottomRightCellは矢印を引いた最終セルの一つ右のセルになっているので-1している If myShape.TopLeftCell.Offset(1, 0).Value = "" And myShape.BottomRightCell.Offset(1, -1).Value = "" Then ActiveSheet.Shapes(Application.Caller).Locked = msoFalse 'ついでに消してしまう場合 ActiveSheet.Shapes(Application.Caller).Delete End If End Sub
お礼
返信が遅くなりまして申し訳ございません。 ご回答有難うございます! ご丁寧にアイディアをご提示下さいまして、感謝致しております。 是非ご参考にさせて頂きたいと思います!