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とか教えていただけたらうれしいです
いつも申し訳ありません
やはり間違ったほうにいってる気がしてきました(苦笑)
とりあえず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
がエラーがでまして、なんかどんどんへんな方向にいってるようです
こういう場合ってどんな感じにしたらいいのでしょうか?
あとはプロセスが発生したときを調べてという方法があるみたいなのですが
自分が別の掲示板等で過去ログ調べてもレスがついてないので
この方法というのは無理なのでしょうか?
また随時調べていきます
> 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
お返事ありがとうございます
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
アドイン側をこのように記述させてもらいました
が理解がたらないようで
新規作成したときにしか走りません
新規作成というよりも既存のファイルを開いたときに走らせたかったので
調べますのでもうしばらくかかります
せっかく教えていただいたのに申し訳ありません
>新規作成したときにしか走りません
>新規作成というよりも既存のファイルを開いたときに走らせたかったので
>調べますのでもうしばらくかかります
え?あぁ、ごめん。特に何も考えてなかったw
…えっと。そんな時間かかるようなもんなの?
WorkbookOpen イベント拾えばいいだけでは?
ケロロ2等兵さんの書かれたコードで使ってありますが???
何度もすみません
基本的には今回の件は自宅でしかほとんどあつかえないものですから
WithEventsかもしくはxlAPP_NewWorkbookの部分が自分の理解の仕方が
悪いと思いますので調べてみてる最中です
昨晩調べたときにはWithEventsというのがあってイベントに反応して
プログラムを走らせるものとしか理解できませんでした。
実際の使い方というのをまだ身に付けていないです(苦笑)
ちなみに書いてあるコードでうごくんですよね?
自分の環境だけが既存のファイルのときは動かないだけとか??
>自分の環境だけが既存のファイルのときは動かないだけとか??
いえ、こちらでも無事(?)新規作成のみで動くことを確認できました。
[VB.NET]だと、新しいインスタンスを生成するのに必ず New って
キーワードを使うんですね。で、そっちの分野の回答の直後に書いたから
何の違和感もなく NewWorkbook っていうキーワードで脳内変換されてて
先の回答となったわけです。お許しを〜(ー人ー)
NewWorkbook ではなく WorkbookOpen を使うのが正解です。
>ちなみに書いてあるコードでうごくんですよね?
その辺りは御自分でお確かめ下さい。"とりあえず"動く事くらいは
確認してますが、それが質問者の要求を全て満たす動きかどうかまでは
保証しかねます。違う場合は今回の様に何が違うのかをご説明下さい。
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で修正はしていたのですが
アドインファイルをさしていたので間違っているのではないかと思い掲示板には
かいていませんでした。結果ただのまぐれあたりなわけですし。
すみません
> 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
イベントが起こるのはなんだかなぁ…と思うんですが、まぁ
…起こるので仕方ないかなぁ…と。
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になりました(涙)
たぶん延長で質問がでてくるかとは思いますが
ながながとつきあっていただきありがとうございました
すみません、解決チェックしわすれてました
ツイート | ![]() |