ExcelVBAでシート内のオブジェクトシートの開閉をする

エクセルシート内にオブジェクトとして違うシートを埋め込んで体裁を整えるやり方があります。

赤枠内をクリックすると違うエクセルシートが出現します。


埋め込んだエクセルに日付があり、これが「=now()」関数で、この埋め込みシートを開かないと日付の更新できません。

ちまちま、このエクセルを開くたびに埋め込みシートを開かずとも、何とか自動化できないか?と言う事です。


以下のコードを記述するとなんでも良いのでイベントをフックとして開いて閉じる動作ができました。

イベントに応じて自動的に開いて閉じるため「=now()」関数が更新されて現在の日時へと変更されます。

ActiveSheet.Shapes.Range(Array("object3")).Select
Windows("schedule.xlsm").Visible = True
Selection.Verb Verb:=xlPrimary
ActiveWorkbook.Close

ちょっと拡張してブックを最初に開いたときに「読み取り専用:はい」か「編集:いいえ」か?選択させて、開かせて、「編集」で開いた時のみオブジェクトを開いて閉じる設定とします。

設定をします。

「名前を付けて保存」の時に「ツール」から「全般オプション」を選択します。


ここでチェックを入れてブックを保存します。


開いた時に選択画面となります。

複数人でブックを使用する場合、先に開いた人に「編集」が与えられて、その次に同じブックを開いた人は「読み取り」になってしまうので、見るだけの人は「読み取り:はい」で見てもらう設定です。

2パターンを用意しました。


設定パターンその1

上記で「いいえ」を選択した人のみ、オブジェクトの開閉をする設定です。

「ThisWorkbook」に配置します。

Private Sub Workbook_Open()

Dim wb  As Workbook
Dim readOnlyFlg
    
Set wb = ActiveWorkbook
readOnlyFlg = wb.ReadOnly
    
  If readOnlyFlg = False Then
       
     ActiveSheet.Shapes.Range(Array("object3")).Select
     Windows("schedule.xlsm").Visible = True
     Selection.Verb Verb:=xlPrimary
  
     ActiveWorkbook.Close

  End If

'リビジョンアップ
If ActiveWorkbook.Saved = False Then
  Worksheets("Sheet1").Cells(4, 1) = Worksheets("Sheet1").Cells(4, 1) + 1
End If    
    
End Sub

設定パターンその2

上記で「いいえ」を選択した人のみ、指定範囲で初回変更があった時のみにオブジェクトを開閉します。

セルを更新するたびにオブジェクトの開閉をしていたのではウザったいので初回のみ開閉します。

初期設定タブ(シート)を用意して指定範囲に変更があった場合に始めての更新のみ初期設定タブの指定セルに数値の「1」を書き込みます。

編集が終了してブックを閉じる時に数値を「0」に元に戻して次回、ブックを開く時に開閉できるようにしておきます。

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("B3:AG17")) Is Nothing Then
  Exit Sub
Else
   If Worksheets("Sheet2").Range("F4") = 0 Then
   ActiveSheet.Shapes.Range(Array("object3")).Select
  Windows("schedule.xlsm").Visible = True
  Selection.Verb Verb:=xlPrimary
  ActiveWorkbook.Close
  End If

Worksheets("Sheet2").Range("F4").Value = 1
End If

'リビジョンアップ
If ActiveWorkbook.Saved = False Then
  Worksheets("Sheet1").Cells(4, 1) = Worksheets("Sheet1").Cells(4, 1) + 1
End If

End Sub

ブックを閉じる際に記述した値をデフォルトの「0」にします。

「ThisWorkbook」に以下を記述します。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Worksheets("Sheet2").Range("F4").Value = 0

End Sub

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です