Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


708 / 2272 ツリー ←次へ | 前へ→

【10445】エクセルファイルにデータを出力 あおぎん 08/6/26(木) 16:18 質問[未読]
【10446】Re:エクセルファイルにデータを出力 kohji 08/6/26(木) 17:26 回答[未読]
【10447】Re:エクセルファイルにデータを出力 あおぎん 08/6/27(金) 11:38 質問[未読]
【10448】Re:エクセルファイルにデータを出力 小僧 08/6/30(月) 11:55 回答[未読]
【10449】Re:エクセルファイルにデータを出力 あおぎん 08/7/1(火) 17:18 質問[未読]
【10450】Re:エクセルファイルにデータを出力 小僧 08/7/3(木) 11:02 回答[未読]
【10460】Re:エクセルファイルにデータを出力 あおぎん 08/7/8(火) 15:04 質問[未読]
【10468】Re:エクセルファイルにデータを出力 小僧 08/7/17(木) 10:42 回答[未読]
【10451】Re:エクセルファイルにデータを出力 neptune 08/7/3(木) 14:31 発言[未読]
【10461】Re:エクセルファイルにデータを出力 あおぎん 08/7/8(火) 15:23 お礼[未読]
【10462】Re:エクセルファイルにデータを出力 neptune 08/7/9(水) 15:18 発言[未読]

【10445】エクセルファイルにデータを出力
質問  あおぎん  - 08/6/26(木) 16:18 -

引用なし
パスワード
    いつもお世話になっています。

 社会保険資格届出用のデータを作成するのに、コマンドボタンに下のようなコードを記述しました。
 やりたいことは、フォーム上で条件をつけて作成したクエリのデータを、指定のエクセルファイルの指定シートの指定場所に貼り付けるということです。

 いろいろな過去ログを参考に、なんとかコードを記述し、実行したところ、エクセルファイルに貼り付けるところまではできましたが、最後に、そのファイルを開く操作がうまくいきません。
 また、指定エクセルファイルを開いてないのに、開いているときの処理(ファイルを保存ダイアログ)が出てくるなど、ときどき微妙に変な動きをします。

 今回初めてエクスポートでなくCopyFromRecordsetを使ったので、記述内容に自信がありません。
 無駄や不備があるせいではないかと思うのですが・・。

 エクセルの開き方及び微妙な動きの解消について、ご教示をよろしくお願いします。


コードは以下のとおりです。(長くてすみません)

Dim DB As Database
 Dim qdf As QueryDef
 Dim rst As DAO.Recordset
 Dim xlsApp As Object
 Dim xlsWkb As Object
 Dim MyFile As String

 Dim str As String, constr As String
 Dim strmsg As String
 
  省略(ここで選択クエリの作成処理)
 
  Set DB = CurrentDb()
  Set qdf = DB.QueryDefs("Q_社保エクスポート用")
  qdf.SQL = str
  qdf.Close
  
  'レコードセットを開く
  Set rst = DB.OpenRecordset("Q_社保エクスポート用")
  If rst.RecordCount = 0 Then
    MsgBox "対象者がいません。", vbOKOnly, "データなし"
    rst.Close
    DB.Close
  Else
    rst.Close
    DB.Close
    
    'オブジェクトの作成
    Set xlsApp = CreateObject("Excel.Application")
    
    'ファイルを開く
    MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
    Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
    Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
    xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
    xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
  
   Set rst = Nothing
   xlsWkb.Close True: Set xlsWkb = Nothing
   xlsApp.Quit: Set xlsApp = Nothing

  End If
  
  MsgBox "処理が終了しました。" & vbCr & "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xlsを開いて届出帳票を印刷してください。"

<ここまではうまくいきますが、下の記述では開きませんでした。(オブジェクトがないというエラーメッセージが出ます。>
 
  MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
  xlsApp.Workbooks.Open (MyFile)
  xlsApp.Worksheets("T_社保資格喪失").Activate
  xlsApp.Visible = True
  xlsApp.UserControl = True
Exit Sub
(アクセス、winともに2000)


ためしに別の記述を試してみたのですが(↓)開きませんでした。(該当のファイルがないというエラーです。)
 stAppName = "Excel.exe D:\MyDocuments\2008\社会保険届出関連\WT_社保資格喪失.xls"
   Call Shell(stAppName, 1)

【10446】Re:エクセルファイルにデータを出力
回答  kohji  - 08/6/26(木) 17:26 -

引用なし
パスワード
   こんにちは

>'ファイルを開く
>MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
>xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
>xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
>  
>Set rst = Nothing
>xlsWkb.Close True: Set xlsWkb = Nothing
>xlsApp.Quit: Set xlsApp = Nothing

上記 Excelを閉じていますが
これをこのまま利用すればどうかな?

MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
xlsApp.UserControl = True
xlsApp.Visible = True

AppActivate "Microsoft Excel"

みたいな感じで…
検証はしてないですが…

【10447】Re:エクセルファイルにデータを出力
質問  あおぎん  - 08/6/27(金) 11:38 -

引用なし
パスワード
   ▼kohji さん:

回答ありがとうございます。
ご提示の方法を参考に下記のように記述したらうまくいきました。

Else
rst.Close
DB.Close
    
'オブジェクトの作成
  Set xlsApp = CreateObject("Excel.Application")
   
'ファイルを開く
  MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
  Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
    
  Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
  xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents  
  xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
  
 MsgBox "処理が終了しました。" & vbCr & "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xlsを開いて届出帳票を印刷してください。"
    
 xlsApp.UserControl = True
 xlsApp.Visible = True

 AppActivate "Microsoft Excel"


で、また疑問が出てきたので、よろしければもう少しおつきあいを・・。
  
Set rst = Nothing
xlsWkb.Close True: Set xlsWkb = Nothing
xlsApp.Quit: Set xlsApp = Nothing

この部分は記述すると、開いたファイルが閉じる動きをするので、不要なんですよね?
Close Quit の意味はなんとなくわかるのですが、Nothingの意味がよく理解できていないので、全部不要なのか、一部を記述したほうがよいのか、いまひとつ分かりません。

VBAの本などを見ると、 Close と Nothing はセットで使用されているようです。
ということは、 Set rst = Nothing は 上のほうにある rst.Close とセットなので、残したほうがいいのでしょうか?


>上記 Excelを閉じていますが
>これをこのまま利用すればどうかな?
>
>MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
>xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
>xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
>xlsApp.UserControl = True
>xlsApp.Visible = True
>
>AppActivate "Microsoft Excel"
>
>みたいな感じで…
>検証はしてないですが…

【10448】Re:エクセルファイルにデータを出力
回答  小僧  - 08/6/30(月) 11:55 -

引用なし
パスワード
   ▼あおぎんさん、kohjiさん
こんにちは。

Workbook.Close は Excel のメニューから
[ファイル] → [閉じる] の動作、

Application.Quit は Excel のメニューから
[ファイル] → [終了] の動作と同意です。


Set xx = Nothing については
以前に同じ様な事を回答した事があるので
ご参考までに紹介させて頂きます。

h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=9646;id=access


>  Set qdf = DB.QueryDefs("Q_社保エクスポート用")
>  qdf.SQL = str
>  qdf.Close
>  
>  'レコードセットを開く
>  Set rst = DB.OpenRecordset("Q_社保エクスポート用")

何回かレコードセットを開きなおしているようですが、
QueryDef オブジェクトをそのまま使って
qdf.OpenRecordset なんて使い方もできますよ。

また、3回目にセットしている箇所も
Dynaset タイプで開く必要がなさそうですので、
1回だけ開けば問題なさそうですね。


> オブジェクトがないというエラーメッセージが出ます。

上の方にある

> xlsApp.Quit: Set xlsApp = Nothing

という箇所で、変数:xlsApp への参照を切ってしまったために

xlsApp.Workbooks.Open (MyFile)

がうまくいってないですね。

kohjiさんご指摘の通り、Excelを閉じないのが一番の回避策ですが、
Quit を後にすればもう一度開く事もできるかと思われます。

【10449】Re:エクセルファイルにデータを出力
質問  あおぎん  - 08/7/1(火) 17:18 -

引用なし
パスワード
   ▼小僧 さん:
回答ありがとうございます。
お礼が遅れて申し訳ありません。


>Workbook.Close は Excel のメニューから
>[ファイル] → [閉じる] の動作、
>
>Application.Quit は Excel のメニューから
>[ファイル] → [終了] の動作と同意です。
>
>
>Set xx = Nothing については
>以前に同じ様な事を回答した事があるので
>ご参考までに紹介させて頂きます。
>
>h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=9646;id=access

上記確認しました。
いろいろな考えがあるようですが、開けたドアは閉じてみたほうがいいのかな・・?。
参考になりました。
ありがとうございます。


>
>>  Set qdf = DB.QueryDefs("Q_社保エクスポート用")
>>  qdf.SQL = str
>>  qdf.Close
>>  
>>  'レコードセットを開く
>>  Set rst = DB.OpenRecordset("Q_社保エクスポート用")
>
>何回かレコードセットを開きなおしているようですが、
>QueryDef オブジェクトをそのまま使って
>qdf.OpenRecordset なんて使い方もできますよ。
>
>また、3回目にセットしている箇所も
>Dynaset タイプで開く必要がなさそうですので、
>1回だけ開けば問題なさそうですね。

レコードセットを開くということをいまいち理解できていないので、
上記のことがよくわかりません。
Dynaset タイプもヘルプで調べてみたんですが、どういう場合にこのタイプがいいのかまで理解できませんでした・・。
ただ、1回開けばいいとのご指摘でしたので、ご指摘を参考に次のように記述してみたら、エラーもなく実行されました。
でも、何回か試していると、なぜか、エクセルが読み取り専用で開かれたりします。
どこかおかしい記述があるんでしょうか?
ご指摘いただけたら幸いです。

  'クエリの作成
  str = str & constr & ";"
  Debug.Print str

  Set DB = CurrentDb()
  Set qdf = DB.QueryDefs("Q_社保エクスポート用")
  qdf.SQL = str
  'qdf.Close ←これを削除
  
  'レコードセットを開く
  Set rst = qdf.OpenRecordset ←これを追加
  'Set rst = DB.OpenRecordset("Q_社保エクスポート用")←これを削除
  If rst.RecordCount = 0 Then
    MsgBox "対象者がいません。", vbOKOnly, "データなし"
    rst.Close
    DB.Close
  Else
    'rst.Close ←これを削除
    'DB.Close  ←これを削除
    
    'オブジェクトの作成
    Set xlsApp = CreateObject("Excel.Application")
    
    'ファイルを開く
    MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
    Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
    
    'Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset) ←これを削除
    
    xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
    
    xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
  
  MsgBox "処理が終了しました。" & vbCr & "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xlsを開いて届出帳票を印刷してください。"
    
    xlsApp.UserControl = True
    xlsApp.Visible = True

    AppActivate "Microsoft Excel"


>
>> オブジェクトがないというエラーメッセージが出ます。
>
>上の方にある
>
>> xlsApp.Quit: Set xlsApp = Nothing
>
>という箇所で、変数:xlsApp への参照を切ってしまったために
>
>xlsApp.Workbooks.Open (MyFile)
>
>がうまくいってないですね。
>
>kohjiさんご指摘の通り、Excelを閉じないのが一番の回避策ですが、
>Quit を後にすればもう一度開く事もできるかと思われます。

こちらのご指摘は、時間がなくてまだ確認していません。
試してみて分からなければ、また質問させてください。

【10450】Re:エクセルファイルにデータを出力
回答  小僧  - 08/7/3(木) 11:02 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

> レコードセットを開くということをいまいち理解できていないので、
> 上記のことがよくわかりません。

テーブルにある 1行のデータが Record
Recordsetは、それの「セット」なんで、データ群ってところでしょうか(笑)


> Set rst = DB.OpenRecordset("Q_社保エクスポート用")

Q_社保エクスポート用 というテーブル(クエリ)のデータを
変数:rst の中にごっそりと納めてしまう、という命令です。


> Dynaset タイプもヘルプで調べてみたんですが、
> どういう場合にこのタイプがいいのかまで理解できませんでした・・。

データの扱いを大きくわけると「参照」「変更」の2種類があります。
さて、今回は変数の中に入れたデータをどのように扱いたいのでしょうか。

ヘルプの説明で様々なType、Optionがあるのは
お解かりになったと思われますが、
それを全て説明すると、掲示板での応答では大変な事になってしまいます。

ものすごくアバウトな説明ですが、

参照時:dbOpenSnapshot
変更時:dbOpenDynaset

を type に指定すると汎用的に使えそうですね。


> でも、何回か試していると、なぜか、エクセルが
> 読み取り専用で開かれたりします。
> どこかおかしい記述があるんでしょうか?

コードを色々テストしている最中に、
エラーで止まってしまった事はありませんでしたか?

タスクマネージャを起動してみると、
Excelが見えないのに、Excel.exe が起動している事があります。

これは

> Set xlsApp = CreateObject("Excel.Application")

で呼び出した Excelのインスタンスが解放されずに
非表示の状態で立ち上がったままになっており、

> Set xlsWkb = xlsApp.Workbooks.Open(MyFile)

で起動した時に 2重起動になっている可能性がありえます。

Excelを多重起動するとファイルが破損される可能性もありますので
バックアップはこまめにとっておきましょう。


プログラムが安定するまで、

  Set xlsApp = CreateObject("Excel.Application")
  xlsApp.Visible = True

の様に、Excel のインスタンスを作ったらすぐに表示する様にしておくと、
上記のトラブルが減るかもしれませんね。

【10451】Re:エクセルファイルにデータを出力
発言  neptune  - 08/7/3(木) 14:31 -

引用なし
パスワード
   ▼あおぎん さん:
▼小僧 さん:
こんにちは

小僧 さんが既に書かれているようにExcel Applicationのインスタンスが
消えてないんでしょう。

>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
恐らく、↑の後始末が出来てないからでは?

先ずは、キチンと閉じて、参照を停止する処理を追加してみて下さい。
xlsWkb.close
xlsWkb =nothing

xlsWkb が残っているから、xlsAppの幽霊が残ってしまっているような気がします。

【10460】Re:エクセルファイルにデータを出力
質問  あおぎん  - 08/7/8(火) 15:04 -

引用なし
パスワード
   ▼小僧 さん:

こんにちは。お返事が遅くなってすみません。
また、丁寧なご回答ありがとうございます。


>テーブルにある 1行のデータが Record
>Recordsetは、それの「セット」なんで、データ群ってところでしょうか(笑)
>
>
>> Set rst = DB.OpenRecordset("Q_社保エクスポート用")
>
>Q_社保エクスポート用 というテーブル(クエリ)のデータを
>変数:rst の中にごっそりと納めてしまう、という命令です。

なんとなくイメージが湧きました。(なんとなくですみません;)
変数は数字や文字を格納するものという頭があったので、こういうデータをごっそり納められる変数があるということが、どうしても理解しにくかったのです。

>
>> Dynaset タイプもヘルプで調べてみたんですが、
>> どういう場合にこのタイプがいいのかまで理解できませんでした・・。
>
>データの扱いを大きくわけると「参照」「変更」の2種類があります。
>さて、今回は変数の中に入れたデータをどのように扱いたいのでしょうか。
>
>ヘルプの説明で様々なType、Optionがあるのは
>お解かりになったと思われますが、
>それを全て説明すると、掲示板での応答では大変な事になってしまいます。
>
>ものすごくアバウトな説明ですが、
>
>参照時:dbOpenSnapshot
>変更時:dbOpenDynaset
>
>を type に指定すると汎用的に使えそうですね。

今回は、変数に入れたデータをそのままエクセルに出力したいので、参照時ということになるのですね?
変更時というのは、変数に入れたデータをさらに加工したい場合 ということになるのでしょうか??
今のところ、必要ない(というよりどういう場合使用したらいいのかよくわかってません;)ので、dbOpenSnapshotで開いたらいいということにしておきます(笑)

>
>
>> でも、何回か試していると、なぜか、エクセルが
>> 読み取り専用で開かれたりします。
>> どこかおかしい記述があるんでしょうか?
>
>コードを色々テストしている最中に、
>エラーで止まってしまった事はありませんでしたか?

エラーで止まりはしないのですが、読み取り専用になっていることがたびたびありました。きちんと閉じてから、コードを試していたのですが。

>タスクマネージャを起動してみると、
>Excelが見えないのに、Excel.exe が起動している事があります。
>
>これは
>
>> Set xlsApp = CreateObject("Excel.Application")
>
>で呼び出した Excelのインスタンスが解放されずに
>非表示の状態で立ち上がったままになっており、
>
>> Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>
>で起動した時に 2重起動になっている可能性がありえます。
>>プログラムが安定するまで、
>
>  Set xlsApp = CreateObject("Excel.Application")
>  xlsApp.Visible = True
>
>の様に、Excel のインスタンスを作ったらすぐに表示する様にしておくと、
>上記のトラブルが減るかもしれませんね。

アドバイスのとおり、すぐ表示するようにしました。
読取専用で開いたりということはなくなりました。

で、質問なのですが、安定するまで。。とはどのくらいなのでしょう?
しばらく使ってみて、変な動きがなくなったら、xlsApp.Visible = True をはずしても大丈夫ということですか??

こだわるわけではないのですが、できれば、最終的には、非表示の状態でエクセルに貼り付けて、そのあと、エクセルを開きたいなと思っています。
一連のコマンドの中で、上記のような動きをするのは不可能なのでしょうか?
エクセルへの貼り付けまでをひとつのコマンドにして、エクセルを開くのは別コマンドにしたほうがよいのでしょうか?

アドバイスに従って、いろいろなコードを試しているうちに頭がぐちゃぐちゃになってきまして、質問のほうも要領を得ないものになっていますね。。
すみません。
よろしければ、もう少しおつきあいをお願いします。

【10461】Re:エクセルファイルにデータを出力
お礼  あおぎん  - 08/7/8(火) 15:23 -

引用なし
パスワード
   ▼neptune さん:

こんにちは。
お返事ありがとうございます。
お礼が遅れまして申し訳ありません。

>小僧 さんが既に書かれているようにExcel Applicationのインスタンスが
>消えてないんでしょう。
>
>>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>恐らく、↑の後始末が出来てないからでは?
>
>先ずは、キチンと閉じて、参照を停止する処理を追加してみて下さい。
>xlsWkb.close
>xlsWkb =nothing
>
>xlsWkb が残っているから、xlsAppの幽霊が残ってしまっているような気がします。

最初に投稿した、10445では、 
xlsWkb.close
xlsWkb =nothing
を記述していたのですが、この処理を行うと、
同じコマンドの中で、エクセルを開くということができなかったのです。
で、アドバイスを受けて、

>>MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
>>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>>Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
>>xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
>>xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
>>  
>>Set rst = Nothing
>>xlsWkb.Close True: Set xlsWkb = Nothing
>>xlsApp.Quit: Set xlsApp = Nothing

>>このあとエクセルを開くコードを記述したけど、エラー。
       
         ↓
>>Excelを閉じずに利用
  
>>MyFile = "D:\My Documents\2008\社会保険届出関連\WT_社保資格喪失.xls"
>>Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
>>Set rst = CurrentDb.OpenRecordset("Q_社保エクスポート用", dbOpenDynaset)
>>xlsWkb.Worksheets("T_社保資格喪失").Range("A11.M100").ClearContents
>>xlsWkb.Worksheets("T_社保資格喪失").Range("A11").CopyFromRecordset rst
>>xlsApp.UserControl = True
>>xlsApp.Visible = True

>>AppActivate "Microsoft Excel"

のように直したのでした。でもこの記述だと、前に記載したように、読み取り専用で開くことがたびたびありまして・・。

今いろんなヘルプを見たり、質問したりしながら、試行錯誤中です。
また、お気づきの点等ありましたら、教えてくださるとありがたいです。

【10462】Re:エクセルファイルにデータを出力
発言  neptune  - 08/7/9(水) 15:18 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは

>今いろんなヘルプを見たり、質問したりしながら、試行錯誤中です。
>また、お気づきの点等ありましたら、教えてくださるとありがたいです
という事なので、注意点を。

最後のソースしか読んでなかったので見当違いのResを付けてしまったようです。
失礼しました。で、ササッとですが、目を通しました。

で、結局↓に行き着くわけですね?
>こだわるわけではないのですが、できれば、最終的には、非表示の状態で
>エクセルに貼り付けて、そのあと、エクセルを開きたいなと思っています。
>一連のコマンドの中で、上記のような動きをするのは不可能なのでしょうか?
>エクセルへの貼り付けまでをひとつのコマンドにして、エクセルを開くのは
>別コマンドにしたほうがよいのでしょうか?

・先ず、複数のインスタンスを使う必要は無いので、Excelのインスタンスは
 1つで十分と思います。別コマンドというのは必然性はないと思いますが、
 お好みで。

・最初非表示にしたい理由がわかりませんが、高速化の視点ならExcelは
 起動させ、Bookも開き、データの挿入操作の間、画面更新をStopするという
 手もあります。

・新しいExcelのインスタンスでBookのプロパティを非表示のまま
 保存してしまうと、その属性も保存され、次回に開いた時、非表示になります。
 なので、Bookは表示させて保存する事をお勧めします。

・読み取り専用で開く件ですが、Excelを手動で閉じる可能性があるなら、
 recordsetのデータをExcelに追加、保存した時点で、Excelを閉じてしまい。
 再度Shell関数で開きなおす。/rオプションで読み取りで開く事は可能。
  閉じないのなら、OLE(現在の方法)で開くのも良し。

これだけしか思いつきません。
もしよければ、現状でのソースと、問題点(あれば)をUPしてくれれば
もっと思いつくかも知れません。・・・保障なしですけど^ ^;

【10468】Re:エクセルファイルにデータを出力
回答  小僧  - 08/7/17(木) 10:42 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

neptuneさんの回答に埋もれてしまって気づきませんでした。
申し訳ありません。


> 今回は、変数に入れたデータをそのままエクセルに出力したいので、
> 参照時ということになるのですね?

はい、その通りです。

> 変更時というのは、変数に入れたデータをさらに加工したい場合 
> ということになるのでしょうか??
> 今のところ、必要ない(というよりどういう場合使用したらいいのか
> よくわかってません;)ので、
> dbOpenSnapshotで開いたらいいということにしておきます(笑)

Recordsetオブジェクトを使っていくうちに
変更が必要になる事もあるかと思われますので
頭の片隅にでもしまっておいて下さい^^


> 安定するまで。。とはどのくらいなのでしょう?
> しばらく使ってみて、変な動きがなくなったら、
> xlsApp.Visible = True をはずしても大丈夫ということですか??

そうですね、自分で作ったものを自分で使っていると
意外な落とし穴が見つからない場合もあるので、
他の人が4、5回使っても特に問題のないようでしたら
コメント化みてはいかがでしょうか。

> できれば、最終的には、非表示の状態でエクセルに貼り付けて、
> そのあと、エクセルを開きたいなと思っています。
> エクセルへの貼り付けまでをひとつのコマンドにして、
> エクセルを開くのは別コマンドにしたほうがよいのでしょうか?

という事ですので、安定してきたら最後の方に Visible = True を
付け加えてあげるのが良いかもしれません。

neptuneさんの回答にもありますが、

> データの挿入操作の間、画面更新をStopするという手もあります。

こちらを使う場合は、ExcelのヘルプやWeb検索にて

・DisplayAlerts
・ScreenUpdating

を確認されてみて下さい。

708 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078199
(SS)C-BOARD v3.8 is Free