Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
保存時のActiveSheet名を知りたい
投稿日時: 19/11/06 15:47:14
投稿者: olive23804

いつもお世話になっております。
今回もよろしくお願い致します。
 
Excel2003で作成したファイルが複数あります。
これを、2016で動くように変更したいのですが、いきなり躓きました。
下記のようにAuto_Openで、シート名の設定無でコーディングしています。
試行錯誤の結果、TOPというシートをActiveSheetにした状態で保存すると下記のAuto_Openが動くことが分かりました。
 
 
Sub Auto_open()
 'オープン時に自動起動
 Application.ScreenUpdating = False
 If Cells(16, 4).Value = "" Then
.
.
.
.
 
 
そこで質問です。
どのシートをActiveにした状態でExcelファイルを保存したか、認識することができるのでしょうか?
シートが数十枚あり、1つ1つ確認していくのはできるならば勘弁してほしいからです。
 
何か良い方法がありましたら、教えてください。
よろしくお願い致します。

回答
投稿日時: 19/11/06 17:26:32
投稿者: WinArrow
投稿者のウェブサイトに移動

「AUTO_OPEN」はでもいいんですが
「AUTO_OPEN」は、昔の手法です。
 
Thisworkbookモジュールに
Workbook_open
というイベントプロシジャ」があります
(最初は、コードペインのう上のドロップダウン(Genera)をクリックして「Workbook」を選択すると
プロシジャが作成されます)
 
プロシジャの中に
次のようなコードを記述すると、アクティブシートの名前を取得できます。
Private Sub Workbook_Open()
    MsgBox Me.ActiveSheet.Name
End Sub
 
※Auto?Openでも同じです。
Workbook_Openプロシジャを使う場合は、AUTO?Openは不要です。
 
 
 

回答
投稿日時: 19/11/06 17:29:59
投稿者: WinArrow
投稿者のウェブサイトに移動

すみません
>※Auto_Openでも同じです。
と書いてしまいますが、
 
Auto_Openのなかでは、
「Me」は使えないでの
「ThisworkBook」に変更してください。
 
ThisworkBook.Activesheet.Name
 

投稿日時: 19/11/06 17:37:13
投稿者: olive23804

WinArrowさん、ありがとうございます。
 
もう1件、質問させてください。
なぜ、Excel2003では動いていたのでしょうか?
いつも、TOPをActiveにして保存していたからですか?
Auto_Closeには、特にそのような記述が無かったので、考え辛いのですが
保存する時に、皆がTOPシートに移動して保存していたのでしょうか?
 
もし、2003−>2016のバージョンアップのどこかの過程で
コンパイルがシビアになって、曖昧な表現は認めなくしたのでしょうか?
もし、そのようなことが記述されているサイトがありましたら
ご教授頂けると幸いです。
 
なぜ、2003では動いていたのか知りたいです。

回答
投稿日時: 19/11/06 18:15:19
投稿者: simple

横入り失礼します。
 
ひとことでいうと、イベントプロシージャといった概念が導入される前から
備わっていたものとの互換性のために残されているのが、Auto_Openです。
下記参照。(こちらのサイトの即効テクニックというコーナーの記事です)
https://www.moug.net/tech/exvba/0060077.html
普通はWorkbooks_Openを使うべきです。
 
------------------
で、質問。
> なぜ、Excel2003では動いていたのでしょうか?
> いつも、TOPをActiveにして保存していたからですか?
> Auto_Closeには、特にそのような記述が無かったので、考え辛いのですが
> 保存する時に、皆がTOPシートに移動して保存していたのでしょうか?

それは、あなたのほうが詳しく知り得る立場です。
こちらは部外者ですから、どのように運用されていたかは知りようがありません。
 
> もし、2003−>2016のバージョンアップのどこかの過程で
> コンパイルがシビアになって、曖昧な表現は認めなくしたのでしょうか?
> もし、そのようなことが記述されているサイトがありましたら
> ご教授頂けると幸いです。

> コンパイルがシビアになって、曖昧な表現は認めなくしたのでしょうか?
意味がよくわかりません。もう少し説明してください。
 
・標準モジュールにかかれたコードで、
・シートを特定していないRangeオブジェクトは、
・そのときのActiveSheetのRangeと解釈される
というのは、昔も今も変わっていません。
2016で厳しくなったとか、そういうことはありません。

回答
投稿日時: 19/11/06 20:06:17
投稿者: WinArrow
投稿者のウェブサイトに移動

>試行錯誤の結果、TOPというシートをActiveSheetにした状態で保存すると下記のAuto_Openが動くことが分か>りました。
また、Auto_Closeでも何もしていない
  
「TOP」というシートを人手で、アクティブしてから保存する
 という約束事で運用していたことになります。
  
人間がやることには、忘れるということがありますよね・・・
  
   
質問の内容は、
前回の保存時のアクティブシートを取得したい
 ということですが、
 当該ブックを開いた時には、
 強制的に「TOP」シートをアクティブにしたい
 というようにも受け取ることができます。
ブックを開いた時には、「TOP」シートをアクティブにすれば、
 前回、保存時のアクティブシートがなんでも良いわけです。
  
Private Sub Workbook_Open()
      Me.Sheets("TOP").Activate
 End Sub
と記述すれば、開いた時に「TOP」シートが前面に表示されます。
 
例示のコードでは、最初に
>Application.ScreenUpdating = False
が書かれています。
そもそも、シートをアクティブにする
という目的は、シートを選択する手間(人手操作)を1つ減らすために行うものです。
また、人手操作には
>Application.ScreenUpdating = False
は、必要ありませんから、
「TOP」シートがアクティブである必要がありません。
セルのアクセスにシート名を記述すれば、シートをアクティブのすることなく
処理ができます。
 
例えば
With Worksheet("TOP")
    If .Cells(16, 4).Value = 〜〜
のように記述することで、
シートをアクティブにすることなく、十分対応できると思います。
  
 

投稿日時: 19/11/08 09:04:49
投稿者: olive23804

WinArrowさん、simpleさん
 
ありがとうございます。
 
いきなり「これ2016用にして!今まで動いていたから。」と渡されましたが
少し修正して動かしたところ、修正を掛けていないAuto_openでエラーが出ており
本当に動いていたの?と疑心暗鬼でした。
 
次に、別の担当者が修正を掛ける時に困らないような作りにしようと思っています。
WinArrowさんの書かれているように、人間のやることなので絶対に間違いがあるので
運用での対応は最終手段と思っています。
 
Workbook_open、Workbook_closeに変更し、再作成します。
 
ご教授ありがとうございます。