[[20130221162753]] 『上書き保存のボタンとVBAのSaveの違い』(にゃの) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『上書き保存のボタンと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

話題とずれるかもしれませんが・・
ハモの場合ですけど
エクセル内部のことはVBAで処理しますが
エクセルの外がらみで困った場合は
PowerShell 使ってます

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.