[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『上書き保存のボタンとVBAのSaveの違い』(にゃの)
先日 [[20130213091711]] で「ローカルのデータとサーバのデータを同時に更新したい」と質問して、ワークブックモジュールに VBAを記述することで解決したのですが、その後ちょっと疑問に思う出来事がありました。
Excel(2010)の左上にある「上書き保存」のアイコンをクリックすると、前回の質問の ようにローカルとサーバのデータが同時に更新されます。
最近、色々とマクロが増えてきたので「操作メニュー」シートを作って、そこから各種操作ができるようにしました。
そこについでに「上書き保存」のアイコンを作ってしまおうと思い、ボタンを置いて
Sub ブック上書き保存()
ActiveWorkbook.Save
End Sub
というマクロを登録しました。 (上記のマクロは標準モジュールに書いています)
そうすると、前回の質問の内容のように 「ローカルデータも更新しますか?」 「サーバデータも更新しますか?」 というメッセージは表示されるものの、実際には更新がされません。
(ローカルで開いていた場合、ローカルのみ上書き保存されてサーバのデータは更新されない)
何か動きが違うのかと思って「マクロの記録」でExcelの「上書き保存」ボタンを押したときの 動作を記録しても、やはり
ActiveWorkbook.Save
となっています。
VBAでの上書き保存では、ローカルとサーバのデータが同時更新されないのはなぜでしょうか?
「○○データも更新しますか?」というメッセージさえ出ないというのであればワークブックモジュールが まったく影響していないのかとも思いますが、メッセージは出るのに何故同時更新はされないのかと…
すみません、無知な私にご教授お願いします
とりあえず、最新の Workbook_BeforeSave のコードをアップしてみてはいかが?
(ぶらっと)
今のコードは下記のとおりです。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const NetWorkPath = "\\TT-AALL\share\業務\★最新データ(日々)\" 'ネットワーク上のパス Const LocalPath = "C:\Users\OWNER\Desktop\私の作業用\" 'ローカルのパス
If InStr(ThisWorkbook.Path, ":") <> 2 Then '// 条件は適宜変更 If MsgBox("ローカルデータも更新しますか?", vbYesNo, "確認") = vbYes Then _ ThisWorkbook.SaveCopyAs LocalPath & ThisWorkbook.Name Else If MsgBox("サーバデータも更新しますか?", vbYesNo, "確認") = vbYes Then _ ThisWorkbook.SaveCopyAs NetWorkPath & ThisWorkbook.Name End If
End Sub
よろしくお願いします。
手操作起動で保存した場合はちゃんとコピーされるが、 プロシージャを使って保存すると、SaveCopyAsは無視される、と云うことですね?
簡易なテストをしてみたところ、私の環境(Win7、XL2010)でも再現しました。
手起動とプログラム起動とでは動作が異なると云うのは、 Closeメソッドなんかではよく知られていますけど、Saveメソッドでも起きるんですね。
対策としては、ブック上書き保存マクロにもSaveCopyAsを書き足して置けばいいと思います。
(半平太) 2013/02/22(Fri) 14:14
半平太様
ありがとうございます。
Sub ブック上書き保存()
Const NetWorkPath = "\\TT-AALL\share\業務\★最新データ(日々)\" 'ネットワーク上のパス Const LocalPath = "C:\Users\OWNER\Desktop\私の作業用\" 'ローカルのパス
If InStr(ThisWorkbook.Path, ":") <> 2 Then '// 条件は適宜変更 ActiveWorkbook.Save ThisWorkbook.SaveCopyAs LocalPath & ThisWorkbook.Name Else ActiveWorkbook.Save ThisWorkbook.SaveCopyAs NetWorkPath & ThisWorkbook.Name End If
End Sub
このようにしてみたところ、同時保存はできましたが、例えばローカルで開いていて 「サーバデータも更新しますか?」 というメッセージが出て「いいえ」を押した場合、通常ならローカルのみ更新されるはずがサーバも更新されてしまいます。
キャンセルの場合の動きを設定するのかと思い、
Sub ブック上書き保存(ByVal SaveAsUI As Boolean, Cancel As Boolean)
とすると「引数は省略できません」となります。
どのようにすればよいでしょうか?
(にゃの)
他の回答者のレスがないですね・・・(面白い展開を期待していたのですが)
なるほどー、何も工夫しないとマクロで保存するケースでは 同じ質問が2回出現すると云う事態になっちゃいますね。
’--------------------------------------- ’標準モジュールに
Sub ブック上書き保存() With ThisWorkbook Call .saveCopyAfterInq .hasAlreadyAsked = True .Save End With End Sub
’--------------------------------------- ’Thisworkbookモジュールに
Public hasAlreadyAsked As Boolean
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If hasAlreadyAsked = False Then Call saveCopyAfterInq Else hasAlreadyAsked = False End If End Sub
Sub saveCopyAfterInq() Const NetWorkPath = "\\TT-AALL\share\業務\★最新データ(日々)\" 'ネットワーク上のパス Const LocalPath = "C:\Users\OWNER\Desktop\私の作業用\" 'ローカルのパス
If InStr(ThisWorkbook.Path, ":") <> 2 Then '// 条件は適宜変更 If MsgBox("ローカルデータも更新しますか?", vbYesNo, "確認") = vbYes Then _ ThisWorkbook.SaveCopyAs LocalPath & ThisWorkbook.Name Else If MsgBox("サーバデータも更新しますか?", vbYesNo, "確認") = vbYes Then _ ThisWorkbook.SaveCopyAs NetWorkPath & ThisWorkbook.Name End If
End Sub ’--------------------------------------
(半平太) 2013/02/22(Fri) 18:49
Dim WSH As Object
Dim Cmd As String
Set WSH = CreateObject("WScript.Shell")
Cmd = "PowerShell.exe " & "パワーシェルへのコマンド" WSH.Run Cmd, 0, True 'PowerShell 非表示でコマンド実行 Set WSH = Nothing
利点は .netのライブラリが使えることです
なので大抵のことはできます
半平太様、ハモ様ありがとうございます (インフルエンザで寝込んでいたためお礼が遅くなりました…)
半平太様のコードでうまくいきました。
PowerShell というのは聞いたことはありますが使ったことはありませんでした。 色々なやり方があるんですね… 勉強になります
(にゃの)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.