Access VBA質問箱 IV

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

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


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

【6039】任意のレコードのみを抽出 たんけん 05/8/26(金) 11:26 質問[未読]
【6054】Re:任意のレコードのみを抽出 たんけん 05/8/26(金) 13:38 発言[未読]
【6058】Re:任意のレコードのみを抽出 小僧 05/8/26(金) 13:54 発言[未読]
【6060】Re:任意のレコードのみを抽出 たんけん 05/8/26(金) 14:02 発言[未読]
【6068】Re:任意のレコードのみを抽出 小僧 05/8/26(金) 15:00 回答[未読]
【6069】Re:任意のレコードのみを抽出 たんけん 05/8/26(金) 15:16 お礼[未読]
【6074】Re:任意のレコードのみを抽出 小僧 05/8/26(金) 16:00 発言[未読]
【6075】Re:任意のレコードのみを抽出 たんけん 05/8/26(金) 16:03 お礼[未読]

【6039】任意のレコードのみを抽出
質問  たんけん  - 05/8/26(金) 11:26 -

引用なし
パスワード
   はじめまして。よろしくおねがいします。

フォームで社員のリストを表示し、リストで選択された社員の情報のみをExcelにエクスポートしたいのですが、
 ・リストで選択された社員のみを表示する
 ・クエリで表示されるすべての情報をエクセルにエクスポートする
ということは掲示板を見てなんとか出来たのですが、この2つを組み合わせて行う方法がわかりません。


'リストで選択された社員のみを表示する

  Dim ctl As Control
  Dim varItem As Variant
  Dim strWhere As String
  Dim strQuery As String
  Dim MyFile As Variant

  Set ctl = Me!lst_Select
  If ctl.ItemsSelected.Count = 0 Then
    If MsgBox("社員が選択されていません。全員抽出しますか?" , _
               vbQuestion + vbYesNo) = vbNo Then
      Me!lst_Select.SetFocus
      Exit Sub
    End If
  Else
    For Each varItem In ctl.ItemsSelected
      If strWhere = "" Then
        strWhere = "'" & ctl.ItemData(varItem) & "'"
      Else
        strWhere = strWhere & ",'" & ctl.ItemData(varItem) & "'"
      End If
    Next
    strWhere = "[社員コード] In (" & strWhere & ")"
  End If
 
  strQuery = "Q_社員情報抽出"
  DoCmd.OpenQuery strQuery, acNormal, acEdit
  DoCmd.ApplyFilter strQuery, strWhere

'クエリで表示されるすべての情報をエクセルにエクスポートする
  MyFile = "c:\社員情報.xls"

  Set Fso = CreateObject("Scripting.FileSystemObject")
  DoCmd.TransferSpreadsheet acExport, _
          acSpreadsheetTypeExcel9, strQuery, MyFile, True

となっています・・・

アドバイスをお願いします。

【6054】Re:任意のレコードのみを抽出
発言  たんけん  - 05/8/26(金) 13:38 -

引用なし
パスワード
   あ、エクスポートの方が書き足りないです。

'クエリで表示されるすべての情報をエクセルにエクスポートする
  MyFile = "c:\社員情報.xls"

  Set Fso = CreateObject("Scripting.FileSystemObject")
  DoCmd.TransferSpreadsheet acExport, _
          acSpreadsheetTypeExcel9, strQuery, MyFile, True
  Set xlsWkb = xlsApp.Workbooks.Open(MyFile)
  xlsWkb.Save
  xlsWkb.Close: Set xlsWkb = Nothing
  xlsApp.Quit: Set xlsApp = Nothing

となっています。

エクスポートしたい情報が複数のテーブルにまたがっているので、クエリには複数のテーブルが指定されています。

よろしくお願いします。

【6058】Re:任意のレコードのみを抽出
発言  小僧  - 05/8/26(金) 13:54 -

引用なし
パスワード
   ▼たんけん さん:
こんにちは。

「FileSystemObject」を呼び出しているのと、
Excel ファイルを開いているのが謎なのですが…。

A) Q_社員情報抽出をパラメータクエリにして、パラメータでWhere句を作る。

B) Q_社員情報抽出を元にしたクエリを一時的に作り、
  そのクエリをエクスポートする。
  ("SELECT * FROM Q_社員情報抽出 WHERE " & strWhere)

C) クエリの内容をレコードセットに入れてフィルタ、
  オートメーションを用いてExcel 側で「CopyFromRecordset」
  メソッドで貼り付ける。

当方でしたら、

Q_社員情報抽出がエクスポート用にしか使われていないのであれば A)、
他フォームのコントロールソース等に使われているのであれば B)、
他に Excel を開かなければいけない作業があるのであれば C)

を使います。

【6060】Re:任意のレコードのみを抽出
発言  たんけん  - 05/8/26(金) 14:02 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは。お返事ありがとうございます。

>「FileSystemObject」を呼び出しているのと、
> Excel ファイルを開いているのが謎なのですが…。

申し訳ないです。この掲示板を見て、ほとんどコピペをしていたので、あまり意味がわかっておりません。


>A) Q_社員情報抽出をパラメータクエリにして、パラメータでWhere句を作る。
>
>B) Q_社員情報抽出を元にしたクエリを一時的に作り、
>  そのクエリをエクスポートする。
>  ("SELECT * FROM Q_社員情報抽出 WHERE " & strWhere)
>
>C) クエリの内容をレコードセットに入れてフィルタ、
>  オートメーションを用いてExcel 側で「CopyFromRecordset」
>  メソッドで貼り付ける。

えっと、Q_社員情報抽出は他ではつかっていないので、A)の方法でお願いいたします。

フォームで取得した条件をQ_社員情報抽出の社員コードの条件に指定して・・・
その後、条件を追加したクエリで抽出する・・・

申し訳ないです。どのように書いて良いのか・・・わかりません。

【6068】Re:任意のレコードのみを抽出
回答  小僧  - 05/8/26(金) 15:00 -

引用なし
パスワード
   ▼たんけん さん:
こんにちは。

In句 を使ったパラメータクエリがうまくいかなかったので、
B) の方法をとっています。

Private Sub エクセル抽出_Click()
'要参照設定 Microsoft DAO x.x Object Library
Dim ctl As Control
Dim varItem As Variant
Dim strWhere As String
Dim MyFile As String
Dim SQLCode As String
Dim QD As DAO.QueryDef

  Set ctl = Me!lst_Select
  If ctl.ItemsSelected.Count = 0 Then
    If MsgBox("社員が選択されていません。全員抽出しますか?", _
               vbQuestion + vbYesNo) = vbNo Then
      Me!lst_Select.SetFocus
      Exit Sub
      strWhere = ""
    End If
  Else
    
    For Each varItem In ctl.ItemsSelected
      If strWhere = "" Then
        strWhere = "'" & ctl.ItemData(varItem) & "'"
      Else
        strWhere = strWhere & ",'" & ctl.ItemData(varItem) & "'"
      End If
    Next
        strWhere = "WHERE [社員コード] In (" & strWhere & ")"
  End If
      SQLCode = "SELECT * FROM Q_社員情報抽出 " _
          & strWhere
        
  If DCount("*", "MsysObjects", "Name = 'Q_抽出用'") > 0 Then
    DoCmd.DeleteObject acQuery, "Q_抽出用"
  End If
  
  Set QD = CurrentDb.CreateQueryDef("Q_抽出用", SQLCode)
    QD.Close
  Set QD = Nothing
  MyFile = "c:\社員情報.xls"

  DoCmd.TransferSpreadsheet acExport, _
            acSpreadsheetTypeExcel9, "Q_抽出用", MyFile, True
End Sub


こんな感じでエクセルに抽出されると思います。

>※この掲示板を見て、ほとんどコピペをしていたので、
> あまり意味がわかっておりません。

コードの意味が解らない所がありましたら遠慮せずに
質問なさって下さいね。

【6069】Re:任意のレコードのみを抽出
お礼  たんけん  - 05/8/26(金) 15:16 -

引用なし
パスワード
   おぉ。できました。ありがとうございます。

すみません。問題は解決したのですが、少し謎に思ったところがあるので、追加で質問させていただきます。

先ほどちょっと待っている間にいろいろ試していて疑問に思ったのですが、フォームの情報をもとにマクロ中でクエリに後で条件を追加するときは、クエリの条件のところにはどのように書けばよかったのでしょうか?

フォーム上にあるテキストボックス等を条件氏指定する場合は、
=[forms]![フォーム名].[テキストボックス名]
と書けば良いとわかりましたが・・・
マクロの中の変数で指定したい場合、どうするんだろ?と悩んでおりました。

へんな質問でもうしわけありません。

【6074】Re:任意のレコードのみを抽出
発言  小僧  - 05/8/26(金) 16:00 -

引用なし
パスワード
   ▼たんけん さん:
こんにちは。

>マクロの中の変数で指定したい場合、どうするんだろ?

コードの中の変数を直接クエリに持ってくる事はできないと思います。

どうしても使いたい場合は…

フォーム上に不可視のテキストボックスを配置して
その値に代入するのが一般的ですかね。

【6075】Re:任意のレコードのみを抽出
お礼  たんけん  - 05/8/26(金) 16:03 -

引用なし
パスワード
   ▼小僧 さん:
>フォーム上に不可視のテキストボックスを配置して
>その値に代入するのが一般的ですかね。

お返事ありがとうございます。
なるほど、1回フォーム上のテキストボックス中に値を代入するんですね。

謎も問題も無事解決することができました。
本当にありがとうございました。

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