• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:個人用マクロブックの有無)

個人用マクロブックの有無を確認する方法

このQ&Aのポイント
  • エクセルVBAを使用して、現在のユーザーが使っているパソコンに個人用マクロブックが存在するかどうかを確認する方法について考えました。
  • 方法1では、開いているブックを総当りして、エクセル2003までの場合は「PERSONAL.XLS」、2007以降の場合は「PERSONAL.XLSM」が開かれているかどうかを調べる手法です。
  • 方法2では、変数に個人用マクロブックの名前を代入し、エラーが発生しなければ存在すると判断する手法です。ただし、正確な判定をするためにはエクセルバージョンを考慮する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

横からすみません。 6545075 で問題のコードを回答したmerlionXXです。 たしかにemaxemaxさんのご指摘の通り、個人用マクロブックが開いているとわたしのコードでは該当のBOOKは閉じますがエクセル自体は終了しませんね。 (Workbooks.Count が1ではないので当然ですが) それに対応するコードならすでにemaxemaxさんは解決されているとおもいますが、参考のため二つあげておきます。 1.emaxemaxさんがTest1で判定に使った方法にWendy02さまのアドバイスを入れた方法 Sub TEST01()   Dim wb As Workbook   ActiveWorkbook.Save   For Each wb In Workbooks    If wb.Name <> ActiveWorkbook.Name And Not StrConv(wb.Name, vbUpperCase) Like "PERSONAL.XLS*" Then     ActiveWorkbook.Close (False)     Exit Sub    End If   Next wb   Application.Quit End Sub 2.keithinさまがアドバイスしたApplication.StartupPath プロパティを利用する方法 Sub TEST02()   Dim i As Integer   i = IIf(Dir(Application.StartupPath & "\PERSONAL.XLS*") Like "PERSONAL.XLS*", 2, 1)   ActiveWorkbook.Save   If Workbooks.Count = i Then     Application.Quit   Else     ActiveWorkbook.Close (False)   End If End Sub いかがでしょう?

emaxemax
質問者

お礼

ありがとうございます。 両方とも完璧に動きました。

その他の回答 (5)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.6

なるほど。少しご説明不足でしたね。 >PERSONAL.XLSは編集のためロックされています そのダイアログには,実際には 「読み取り専用」 「通知」 「キャンセル」 の3つの選択肢ボタンが付いています。 「読み取り専用」と「通知」を選んだエクセルでは,PERSONALが開いています。ユーザーがキャンセルを選んだときには,PERSONALは開いていません。 この動作はひとつのエクセルを重ねて起動した場合でも,複数の(異なるバージョンの)エクセルを同時に使っていても同じです。

emaxemax
質問者

お礼

何度もありがとうございました。 > ユーザーがキャンセルを選んだときには,PERSONALは開いていません。 確認できました。 とても勉強になりました。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.5

>どういうケースなのでしょうか? ANo.2で回答済みですが,一例としては >たとえば2つ以上のエクセルを同時起動して使っているようなユーザーでは,ひとつのExcelでしかPERSONALは開いていません。 つまり1つのエクセルでPESONALが開いています。別のエクセルではPERSONALは開いていません。 ちなみに >Thisworkbookが開いているとき,…あるとは思いませんでした。 もしこれが,当該のマクロを「個人用マクロブックに登録して運用する」という運用を前提に置いてのご質問だとすると,「自分がPERSONAL」ですから何を調べるまでもありません。 しかし一応念のため,回答している一連のマクロはPERSONALを含めてどのブックに持たせてあっても正常に動作します。 >たとえば PersonalCheck.xls とかPERSONALDATA.XLSとかが開いてても閉じられてしまいませんか? そういったブック名を使用している恐れがあるとお考えでしたら,簡単なバリエーションで …(left(w.name, 9),…) <> "PERSONAL." でも …(left(w.name, 12),…) <> "PERSONAL.XLS" でも構いません。

emaxemax
質問者

お礼

ご丁寧にありがとうございます。 なんどもすみません、ふたつのエクセルを同時起動とは、たとえばエクセル2000と2007のダブルブートのようなことでしょうか? 私はエクセル2000しかないのですが、ためしに2000を立ち上げBOOKを開いた状態で、再度エクセルを起動させて見ました。 すると、 「PERSONAL.XLSは編集のためロックされています。」 というメッセージは出ましたがまたエクセルが立ち上がりました。 両方のエクセルで Sub TEST() Dim wb As Workbook For Each wb In Workbooks MsgBox wb.Name Next wb End Sub を走らせて見たところ、それぞれのエクセルで開いたBOOKの名前しか表示されませんでしたが、PERSONAL.XLSは両方に出てきました。 > そういったブック名を使用している恐れがあるとお考えでしたら,簡単なバリエーションで あ、そうですね、私は頭が悪いですねえ。

emaxemax
質問者

補足

> 当該のマクロを「個人用マクロブックに登録して運用する」という運用を前提に置いてのご質問だとすると いえいえ、あくまで現在開いているActiveなBOOKに書いてあることが前提です。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.3

なるほど。 まず, >If Dir(Application.StartupPath & "\PERSONAL.XLS*") Like … これでバージョンを問わず,とりあえず標準のXLSTARTフォルダに個人用マクロブックがあるか無いかを確認できますね。 で,実際にやりたかったことについていえば 「自分ブック(若しくはActiveworkbook)は絶対に開いている」 「個人用マクロブックは開いているかどうかに関わらず」 「(自分でもPERSONALでもない)第三のブックが開いていたら自分.close,開いていなければQuit」 という事ですから dim w as workbook activeworkbook.save for each w in workbooks  if w.name <> activeworkbook.name and strconv(left(w.name, 8), vbuppercase) <> "PERSONAL" then   activeworkbook.close false   exit sub  end if next application.quit ぐらいでしょうか。

emaxemax
質問者

お礼

ありがとうございます。 > 「個人用マクロブックは開いているかどうかに関わらず」 Thisworkbookが開いているとき、個人用マクロブックが開いてないということがあるとは思いませんでした。 どういうケースなのでしょうか? > strconv(left(w.name, 8), vbuppercase) <> "PERSONAL"  とすると、たとえば PersonalCheck.xls とかPERSONALDATA.XLSとかが開いてても閉じられてしまいませんか?

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

古いエクセルを使っていたパソコンに2007以降を追加/アップグレードインストールしていた場合など,2007以降でもPERSONAL.XLSが残存しますので,test1の方が安全です。 なお >現在ユーザーが使っているパソコンに個人用マクロブックが存在するかどうか どこまでゲンミツに(または何を目的に)そういう事をしたいのかにもよるのでしょうけど,たとえば2つ以上のエクセルを同時起動して使っているようなユーザーでは,ひとつのExcelでしかPERSONALは開いていません。 簡便な方法としてはapplication.startuppath(およびAltStartupPath)に通常はPERSONALはありますので,そちらを念のため調べてみるような手もありです。 またApplication.path内のXLSTART内にある事も可能です。

emaxemax
質問者

お礼

Application.StartupPathプロパティですか、初めて知りました。 ありがとうございます。 ということは、 Sub test04() If Dir(Application.StartupPath & "\PERSONAL.XLS*") Like "PERSONAL.XLS*" Then MsgBox "個人用マクロブックがあります。" Else MsgBox "個人用マクロブックはありません。" End If End Sub でバージョンを問わずOKってことですね?

emaxemax
質問者

補足

> (または何を目的に)そういう事をしたいのかにもよるのでしょうけど 実は、http://okwave.jp/qa/q6545075.html でのベストアンサーで もし、開いているBOOKが一つだけの場合はBOOKもエクセルも両方とも終了させる。 複数のBOOKがひらいていれば、ボタンを押したBOOKだけを終了させる。(エクセルは終了しない) のコードが自分では上手くいかなかったのです。 原因は多分個人用マクロブックがあるせいだと気がつき、個人用マクロブックがあってもなくとも大丈夫なコードを考えようと思ったんです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

Test1でよいのですが、大文字・小文字は合わせないといけませんね。 Sub test1()   Dim wb As Workbook     For Each wb In Workbooks       '*↓ここ       If StrConv(wb.Name, vbUpperCase) Like "PERSONAL.XLS*" Then         MsgBox "個人用マクロブックがあります。"         Exit Sub       End If     Next   MsgBox "個人用マクロブックはありません。" End Sub もっと簡単なやり方? 簡単だと言えるかはわかりません。Perosnal.xls は、必ず、Sheet ひとつがありますから、以下のようにすれば出来ると思います。 Sub Test3() Dim ret As Variant  If Val(Application.Version) > 11 Then   ret = Workbooks("PERSONAL.XLSM").Worksheets(1).Cells(1, 1).Value  Else   ret = Workbooks("PERSONAL.XLS").Worksheets(1).Cells(1, 1).Value  End If  MsgBox IIf(IsError(ret), "個人用マクロブックはありません。", "個人用マクロブックはあります。") End Sub

emaxemax
質問者

お礼

ありがとうございます。 とても勉強になります。

関連するQ&A