• ベストアンサー

Access:データシート形式表示のフォームをそのままExcelへ

Access2003 WinXPです。 フォームにサブフォームを置き、クエリで抽出したデータを データシート形式で表示しているフォームをサブフォームへ表示させています。 この、サブフォーム、またはデータシート形式のフォームをまるっと新規Excelへエクスポートしたいのですが、うまくいきません。 クエリをエクスポートは出来ますが、ユーザーがサブフォームに表示されたデータのフィールドを入れ替えて、その見た目のまま出力したいという希望があるので。。。 分かる方いらっしゃいましたら、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.6

#5です mdb 見させていただきました。 > Fsub.Setfocus の後のレコード選択でエラーです。 > コマンドまたはアクション‘すべてのレコードの選択’は無効です。 これは確認できませんでした(変更なし状態にて) (以下のタイミングが関係しているのかも?) > それ以前にレコードの選択が出来なくて困っています; 条件指定したものがサブフォームに表示されないということでしょうか。 であれば、再現できませんでした(変更なし状態にて) また、更新/削除/追加ができないということであれば、 サブフォームをデザインビューで開き、プロパティ・更新/削除/追加の許可を変更してみてください。 Excel出力時、私の環境では、セル1つにのみ「ID」値が表示されただけでした。 (2003 + XP Pro) これは、タイミング的なものと思われます。     Dim oApp As Object     Set oApp = CreateObject("Excel.Application")     oApp.Workbooks.Add     oApp.Visible = True ' ★ 上記★部分をコメントにしてください。 Excelの表示化(True)とコピー(ペースト)処理が重なった様な雰囲気です。 (詳細はわかりません)     oApp.Columns.EntireColumn.AutoFit     oApp.Visible = True 処理が終わったところで表示すればよいことなので、最後のところだけを有効(そのまま)とします。 私が変更したのは、★のところだけです。 確認してみてください。 また補足してください。

yuky-4126
質問者

お礼

回答ありがとうございます。 出来ました!目で確認しながら、と思って早めにVisible=Trueにしていましたが、それが影響していたとは!びっくりです。 実現できて感激です。ありがとうございました!!

その他の回答 (5)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#3です #2さん、ありがとうございます。 小さいのをコピーしていったとして、何か個数制限???があるような雰囲気もあります。 (2003ではExcelでOfficeクリップボード、2007ではツールバーのクリップボードをみると 1/24 の様に 24 が気になります) 私もあの方法が使いたかったので、時間作ってクリップボード関係のものを見てみました。 あのクリップボードからのメッセージを出させない=クリップボードを空にすれば、、 と考え、以下の方法で動いているようにみえます。 但し、クリップボードに何個か入れていて、Accessを終了後も使いたい、ってことなら、その操作はできなくなります。 (Excelに貼り付けたら、クリップボードを空にするので) 標準モジュールに以下を記述します。 Private Declare Function apiOpenClipboard Lib "User32" _           Alias "OpenClipboard" (ByVal hWnd As Long) As Long Private Declare Function apiCloseClipboard Lib "User32" _           Alias "CloseClipboard" () As Long Private Declare Function apiEmptyClipboard Lib "User32" _           Alias "EmptyClipboard" () As Long Public Sub ClearCopyData()   If (apiOpenClipboard(0) <> 0) Then     Call apiEmptyClipboard     Call apiCloseClipboard   End If End Sub で、処理の方に   DoCmd.RunCommand acCmdCopy   oApp.Activesheet.Paste   Call ClearCopyData ' ★   oApp.Columns.EntireColumn.AutoFit ★部分追加で、クリップボードをクリアするようにしてみました。 ColumnOrder が同じ数値になるタイミングがありました。 何か処理が抜けているかもしれません。 > q_kekkaはあっているのですが、これを表示させているSub_Aがクエリそのままではないのです。。。 > Fsubを直接選択するのと、Sub_Aとでは違うのでしょうか。 ごめんなさい。 イメージできていないです。 サンプルと、どのあたりが異なりますか。 実際にはこの部分でこういう処理していて、、、とか指摘いただければと思います。 (サンプルがわかりにくければ、いくらでも補足しますので、、、)

yuky-4126
質問者

補足

> 実際にはこの部分でこういう処理していて、、、とか指摘いただければと思います。 ありがとうございます。 Fsub.Setfocus の後のレコード選択でエラーです。 コマンドまたはアクション‘すべてのレコードの選択’は無効です。 となります。 サブフォームに読み込んでいるフォームを開いてみたりしましたが関係なかったようで。。。 クエリを見るとちゃんとなっているのですが、サブフォームに読み込んでいるデータは古いままのようです。 それ以前にレコードの選択が出来なくて困っています; クエリをExcelへ出せば早いのですが、(ユーザー希望により)IDは表示せず、列の入れ替えをしたままEXCELへ…という動きをしたいので、 サブフォームの左上四角部分をコピペ状態が一番理想なのですが。。。 何だかめちゃくちゃですみません。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

#3 さん 「クリップボードにコピーされているデータが多すぎます」 が表示されないようにするには、 Paste したあとで より小さなデータをダミーでコピーすればよいです。   Me.テキスト1.SetFocus   DoCmd.RunCommand acCmdCopy とか。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#1です。 #2さん、ありがとうございます。 私は、1つ賢くなったような気がします。(確かに賢くなったと思います) データシートでない時にも使えるみたいです。 でも、コピー&ペーストを繰り返すと、システム側から文句メッセージが出ませんか? コピーした容量だとか、なんだかんだが多いみたいな。 (操作途中とか、Access終了時とか) これらの警告メッセージを抑止するにはどうしたらよいのでしょうか。 ちょっと時間が取れないので、こんな感じで解消できる、とかあれば助かります。 こっちの方がExcel表示まで速いし、使っていきたいと思える方法でした。 私のわがままですが、よろしくお願いいたします。

yuky-4126
質問者

補足

あちらこちらにすみません。 30246kikuさんの質問とは違うのですが、まるっとコピペのVBAを試してみたところ結果がおかしく、サブフォームに表示させているデータシート型のフォームに表示されているデータがおかしい事が分かりました。 ややこしいのでメインのフォームを Main サブフォーム名を Fsub Fsubに表示させているデータシート型のフォームを Sub_A クエリを q_Kekka とします。 q_kekkaはあっているのですが、これを表示させているSub_Aがクエリそのままではないのです。。。 画面上から、MainフォームのFsubの左上の四角部分を直接クリックして全選択常態にしてコピーしてExcelへ貼り付けると、Fsubそのままのデータが貼り付けられます。 でもVBAでMe.FSub.SetFocus後、 DoCmd.RunCommand acCmdSelectAllRecords DoCmd.RunCommand acCmdCopy すると違うデータが。。。 Fsubを直接選択するのと、Sub_Aとでは違うのでしょうか。 分かりにくい説明ですみません;分かる点ございましたらお願い致します;

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

#1 さんの > データシートの左上四角部分をクリックしてコピー、Excelシート上で貼り付け、 > の方が確かかと思います。(項目部分がわかりやすい表示になるとか) これを VBA で実現してみました。 Private Sub コマンド1_Click()     Dim oApp As Object     Set oApp = CreateObject("Excel.Application")     oApp.Workbooks.Add     Me.サブフォーム名.SetFocus     DoCmd.RunCommand acCmdSelectAllRecords     DoCmd.RunCommand acCmdCopy     oApp.activesheet.Paste     oApp.Columns.EntireColumn.AutoFit     oApp.Visible = True     Set oApp = Nothing End Sub

yuky-4126
質問者

お礼

回答ありがとうございます! 参考に動かしてみたら、サブフォーム上では非表示にしているだけの列が出てしまったので、Excel側で消してみました。     Dim oApp As Object     Set oApp = CreateObject("Excel.Application")     oApp.Workbooks.Add     Me.サブフォーム名.SetFocus     DoCmd.RunCommand acCmdSelectAllRecords     DoCmd.RunCommand acCmdCopy     oApp.activesheet.Paste     oApp.Columns.EntireColumn.AutoFit '不要な列を削除 MaxCol = oApp.ActiveSheet.Cells.CurrentRegion.Columns.Count For i = 1 To MaxCol strTitle = oApp.ActiveSheet.Range("A" & i).value '本来は表示オプションボタンのTrueFalseを見てますが、仮に If strTitle = "ID" Then oApp.ActiveSheet.Range("A" & i).EntireColumn.Delete End If Next     oApp.Visible = True     Set oApp = Nothing まだいじり中ですが、思ったように動いているようです! ありがとうございます! 今の所特にエラーメッセージは無いのですが、本来の量のデータでも試してみようと思います。

yuky-4126
質問者

補足

あ、嘘です(汗)色々とコードをいじった後でした。 列と行を間違えていたり、まだ全然でした。。。 もぅ少しいじってみます。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

データシート上の列並びは、ColumnOrder で得られるようですが、ColumnOrder 順で得る方法はなさそうです。 最大項目数分の配列を用意して、並び順を自分で操作するしかないと思います。 上記を共通の処理として以下に分岐 1)クエリを作り、それをもとにExcel出力 2)自力でExcel出力 親フォームから処理するものとして、サブフォームコントロール名を「FSUB」と仮定します。 1)クエリを作り、それをもとにExcel出力 レコードの並び順(昇順/降順)を操作していた場合は、Me.FSUB.Form.OrderBy に項目名が入ります。 なければ、大元クエリの並び順をひっぱります。 操作でフィルタをかけていたら Me.FSUB.Form.Filter に条件が入ります。 大元クエリの条件と合わせて組み直します。 面倒だと思います。 (嘘を言っているかもしれないので、確認はしてください) (OrderByOn / FilterOn も合わせて確認してください) 2)自力でExcel出力 例は、最大項目数を10としています。 また、確認時、日付項目も入れていたので書式設定も入れてます。 (先頭が0の数字の文字列の時とかにも、書式設定が必要と思います) データシートの項目に表示されているものを、見出しに使って、 それぞれのコントロールソースで RecordsetClone 内をなめてます。 表示データの並び順=レコードセット内の並び順なので、単純に先頭から処理します。 データが多ければ、それなりに時間がかかります。 また、例では処理後Excelを表示しているだけなので、保存するのなら処理を追加してください。 動かないところがあれば、ドンドン修正してください。 例:親フォームからサブフォームに対して処理する例です) Private Sub ToExcel_Click()   Dim oApp As Object   Dim iRow As Long, iCol As Long   Dim ctl As Control   Dim sDSn(1 To 10) As String   Dim sFn(1 To 10) As String   Dim i As Long   For i = 1 To 10     sDSn(i) = ""     sFn(i) = ""   Next   For Each ctl In Me.FSUB.Controls     With ctl       If (.ControlType <> acLabel) Then         If (.ColumnHidden = False) Then           sDSn(.ColumnOrder) = .Name           sFn(.ColumnOrder) = .ControlSource         End If       End If     End With   Next '  Dim sTmp As String '  sTmp = "" '  For i = 1 To 10 '    sTmp = sTmp & i & ": " & sDSn(i) & vbCrLf '  Next '  MsgBox sTmp ' ここで、項目の並びがわかります(ここまで共通)   ' 以下自力出力の例   With Me.FSUB.Form.RecordsetClone     If (.RecordCount = 0) Then Exit Sub     Set oApp = CreateObject("Excel.Application")     oApp.Workbooks.Add     iRow = 1     iCol = 1     For i = 1 To 10       If (Len(sDSn(i)) > 0) Then         oApp.Cells(iRow, iCol) = sDSn(i)         iCol = iCol + 1       End If     Next     .MoveFirst     While (Not .EOF)       iRow = iRow + 1       iCol = 1       For i = 1 To 10         If (Len(sFn(i)) > 0) Then           If (sFn(i) = "日付") Then             oApp.Cells(iRow, iCol).NumberFormatLocal _               = "yyyy/mm/dd"           End If           oApp.Cells(iRow, iCol) = .Fields(sFn(i)).Value           iCol = iCol + 1         End If       Next       .MoveNext     Wend     oApp.Columns.EntireColumn.AutoFit     oApp.Visible = True     oApp.UserControl = True     Set oApp = Nothing   End With End Sub ※ データシートの左上四角部分をクリックしてコピー、Excelシート上で貼り付け、 の方が確かかと思います。(項目部分がわかりやすい表示になるとか)

yuky-4126
質問者

お礼

回答ありがとうございます! 私にはなかなか難しいですが、参考になります! 最後の ”左上四角部分をクリックしてコピー、貼り付け” 案ありがとうございます! bonaronさんのVBAを参考に、まずはこちらに挑戦してみます。

関連するQ&A

  • Access:サブフォームにクエリ表示⇒フィールドを絞り込みたい

    Access2003 WinXP です。 フォームにサブフォームを置き、サブフォームのソースオブジェクトにクエリを参照しているデータシート形式のフォームを設定しています。 フォームに絞込み条件を選択するオプションボタン、表示するフィールドを選択するオプションボタンを配置し、 サブフォームへ表示するコマンドボタンを置いています。 この設定を選択した後コマンドボタンを押すと、クエリの中身を書き換えています。 で、実行すると、表示しない設定のフィールドには「Name?」という値が入ったフィールドがしっかり表示されてしまいます。 ソースオブジェクトにクエリ自体を設定すれば回避出来ますが、表示されたデータをダブルクリックするとその1レコードを表示する画面を更に開きたいと思っていますので、サブフォームにデータシート形式のフォームをセットするのがダブルクリックイベントを取得出来て良いかと思っています。 分かりにくい説明ですみません。 何か解決法を分かる方いらっしゃいましたら、お願いします。

  • サブフォームにデータが表示されない!

    サブフォームにデータが表示されない! フォーム(1)(非連結のtxt顧客コード) フォーム(1)にサブフォーム(2)(レコードソースはクエリ(3))を作り、 クエリ(3)顧客コードの抽出条件に[forms]![フォーム(1)].[form].[txt顧客コード]で選択しています。 フォーム(1)が開いた時にクエリ(3)は抽出しているのにそのデータがサブフォーム(2)に表示されません・・・ フォーム(1)を一度デザインビューにして開き直すとサブフォーム(2)に反映表示されます。 いろんな所にRequeryを入れたりしてみましたが、フォーム(1)を開いたときに一発で表示されません、教えてください!宜しくお願いいたします。

  • ACCESS 帳票フォームとデータシートをトグルボタンで切り替え

    フォーム上でサブフォームの帳票フォームとデータシートをトグルボタンかコマンドボタンで切り替えることはできないでしょうか? 現在、抽出したデータをサブフォーム(帳票フォーム)に表示させており、そのデータにある金額の合計を表示させています。 帳票フォームは見やすいのですが、データシートですと抽出したデータの一部をコピーしEXCELで使用したりできます。見やすさを諦めてデータシートに変更すると抽出したデータの合計が計算できません。 できれば、帳票フォームとデータシートどちらも使用したいのですが、いちいちデザインからサブフォームのプロパティで規定のビューから変更するのが面倒です。 上記にありますようにトグルボタンかコマンドボタンで切り替えることができれば便利なのですが・・・。 良い方法がありましたらお知恵を貸して下さい

  • フォームでクエリの一致したデータを一括表示したい

    こんばんは、初めまして。3z56uと申します。 標記の件で質問がありますので、どなたかご教授願います。 検索クエリで一致したデータをフォームで一度に表示したいのですが、 うまく行かず大変困っています。 イメージとしてはサブフォームのデータ表示なのですが、 これではない方法を教えてほしいのです。 今の状況はクエリにて抽出条件にスタッフコードを入力すると そのコードが対象になるデータが出てくるという状況です。 このデータをそのままフォームで表示されるようにしたいのですが…。 ちなみにバージョンはアクセス2000です。 そしてアクセスに関しては基礎ぐらいしか理解しておりませんので、 出来ればわかりやすい方法で教えて頂きたいです。 大変困っていますので、よろしくお願いします。

  • 【Access2007】データシートからデータの追加ができない。

    環境  Windows Xp Pro sp3 Access 2007 Accessのフォームにサブフォームがあり、テキストボックスを配置し、 データシート形式で表示しています。 RecordSourceはクエリを使用しています。 このデータシートより新規データを追加したいのですが、新規追加行が表示されません。 他の、正常に動作しているフォームと比較してみましたが、これといった差異はありませんでした。 フォームの更新・追加プロパティは「はい」にしてあり、更新はできています。 何か盲点的な原因はあるのでしょうか? また、上記現象時の確認すべき点を教えてください。 ご教示よろしくお願いします。

  • Accessのフォームのデータシート形式について

    Accessのフォームには、単票形式や表形式などがありますが、 そのうちの一つの「データシート形式」とはテーブルと何が 違うのでしょうか。 データが保存されないことはわかるのですが、見た目は全く一緒だし レイアウトをコントロールで変えるわけでもないし。 また、各形式には「データシートビュー」で一応データシート形式で フォームを見ることができるのになぜわざわざ「データシート形式」で作成する 必要があるのでしょうか ご存知の方教えて頂けますか。

  • アクセスのパラメータクエリをフォームからレポートに表示するには

    どなたかわかる方、教えてください! アクセスで、サブフォームにパラメータクエリ設置し、パラメータに抽出条件を入れるとサブフォームに一覧が表示するように設定しました。 この、いったんサブフォームに抽出したものを今度はそのままレポートにしてプリントアウトしたいと思っています。 同じパラメータクエリをフォームに設定すると、もう一回パラメータを入れなければならなくなってしまいます。 すぐにフォームからレポート表示に切り替えてプリントアウトする方法はありますか? よろしくお願いします。

  • AC2000でフォームから入力したデータをサブフォームに表示

    ID 商品名 単位 単価で商品マスタフォームを作っています。このフォーム内にサブフォームを作っておいて データが入力するたびにサブフォームへ表示させたいのですが、このときの条件としてID(オートナンバー)を降順(最新のデータが一番上になる)・データシート形式にしたいと思います。 T_商品(テーブル名) Q_商品(IDを降順としたクエリ) MF_商品(各入力テキストボックスがあるフォーム) SF_商品(MF_商品に貼り付けるサブフォーム) 降順にすると一番若いIDのデータだけがサブフォームに 表示されるのです。 requeryは必要なのでしょうか? よろしくお願い致します。

  • アクセス メインフォームの条件指定にてサブフォームを表示

    アクセス初心者です。 現在アクセス2000、MEにてシステム作成中です。 業務報告書を作っています。 メインフォームに2つのタブを作成。 1つのタブに3種類のサブフォーム(別々のクエリ)を表示しています。 現在は全てのデータ件数を表示していますが、これを期間指定して、その期間だけの件数を表示させるようにしたいのです。 今まで試してみた結果です。 考え方(1)パラメータとして入力  各クエリにbetweenパラメータとして入力  ⇒これは、3つのクエリ×2があるので入力を促す同じ処理が何回も表示され、とても使えませんでした。 考え方(2)メインフォームに非連結テキストボックスを作成して、それを参照  ⇒まず、終了年月日のイベント(更新後処理)にサブフォームを再クエリ(サブフォームのクエリには、メインフォームの開始と終了範囲をbetweenにて抽出)   ⇒⇒すると、そのままでは表示されず、デザインビューの切り替えなどを行うと表示されます。 そのために、マクロ(再クエリの後)に「オブジェクトの再描画」でこのサブフォームを再表示するようにしましたが、結果は同じです。 現在このような状態です。 マクロは分りますが、VBAはほとんど分らない状態です。 質問1 パラメータ指定の場合、各クエリに1回のパラメータを伝えられる方法があるのでしょうか? 質問2 再クエリしたこのデータをきちんと表示する方法は? どんな操作方法が良いのかはわかりません。 他に簡単でわかりやすい方法があれば、教えてください。どなたかよろしくおねがいします。 また、同じようにレポートも出力します。 同様の形式です。こちらも変更の予定です。 ですから、そのことを考えると、1回のパラメータで各クエリに伝えられるのがいいのですが・・・

  • データシート(サブフォーム)の複数条件抽出について。

    データシート(サブフォーム)の複数条件抽出について。 データシート(サブフォーム)の複数条件抽出について。 環境:ACCESS2000 DAO利用  現在メインフォーム上に、オートフォーム:データシート(基となるテーブル(マスターA)選択) をサブフォームとして置き、メインフォーム上にコンボボックス2個(コンボ1、コンボ2)&コマンドボタン1個設置してあります。 基テーブル(マスターA)には 種類    サイズ    商品名 の3フィールドがあります。 やりたい事は、コンボ1(対応フィールド:種類)及びコンボ2(対応フィールド:サイズ)で選択し コマンドボタンを押下で、サブフォーム内データの抽出です。 上記をクエリ使用でも、vba利用でもどちらでも大丈夫です。 先日この質問板で丁寧に教えて頂いたのですが、 回答して下さった方もおっしゃってたのですが、 動的に動かないとの事で、やっているうちにやはり 動的でないと難があるようなので 再度ご質問させて頂きました。 何卒ご教授の程宜しくお願い致します。 先日の質問板は下記です。 http://okwave.jp/qa/q5845718.html また、質問させて頂いている間も引き続き自分で調べながら やっていこうと思います。

専門家に質問してみよう