Excelの自動保存

解決


ケロロ  2005-08-18 09:51:15  No: 91538

OS:2000pro
環境:Visual studio 6.0

いつもお世話になっていますケロロです。
今回タイトルのとおりExcelの自動保存の方法を勉強しています
やりたいこととしてはExcelを開く前にバックアップをつくっていけたらと思っています。
この場合アドインみたいなかたちでExcelにどうにかしていかないといけないのかと
思っていたのですが
検索してもあまりHP自体ひっかかりません
http://www.jomon.ne.jp/~hayakari/  とか
http://www.freeformat.co.jp/AddInIndex.htm  とかはひっかかるのですがちょっとしりたいこととは違うようですし

自分としてはExcelがからむからVBなのかなと思ったのですが
方法としてまちがってるのかとも思いますので
こういった場合どういった方法があるのかとか教え手いただけたらと思います
なんかどんどん間違った方向にいきそうな気もしますので(苦笑)
アドインの勉強もしていけたらと思っているのでわかりやすいHPとか教えていただけたらうれしいです

いつも申し訳ありません


ケロロ2等兵  2005-08-21 07:18:39  No: 91539

やはり間違ったほうにいってる気がしてきました(苦笑)
とりあえずExcel自体にアドインがあるとのことなのでそっちから手をつけてみました
Private Sub Workbook_Open()
    Dim str_name As String
    
    str_name = ActiveWorkbook.Name  →  ここでオブジェクトがないとエラー
    str_name = Replace(CStr(Date), "/", "") & Replace(CStr(Format(Time(), "hhmm")), ":", "") & str_name
    ChDir "C:\"
    ActiveWorkbook.SaveAs Filename:="C:\" & str_name,FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
End Sub

がエラーがでまして、なんかどんどんへんな方向にいってるようです
こういう場合ってどんな感じにしたらいいのでしょうか?

あとはプロセスが発生したときを調べてという方法があるみたいなのですが
自分が別の掲示板等で過去ログ調べてもレスがついてないので
この方法というのは無理なのでしょうか?

また随時調べていきます


特攻隊長まるるう  2005-08-22 20:22:04  No: 91540

>    str_name = ActiveWorkbook.Name  →  ここでオブジェクトがないとエラー
    Debug.Print ThisWorkbook.Name
とやれば分かる事だけど、ここで開くのはアドインです。
アドインも実体は Workbook で、プロパティの IsAddin が True
になっているだけなので注意して下さい。ただし、このプロパティ
が設定されていると Workbook として扱われませんし、シートも
表示されません。当然 Active にはなりませんのでエラーとなった
わけです。これも
    Application.Workbooks.Count
とか調べれば分かった事だと思います。デバッグ作業がまだまだ足りません。

今後、保存したい Workbook と非表示の Workbook(=AddIn) を
扱うことを意識して、どちらの Workbook が処理対象か?認識して
プログラミングして下さい。
[Excel VBA]アドイン側で後から開くブック名を取得するサンプル
Option Explicit
Private WithEvents xlAPP As Application
Private Sub Workbook_Open()
    Set xlAPP = Application
End Sub
Private Sub xlAPP_NewWorkbook(ByVal Wb As Workbook)
    Debug.Print Wb.Name
End Sub


ケロロ2等兵  2005-08-24 09:49:44  No: 91541

お返事ありがとうございます

Option Explicit
Private WithEvents xlAPP As Application
Private Sub Workbook_Open()
    Set xlAPP = Application
End Sub
Private Sub xlAPP_NewWorkbook(ByVal Wb As Workbook)
    Dim str_name As String
    Debug.Print Wb.Name
    MsgBox Wb.Name
    
    str_name = Wb.Name
    str_name = Replace(CStr(Date), "/", "") & Replace(CStr(Format(Time(), "hhmm")), ":", "") & str_name
    ChDir "C:\"
    ActiveWorkbook.SaveAs Filename:="C:\" & str_name, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
    
End Sub

アドイン側をこのように記述させてもらいました
が理解がたらないようで
新規作成したときにしか走りません
新規作成というよりも既存のファイルを開いたときに走らせたかったので
調べますのでもうしばらくかかります

せっかく教えていただいたのに申し訳ありません


特攻隊長まるるう  2005-08-24 22:20:00  No: 91542

>新規作成したときにしか走りません
>新規作成というよりも既存のファイルを開いたときに走らせたかったので
>調べますのでもうしばらくかかります
え?あぁ、ごめん。特に何も考えてなかったw
…えっと。そんな時間かかるようなもんなの?
WorkbookOpen イベント拾えばいいだけでは?
ケロロ2等兵さんの書かれたコードで使ってありますが???


ケロロ2等兵  2005-08-25 00:04:27  No: 91543

何度もすみません
基本的には今回の件は自宅でしかほとんどあつかえないものですから

WithEventsかもしくはxlAPP_NewWorkbookの部分が自分の理解の仕方が
悪いと思いますので調べてみてる最中です

昨晩調べたときにはWithEventsというのがあってイベントに反応して
プログラムを走らせるものとしか理解できませんでした。
実際の使い方というのをまだ身に付けていないです(苦笑)

ちなみに書いてあるコードでうごくんですよね?
自分の環境だけが既存のファイルのときは動かないだけとか??


特攻隊長まるるう  2005-08-25 00:52:06  No: 91544

>自分の環境だけが既存のファイルのときは動かないだけとか??
いえ、こちらでも無事(?)新規作成のみで動くことを確認できました。

[VB.NET]だと、新しいインスタンスを生成するのに必ず New って
キーワードを使うんですね。で、そっちの分野の回答の直後に書いたから
何の違和感もなく NewWorkbook っていうキーワードで脳内変換されてて
先の回答となったわけです。お許しを〜(ー人ー)

NewWorkbook ではなく WorkbookOpen を使うのが正解です。

>ちなみに書いてあるコードでうごくんですよね?
その辺りは御自分でお確かめ下さい。"とりあえず"動く事くらいは
確認してますが、それが質問者の要求を全て満たす動きかどうかまでは
保証しかねます。違う場合は今回の様に何が違うのかをご説明下さい。


ケロロ2等兵  2005-08-25 04:43:16  No: 91545

Option Explicit
Private WithEvents xlAPP As Application
Private Sub Workbook_Open()
    Set xlAPP = Application
End Sub
Private Sub xlAPP_WorkbookOpen(ByVal Wb As Workbook)  ←
    Dim str_name As String
    Debug.Print Wb.Name
    MsgBox Wb.Name
    
    str_name = Wb.Name
    str_name = Replace(CStr(Date), "/", "") & Replace(CStr(Format(Time(), "hhmm")), ":", "") & str_name
    ChDir "C:\"
    ActiveWorkbook.SaveAs Filename:="C:\" & str_name, FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
    
End Sub

に修正しました
がブック名・ActiveWorkBookがアドインファイルをさしてしまいます
なにか特別なイベント名があるのでしょうか?

>ちなみに
すみません。質問する側の言葉でないといまさらながらに実感しています。
自分の環境だけなのか貼り付けたプログラムがまちがっているのかわからなくなっていたもので
まことに申し訳ありませんでした。

結局振り出しにもどったようで自分でもなさけないです。
ひきつづき調べてみます
なにを思ったかWorkbookOpenで修正はしていたのですが
アドインファイルをさしていたので間違っているのではないかと思い掲示板には
かいていませんでした。結果ただのまぐれあたりなわけですし。
すみません


特攻隊長まるるう  2005-08-25 18:07:19  No: 91546

>    Debug.Print Wb.Name
>    MsgBox Wb.Name
Debug.Print して結果出力してあるわけですから、MsgBox
は使わないで下さい。MsgBox はユーザの操作(OKボタン押下)
で一連の処理の流れを止めます。本来、この辺りの処理で処理が
中断する事はありませんので、想定外のエラーになったり、
イベントの発生順が変わって誤動作をする場合があります。

>ActiveWorkBookがアドインファイルをさしてしまいます。
ActiveWorkBook は使わないで下さい。それと、アドイン
ファイルは ActiveWorkBook にはならないでしょう。Wb
の間違いでは?

アドインも Workbook だと説明したはずですが?…当然
WorkbookOpen イベントを起こします。こちらの出力では
>アドイン名
>Workbook 名
の順番で出力されます。その後、既存のファイルを開くごとに
>Workbook 名
が出力されます。Workbook 名がアドイン名だった時に
処理を飛ばして下さい。

注)アドインの Workbook_Open イベントで Set xlAPP = Application
しているのに、その時点で開いてるはずのアドインの WorkbookOpen
イベントが起こるのはなんだかなぁ…と思うんですが、まぁ
…起こるので仕方ないかなぁ…と。


ケロロ2等兵  2005-08-25 21:35:08  No: 91547

Option Explicit
Private WithEvents xlAPP As Application
Private Sub Workbook_Open()
    Set xlAPP = Application
End Sub
Private Sub xlAPP_WorkbookOpen(ByVal Wb As Workbook)
    Dim str_name As String
    Dim str_name2 As String
    Dim Ret As Long
    
    If InStr(1, Wb.Name, ".xla") = 0 Then
        Debug.Print Me.Path
        str_name = Wb.Path & "\" & Wb.Name
        str_name2 = Replace(CStr(Date), "/", "") & Replace(CStr(Format(Time(), "hhmmss")), ":", "") & Wb.Name
        ChDir "C:\"
        Ret = CopyFile(str_name, "C:\" & str_name2, 1)

    End If
End Sub

にて動きましたありがとうございます
msgboxってまずいんですね
App_WorkbookOpen動かす時にDebug.Printだけかきこんで保存はずせばきづいてたんですね・・・
後半はいらない手間をかけてすみません
Wbでアドイン側のブック名がでてたのでそこをなんとかしないととばかり思ってしまって(汗)
なにかイベントがあるとか設定がおかしいとかそういったことを調べてました
ぜんぜん的外れでした

開いてるファイルにたいしてコピーできなかったのでAPIになりました(涙)

たぶん延長で質問がでてくるかとは思いますが
ながながとつきあっていただきありがとうございました


ケロロ2等兵  2005-08-25 21:50:22  No: 91548

すみません、解決チェックしわすれてました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加