エクセルVBAで現在ユーザーが使っているパソコンに個人用マクロブックが存在するかどうかを取得する方法を考えました。
まず、開いているBOOKを総当りして、エクセル2003までなら PERSONAL.XLS、2007からは"PERSONAL.XLSM がひらいているかどうかを調べる方法。
Sub test1()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name Like "PERSONAL.XLS*" Then
MsgBox "個人用マクロブックがあります。"
Exit Sub
End If
Next
MsgBox "個人用マクロブックはありません。"
End Sub
最初から個人用マクロブックがあるものとして変数に入れ、エラーになったら無いと判断する方法。
Sub test2()
Dim wb As Workbook
Dim v As String
v = IIf(Val(Application.Version) > 11, "PERSONAL.XLSM", "PERSONAL.XLS")
On Error Resume Next
Set wb = Workbooks(v)
On Error GoTo 0
MsgBox "個人用マクロブックが" & IIf(wb Is Nothing, "ありません。", "あります。")
End Sub
でも、自分の端末はまだ2000で、しかも個人用マクロブックがあるので、ちゃんと判定できているのかどうか自信がありません。
これで正しいのでしょうか?
また、test1とtest2ではどちらをつかえばいいのでしょうか?
あるいは、もっと簡単なやりかたはないのでしょうか?
横からすみません。
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
いかがでしょう?
ご丁寧にありがとうございます。
なんどもすみません、ふたつのエクセルを同時起動とは、たとえばエクセル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は両方に出てきました。
> そういったブック名を使用している恐れがあるとお考えでしたら,簡単なバリエーションで
あ、そうですね、私は頭が悪いですねえ。
なるほど。
まず,
>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
ぐらいでしょうか。
Application.StartupPathプロパティですか、初めて知りました。
ありがとうございます。
ということは、
Sub test04()
If Dir(Application.StartupPath & "\PERSONAL.XLS*") Like "PERSONAL.XLS*" Then
MsgBox "個人用マクロブックがあります。"
Else
MsgBox "個人用マクロブックはありません。"
End If
End Sub
でバージョンを問わずOKってことですね?
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
お礼
ありがとうございます。 両方とも完璧に動きました。