Access VBA質問箱 IV

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

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


141 / 500 ページ ←次へ | 前へ→

【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"

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

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

【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 をはずしても大丈夫ということですか??

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

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

【10459】追記
質問  ぽよぽよ  - 08/7/8(火) 13:35 -

引用なし
パスワード
   T_Main.ID = 1  T_Oldデータ1   T_New データ1
T_Main.ID = 1  T_Oldデータ2   T_New データ2
T_Main.ID = 1  T_Oldデータ3

となってますが、T_Oldデータ1 と T_newデータ1のデータはまったくの別物です。
・ツリー全体表示

【10458】異なる子フォームのデータをクエリにて抽...
質問  ぽよぽよ  - 08/7/8(火) 13:26 -

引用なし
パスワード
   お世話になります。
データテーブルに T_Main , T_Old , T_New があります。
T_Main の ID というフィールドを T_Old , T_New に一対多のリレーションシップで結んであります。
T_Main を基にしたフォーム内に、T_Old , T_New の表形式フォームをサブフォームとして組み込んでいます。

データの数は不確定で、例として T_Main.ID = 1 のデータに T_Old データが3つ、T_New データが2つあるとします。
本題なのですが、フォームにて登録したデータを選択クエリで抽出すると

T_Main.ID = 1  T_Oldデータ1   T_New データ1
T_Main.ID = 1  T_Oldデータ1   T_New データ2
T_Main.ID = 1  T_Oldデータ2   T_New データ1
T_Main.ID = 1  T_Oldデータ2   T_New データ2
T_Main.ID = 1  T_Oldデータ3   T_New データ1
T_Main.ID = 1  T_Oldデータ3   T_New データ2

このようにT_Oldデータが重複してしまいます。これを

T_Main.ID = 1  T_Oldデータ1   T_New データ1
T_Main.ID = 1  T_Oldデータ2   T_New データ2
T_Main.ID = 1  T_Oldデータ3   

このような重複しない形で取り出したいのですが、可能でしょうか?
データによっては、T_Old より T_New のデータ数のほうが多い場合もあります。
ご教授お願いいたします。
・ツリー全体表示

【10457】テキストボックスとラベル連動
質問  さとる  - 08/7/8(火) 12:22 -

引用なし
パスワード
   質問です。
現在、テキストボックス(フォームで入力する)を配置し、その隣にラベルを配置しています。テキストボックスの値の長さ(文字数)によって隣のラベルの位置を変えることは可能でしょうか? 当初は単純にテキストボックスを右寄せしようと考えていましたが、文字数が少ないとバランスがイマイチなのでどうにかなりませんでしょうか?どなたか教えてください。御願いします。

現在のコード↓

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim blnvisible1 As Boolean
Dim blnvisible2 As Boolean
Dim blnvisible3 As Boolean

If IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = True And _
IsNull(Me.txttorihikisaki3.Value) = True Then
blnvisible1 = True
blnvisible2 = False
blnvisible3 = False


labelontyu1.Visible = blnvisible1
labelontyu2.Visible = blnvisible2
labelontyu3.Visible = blnvisible3


ElseIf IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = False And _
IsNull(Me.txttorihikisaki3.Value) = True Then
blnvisible1 = False
blnvisible2 = True
blnvisible3 = False

labelontyu1.Visible = blnvisible1
labelontyu2.Visible = blnvisible2
labelontyu3.Visible = blnvisible3

ElseIf IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = False And _
IsNull(Me.txttorihikisaki3.Value) = False Then
blnvisible1 = False
blnvisible2 = False
blnvisible3 = True
labelontyu1.Visible = blnvisible1
labelontyu2.Visible = blnvisible2
labelontyu3.Visible = blnvisible3

End If


End Sub
・ツリー全体表示

【10456】Re:レポート作成しています
お礼  さとる  - 08/7/7(月) 19:27 -

引用なし
パスワード
   マルコさん、hatenaさんありがとうございます。
詳細セクションにvisibleつかって記述したらなんとか動きました。
今回初めて自分で記述(本読みながら)していたのでとても不安でした。
とてもありがとうございました。


▼hatena さん:
>イベントは、詳細セクションのフォーマット時イベントに記述しましょう。
>
>
>別案として、
>ラベルを右クリックして、「コントロールの種類の変換」でテキストボックスに
>変換して、それぞれのコントロールソースを、上から
>
>=IIf(IsNull([txttorihikisaki2]),"御中","")
>
>=IIf(IsNull([txttorihikisaki3]),"御中","")
>
>=IIf(IsNull([txttorihikisaki3]),"","御中")
>
>と設定してもいいですね。
・ツリー全体表示

【10455】Re:レポート作成しています
回答  hatena  - 08/7/7(月) 0:14 -

引用なし
パスワード
   イベントは、詳細セクションのフォーマット時イベントに記述しましょう。


別案として、
ラベルを右クリックして、「コントロールの種類の変換」でテキストボックスに
変換して、それぞれのコントロールソースを、上から

=IIf(IsNull([txttorihikisaki2]),"御中","")

=IIf(IsNull([txttorihikisaki3]),"御中","")

=IIf(IsNull([txttorihikisaki3]),"","御中")

と設定してもいいですね。
・ツリー全体表示

【10454】Re:レポート作成しています
発言  マルコ  - 08/7/6(日) 22:21 -

引用なし
パスワード
   レポートですよね?
テキストボックスのAfterUpdateイベントなんて発生しませんよ?
あとラベルの表示ON/OFFは Visible プロパティを切り替える方がベターかと。
・ツリー全体表示

【10453】レポート作成しています
発言  さとる  - 08/7/4(金) 21:11 -

引用なし
パスワード
   アクセスVBA初心者です。レポートを作成しています。
左上に取引先の名前が縦に3列(テキストボックス)あり、その隣にラベルが同様に3段、設置してあります。
最上段のみにデータがあるときはその隣のラベルを表示
最上段と2段目にデータがあるときは2段目のラベルのみ表示で他は非表示
最上段、2段目、3段目にデータがあるときは3段目のラベルのみを表示
という具合に考えています。自分なりにコードを作成してみましたが、デバックは出ないものの全く何の変化もしません。コードに不備があれば教えてください。
お願いします。もしかしたら 『Private Sub』とか書いているあたりで間違えてたりしませんでしょうか?なにぶん初心者名ものですいません。

Private Sub txttorihikisaki1_afterupdete()
Call change
End Sub

Private Sub txttorihikisaki2_afterupdete()
Call change
End Sub

Private Sub txttorihikisaki3_afterupdete()
Call change
End Sub

Private Sub change()
If IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = True And _
IsNull(Me.txttorihikisaki3.Value) = True Then
labelontyu1.ForeColor = RGB(0, 0, 0)
labelontyu2.ForeColor = RGB(255, 255, 255)
labelontyu3.ForeColor = RGB(255, 255, 255)


ElseIf IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = False And _
IsNull(Me.txttorihikisaki3.Value) = True Then
labelontyu1.ForeColor = RGB(255, 255, 255)
labelontyu2.ForeColor = RGB(0, 0, 0)
labelontyu3.ForeColor = RGB(255, 255, 255)

ElseIf IsNull(Me.txttorihikisaki1.Value) = False And _
IsNull(Me.txttorihikisaki2.Value) = False And _
IsNull(Me.txttorihikisaki3.Value) = False Then
labelontyu1.ForeColor = RGB(255, 255, 255)
labelontyu2.ForeColor = RGB(255, 255, 255)
labelontyu3.ForeColor = RGB(0, 0, 0)

End If

End Sub
・ツリー全体表示

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

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

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

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

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

xlsWkb が残っているから、xlsAppの幽霊が残ってしまっているような気がします。
・ツリー全体表示

【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 のインスタンスを作ったらすぐに表示する様にしておくと、
上記のトラブルが減るかもしれませんね。
・ツリー全体表示

【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 を後にすればもう一度開く事もできるかと思われます。

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

【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 を後にすればもう一度開く事もできるかと思われます。
・ツリー全体表示

【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"
>
>みたいな感じで…
>検証はしてないですが…
・ツリー全体表示

【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"

みたいな感じで…
検証はしてないですが…
・ツリー全体表示

【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)
・ツリー全体表示

【10444】Re:コンボボックスでコントロールソース...
お礼  なみ  - 08/6/26(木) 10:34 -

引用なし
パスワード
   ▼おじい さん:

フォームのレコードソースでクエリーが設定されていました!
うまくいきました!本当にありがとうございました!!!
・ツリー全体表示

【10443】Re:レポートプロパディ標題の制御
回答  Gin_II  - 08/6/25(水) 21:37 -

引用なし
パスワード
   >>出力後に、Name ステートメントでファイル名を変更してやるとか。
>ぜひ、この方法のヒントを教えてください

Name ステートメントは、1行で終わるようなコードですよ ^^;
それぐらいは、ヘルプ等で確認しましょうよ
・ツリー全体表示

【10442】Re:コンボボックスでコントロールソース...
回答  おじい  - 08/6/25(水) 16:23 -

引用なし
パスワード
   ▼なみ さん:
こんにちは。 更なる初心者です^^;;

フォームのレコードソースを確認してみてください。

別のテーブルを参照しているか、または追加したフィールドを含まないクエリーを
設定してはいないでしょうか?
・ツリー全体表示

【10441】Re:IIF関数について
お礼  ゆうゆう  - 08/6/25(水) 15:01 -

引用なし
パスワード
   ▼Gin_II さん ありがとうございました!
問題なく表示されました。
IIFではなく、Switchを使用するのですね。

>それよりも、都道府県テーブルを作成して、そこに金額も設定した方が
>いいとは思いますが・・^^;

注文データのcsvが別にあり、住所は東京都○○区△△×-×-×と
すでに入力されており、送料だけが欠けている状態だったので、
まとめて処理ができればと思って質問させていただきました。

これで作業が楽になります。
ありがとうございました^^
・ツリー全体表示

141 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1083009
(SS)C-BOARD v3.8 is Free