[リストへもどる]
一括表示

投稿時間:2004/02/18(Wed) 22:38
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
エクセルブックの更新と保存
最近はじめてVB6.0で作っています。(「VBレスキュー(花ちゃん)」さんには感謝しております)
データベースのクエリから既存のエクセルシートにデータを移して(エクセル側から「外部データの取り込み」をしています)、そのシートを更新してから保存したいのですが、更新する前に「保存する為に、データの更新を中断しますか?」と尋ねられ、「はい」なら更新せずに保存してしまいますし、「キャンセル」なら、更新はするものの、その後保存されません。一体、どうしたらいいんでしょうか?「xlBook.Save」を省けば更新するだけですし...コードは以下の通りです。どこに問題があるのか、また解決法をご指南いただきたいのですが、よろしくおねがいします。

    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("***.xls")

    xlApp.Visible = True
    xlApp.ActiveWorkbook.RefreshAll
    xlBook.Save

    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing

投稿時間:2004/02/18(Wed) 23:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: エクセルブックの更新と保存
確認していませんので有効かどうか解りませんが。

保存処理の前に下記の1行を入れてみる。
xlApp.DisplayAlerts = False

ヘルプの RefreshAll メソッド の説明のところに下記の一文がありますが。
オブジェクトの BackgroundQuery プロパティに True を設定すると、バックグラウンドで更新します

# 文書は改行を入れて見やすくするか、強制改行にチェックを入れて投稿願います。
 又、パスワードを入れて修正する事も可能です。後で修正しておいて下さい。

投稿時間:2004/02/19(Thu) 17:45
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
Re^2: エクセルブックの更新と保存
改行の件、失礼いたしました(T_T)
早速アドバイス頂き、ありがとうございます。やってみます。

投稿時間:2004/02/19(Thu) 18:33
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
Re^2: エクセルブックの更新と保存
やってみましたが、うまくいきません...(T_T) 根本的にやり方が悪いのでしょうか?
Excel側でデータを読み込ませる(Excelの「外部データの取り込み」を行う)事が悪いのでしょうか?

Accessの1つのテーブルから複数のクエリを実行した結果(毎回クエリの結果が変わるデータ)を
それぞれ複数のExcelシートに読み込みたいので「外部データの取り込み」を使ったのですが...

又、そうしてデータを取り込んだExcelブックのファイル名を今日の日付で保存する事は
可能なのでしょうか?開いたExcelブックのファイルは、マスターとしてそのまま残したいのです。

投稿時間:2004/02/19(Thu) 20:26
投稿者名:黒影
Eメール:
URL :
タイトル:
Re^3: エクセルブックの更新と保存

> 又、そうしてデータを取り込んだExcelブックのファイル名を今日の日付で保存する事は
> 可能なのでしょうか?開いたExcelブックのファイルは、マスターとしてそのまま残したいのです。

とりあえずこっちだけ...
こんな感じでどうですか?
ダブらないように日付&時間で(^^;)
日付だけの場合、既存すると確認メッセージが出る...と思います。

Option Explicit
Public Const G_svFolderName = "C:\Temp" <=グローバル変数の方がより良いかと...

Private Sub Save_Excel()
    dim svExcelName  as string

    svExcelName = Format(Date, "yyyymmdd") & "_" Format(Time,"hhmmss") & ".xls"
    xlsBook.SaveAs (G_svFolderName & "\" & svExcelName)

Snd Sub

投稿時間:2004/02/19(Thu) 20:59
投稿者名:黒影
Eメール:
URL :
タイトル:
Re^3: エクセルブックの更新と保存(追記)
>Option Explicit
>Public Const G_svFolderName = "C:\Temp" <=グローバル変数の方がより良いかと...

>Private Sub Save_Excel()
>    dim svExcelName  as string
>
>    svExcelName = Format(Date, "yyyymmdd") & "_" Format(Time,"hhmmss") & ".xls"
>    xlBook.SaveAs (G_svFolderName & "\" & svExcelName)
>
>Snd Sub

上記の方法だと、名前を変える前のファイル名が残っちゃうかも...
下記のような手もあります。
@保存先のパスとファイル名を取得
  保存先パス:任意(グローバル定数で指定しておくとか...)
 ファイル名:アクティブブック
A「xlBook.Save」で保存(@のパス)
BFileSystemObjectを使用して名前を(上記の「svExcelName」に)変更

投稿時間:2004/02/19(Thu) 21:38
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
Re^4: エクセルブックの更新と保存(追記)
黒影さん、早速のアドバイスをありがとうございました!!

VBに書き込んでみましたら、「構文エラー」って出てしまいましたが、もしかしてExcelのVBですか?
言葉が足らなくて申し訳御座いませんでした!!AccessVBで現在全てのコントロールをしていますので、
よろしければAccessVBではどうするのか、ご教授願えませんでしょうか?お願いいたします。
ちなみに下記のようにVBで書いています。(Windows2000  Access2000   Excel2000  VB6.0を使用中です)

Option Compare Database
Option Explicit


Private Sub Form_Open(Cancel As Integer)

    DoCmd.MoveSize 4100, 1400, 10000, 8550
    
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("D:\***.xls")

    xlApp.ActiveWorkbook.RefreshAll
    
    xlApp.DisplayAlerts = False
    
    xlBook.Save
    xlApp.Quit

    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
End Sub

投稿時間:2004/02/20(Fri) 09:34
投稿者名:黒影
Eメール:
URL :
タイトル:
Re^5: エクセルブックの更新と保存(追記)

> VBに書き込んでみましたら、「構文エラー」って出てしまいましたが、もしかしてExcelのVBですか?

いや、VB6.0ですよ。

> 言葉が足らなくて申し訳御座いませんでした!!AccessVBで現在全てのコントロールをしていますので、
> よろしければAccessVBではどうするのか、ご教授願えませんでしょうか?お願いいたします。

すいません。AccessのVBAは使った事がありません。f^^;)

構文エラー....
よくみたら、& が抜けてました。ごめんなさい。<(__)>
誤:Format(Date, "yyyymmdd") & "_" Format(Time, "hhmmss") & ".xls"
正:Format(Date, "yyyymmdd") & "_" & Format(Time, "hhmmss") & ".xls"
                                  ↑
で、下記で試したら出来ました。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

Dim svFilePath  As String
Dim svFileName  As String

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("D:\book1.xls")

svFilePath = "d:"
svFileName = Format(Date, "yyyymmdd") & "_" & Format(Time, "hhmmss") & ".xls"

xlApp.ActiveWorkbook.RefreshAll

xlApp.DisplayAlerts = False
xlBook.saveas (svFilePath & "\" & svFileName)

xlBook.Save
xlApp.Quit

Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

投稿時間:2004/02/20(Fri) 21:20
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
ありがとうございました!!
いやぁ〜、すごいですね!!感動です!!これでファイルの整理も楽になりました!!
あとは、更新をうまくするだけになりました!!

それでご意見を伺いたいのですが、現在Excel側から「外部データの取り込み」でAccessのクエリ結果を
読み込んでいますが、「Recordsetオブジェクト」って使えるのでしょうか?今日買った本に
「ADOを使ってデータを取得する」の項目に書いてあったのですが、(..正直、書いてある事がわかりにくい)
今私が作っているプログラムでは、ブック全体の更新に時間がかかり(シート数が多い、1つのシートに
4つの外部データの取り込みをしている)、更新し終わる前に保存コードが働いてしまっているようなので、
1つ1つのシートを更新していけば、もしかしたらちゃんと更新後に保存されるような気がするもので...

もしくは、ある程度、時間がたってから(5秒とか、10秒とか)保存出来るように、次のコードの実行を
待たせるコマンド等あるのでしょうか?これだと今あるプログラムに付け加えるだけで済みそうなんです。

再度、壁を越えるアドバイスをお願いいたします!!

投稿時間:2004/02/21(Sat) 22:33
投稿者名:ののちゃん
Eメール:
URL :
タイトル:
ありがとうございました!!Part 2
1シートずつ更新するようにしたら、うまくいきました!!
花ちゃんさん、黒影さん、ありがとうございました!!
また、行き詰まったら、ご指導よろしくお願いします。

投稿時間:2004/02/23(Mon) 12:57
投稿者名:黒影
Eメール:
URL :
タイトル:
確認

Re^5: エクセルブックの更新と保存(追記)の方法でやられました?

この場合、Excelのマクロも引っ張って来ちゃいますよね?
これだと、作成したブックを「マクロを有効にする」で開かれると
データが入れ替わってしまいます。

上手く(マクロを無効にするように)作成されたのであれば良いのですが...

VBからExcelシートのコピーをする方法については、調べてみないと解りません。
どなたかご存知でしたら教えて下さい。

特にこだわりがなければ、
Excelのマクロで、新規ブックにシートをコピーして、
保存するという手法が良いかも。

確認はしていませんが、シートをコピーすると、マクロもコピーしてしまうかも
知れません。セル全体をコピーする形式が良いと思われます。

「マクロの記録」で記録して、必要個所(ブック名を変数にするくらいかな?)を
直すだけで良いと思います。

投稿時間:2004/02/24(Tue) 18:44
投稿者名:ののちゃん
Eメール:nonochan@ccn.aitai.ne.jp
URL :
タイトル:
Re: 確認
黒影さん、ご親切にアフターフォローまでして頂き、ありがとうございました!!

私の場合は規定のシートにデータを移して、ファイル名を変えましたので、元になるシートは
変更されても構わなかったので、Excelのマクロでシートを更新して保存しました。

すみません。ご参考にならなくて...