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

シートの表示・非表示に合わせて、図形を移動できるコードを教えてください。
作業ブックに
Sub 図形移動()
Call shp_move(Worksheets("審査").Shapes("紙"), Range("L9"))
Call shp_move(Worksheets("審査").Shapes("紙報告"), Range("L12"))

End Sub

Sub shp_move(Shp As Shape, r As Range)
With r
Shp.Top = .Top + (.Height - Shp.Height) / 2
Shp.Left = .Left + (.Width - Shp.Width) / 2
End With
End Sub
のマクロがあります。
マクロを実行するとシート名「審査」の指定したセル値に指定の図形名の図形が移動します。
このコードに下記の条件を追加する方法を教えてください。
1.シート名「300」が表示されていると図形名「報告」がシート名「審査」のセル値「L15」に図形が移動
2.シート名「200」が表示されていると図形名「消防」がシート名「審査」のセル値「L15」に図形が移動
尚、シート名「200」「300」が同時に表示されることはありません。常にどちらかが表示されます。
又、最終的に、今回のマクロと違うマクロを統合して一つのマクロにすることもありますので、
ワークシートを「Worksheets("審査")」に設定しております。
よろしくお願いいたします。

質問者からの補足コメント

  • いつも回答ありがとうございます。
    下記のコードを設定しましたが、
    Sub 図形移動()
    Call shp_move(Worksheets("審査").Shapes("紙"), Range("L9"))
    Call shp_move(Worksheets("審査").Shapes("紙報告"), Range("L12"))
    End Sub
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Application.EnableEvents = False
    With Worksheets("審査")

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/31 17:06
  • If Sh.Name = "300" Then Call Module1.shp_move(.Shapes("報告"), .Range("L15"))
    If Sh.Name = "200" Then Call Module1.shp_move(.Shapes("消防"), .Range("L15"))
    .Select
    .Range("A1").Select
    End With
    Sh.Select
    Application.EnableEvents = True

    End Sub

      補足日時:2022/05/31 17:07
  • Sub shp_move(shp As Shape, r As Range)
    Dim rr As Range, exisShp As Shape
    For Each exisShp In r.Parent.Shapes
    Set rr = r.Parent.Range(exisShp.TopLeftCell, shp.BottomRightCell)
    If Not Intersect(rr, r) Is Nothing Then
    exisShp.Top = r.Offset(2).Top
    exisShp.Left = r.Offset(, 3).Left
    End If
    Next
    With r

      補足日時:2022/05/31 17:08
  • shp.Top = .Top + (.Height - shp.Height) / 2
    shp.Left = .Left + (.Width - shp.Width) / 2
    End With
    End Sub
    以上ですが、
    「Set rr = r.Parent.Range(exisShp.TopLeftCell, shp.BottomRightCell)」の部分が黄色くなりエラーメッセージが出てしまします。
    解決方法をよろしくお願いいたします。

      補足日時:2022/05/31 17:11

A 回答 (4件)

ごめんなさい


Set rr = r.Parent.Range(exisShp.TopLeftCell, shp.BottomRightCell)×

Set rr = r.Parent.Range(exisShp.TopLeftCell, exisShp.BottomRightCell)


Sub 図形移動()
Call shp_move(Worksheets("審査").Shapes("紙"), Range("L9"))
Call shp_move(Worksheets("審査").Shapes("紙報告"), Range("L12"))
End Sub
これからも呼ぶの ? なら

Sub 図形移動()
Call Module1.shp_move(Worksheets("審査").Shapes("紙"), Worksheets("審査").Range("L9"))
Call Module1.shp_move(Worksheets("審査").Shapes("紙報告"), Worksheets("審査").Range("L12"))
End Sub

Module1はshp_moveを書いたモジュール名
環境を作るのが面倒なのでデバッグは行っていません。他にもエラーが発生するかもで参考程度で・・
レスポンスの保証は出来ませんが、もし解らないエラーが出たららエラー番号と変更した部分、止まったコードを教えてください。
シェイプがない場合などのエラー処理は必須なので加えてください
    • good
    • 0
この回答へのお礼

何時も回答ありがとうございます
解決いたしました

お礼日時:2022/05/31 20:18

こんにちは


>報告>消防 のシェイプはどこにあるの?
審査シートで良ければ
>最終的に、今回のマクロと違うマクロを統合して
どの様に統合されるのか分かりませんけれど・・・

ThisWorkbookモジュールを使うやり方で

ThisWorkbookモジュールに
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Application.EnableEvents = False
With Worksheets("審査")
If Sh.Name = "300" Then Call Module1.shp_move(.Shapes("報告"), .Range("L15"))
If Sh.Name = "200" Then Call Module1.shp_move(.Shapes("消防"), .Range("L15"))
.Select
.Range("A1").Select
End With
Sh.Select
Application.EnableEvents = True

End Sub

標準モジュールに(例 Module1 )
Sub shp_move(shp As Shape, r As Range)
Dim rr As Range, exisShp As Shape
For Each exisShp In r.Parent.Shapes
Set rr = r.Parent.Range(exisShp.TopLeftCell, shp.BottomRightCell)
If Not Intersect(rr, r) Is Nothing Then
exisShp.Top = r.Offset(2).Top
exisShp.Left = r.Offset(, 3).Left
End If
Next
With r
shp.Top = .Top + (.Height - shp.Height) / 2
shp.Left = .Left + (.Width - shp.Width) / 2
End With
End Sub

勝手に解釈したところ
L15セルにすでにシェイプがある場合、2行下3列右に移動しています
シェイプが選択状態にならないようにA1セルを選択

既存の
Sub shp_move(shp As Shape, r As Range)
は、重複する可能性があるので対処してください

意図するところと違えば、忘れてください
この回答への補足あり
    • good
    • 0

visiale → visible 訂正します

    • good
    • 0

ご自身で考えてみた方が良いのでは?



Sub 図形移動()

は審査シートがACTIVEでないとエラー、というか意図しない場所に図形が移動するかもしれませんよ。

Call shp_move(Worksheets("審査").Shapes("紙報告"), Range("L12"))

プロシージャ shp_move の第二引数に渡している Range("L12") でシートを指定していないため、ACTIVEなシート、つまりレイアウトが異なるかもしれない別シートのL12の位置で計算されて移動するのでは?

Worksheets の Visiale プロパティでシートの表示または非表示の状態は調べられるので、後は IF で条件分岐させます。

shp_moveでシートに注意しながら引数を渡せば良いでしょう。
    • good
    • 0

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