• ベストアンサー

Access 予めクエリを作っておきたい2

http://okwave.jp/qa/q9003552.html の続きです。 インポートしたファイルAの赤枠のフィールド名が毎回変わるので、 画像のようなクエリを毎回作成しないといけません。 毎回作成しなくていいように、青枠のフィールド名を可変にしたい・・・ ということです。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

いちおう、コードを先に載せておきます。 エクスポートのコードです。 ファイルは現在のプロジェクトに出てきます。 簡単なコードですが、場合によってはクエリ名も 変数に格納してもいいかもしれません。 なお、同じ名前のファイルが存在しないかをDir関数を 使って xlBook.SaveAs strPath & strFile の前で、確認してもいいかもしれません。 それから、Excelファイルの拡張子は「xls」になっていますが 実際にあわせてクエリ名共々変更してください。 Sub test() Dim xlApp As Object Dim xlBook As Object Dim strPath As String Dim strFile As String Dim rs As New ADODB.Recordset Dim strm1 As String Dim strm2 As String Dim strm3 As String Dim strm4 As String Dim strm5 As String 'フィールド名用 strm1 = Format(DateAdd("m", -3, Date), "m") & "月" strm2 = Format(DateAdd("m", -2, Date), "m") & "月" strm3 = Format(DateAdd("m", -1, Date), "m") & "月" strm4 = Format(Date, "m") & "月" 'ファイル名用(来月) strm5 = Format(DateAdd("m", 1, Date), "m") & "月" strPath = CurrentProject.Path & "\" strFile = "ファイル" & strm5 & ".xls" Set xlApp = CreateObject("excel.application") xlApp.Visible = True Set xlBook = xlApp.Workbooks.Add rs.Open "Qクエリ", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic '必要なだけクエリのフィールド「型番」以降に追加 'クエリのフィールドの並びの順に With xlBook.Worksheets("Sheet1") .Range("A1").Value = "ID" .Range("B1").Value = strm1 .Range("C1").Value = strm2 .Range("D1").Value = strm3 .Range("E1").Value = strm4 .Range("F1").Value = "メーカー" .Range("G1").Value = "型番" 'データの先頭位置の指定とデータの貼り付け .Range("A2").CopyFromRecordset rs End With 'ファイルのファイル名と保存先の指定 xlBook.SaveAs strPath & strFile Set xlBook = Nothing Set xlApp = Nothing rs.Close: Set rs = Nothing End Sub

naoto0216
質問者

お礼

度々のご回答ありがとうございます。 勉強不足で申し訳ございません。。 こちらのコードを実行する為に、予めQクエリを作成しておく 必要があるんですよね? で、今月が6月だった場合、そのクエリには「3月」「4月」「5月」の フィールドがあって、Excelのstrm1(=3月)、strm2(=4月)、 strm3(5月)の列のところに貼り付けられるってことですよね。 このコードでExcelに書き出した場合と、クエリを右クリック⇒エクスポート した場合と、何が違いがあるのか理解できておりません。 結局クエリを手動で作る必要があるのであれば、このコードを実行して Excelに書き出すメリットって何なのでしょうか。 フォーム上のボタンに当該コードを実行するようにして、ボタン一発で 書き出す・・ってことなのでしょうか。 だとしたら、 DoCmd.TransferSpreadsheet acExport, 10, "Qクエリ",パス+ファイル名,True でいいのかな・・・なんて思うのですが。

その他の回答 (9)

回答No.10

【追加】テーブル構造の変更を列名に自動反映することは可能でした。 先のテストのようにドロップ&アドするのではなく列名を変更すれば、それは自動的にクエリに反映されます。もちろん、このAccessの自動反映機能を使うには、インポート手順を見直す必要がありますが・・・。 1、不要なレコードを削除。 2、列名を更新する。 3、データをインポート。

回答No.8

もしかして・・・。 【テーブルの列名を変更してもクエリを修正する必要がないケース】 要は、[テーブルA]の列の取得を個別列名でなくワイルドカード="*"にすれば良いようですよ。

回答No.7

Q、テーブル構造に応じて列名をかえることは? A、私の力量の範囲では無理です。 1、テーブルの複数の列名が変わってもエラーが発生しない。 2、テーブルの複数の列名が変わってもSQL文の実行結果は変わらない。 3、テーブルの複数の列名が変わったら表示名も変わる。 1と2とは実現可能。でも、3のアイデアは湧いてきませんでした。 つまり、[当月][前月][前々月]などの列名でよければ、クエリは同じのを使えます。 PS、自動列名変換機能は働かず・・・。 手動でテーブルの列名を変更するとクエリにその変更は反映されます。そこで、一縷の望みをかけて添付図のように列名を変更。だが、こういう ALTER を使っての変更はクエリには反映されませんでした。よって、3は私の力量では無理でした。

naoto0216
質問者

補足

度々のご回答ありがとうございます。 >Q、テーブル構造に応じて列名をかえることは? 今回はテーブルの列名(フィールド名)をかえる必要はりません。 インポートしたテーブルに、2月、3月、4月、5月とあった場合、 今月が6月なら3月、4月、5月のフィールドを使いたいだけなのです。 ※要は、今月を基準に、-3ヵ月、-2ヵ月、-1ヵ月のフィールドを  使いたい。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

4ヶ月のデータの推移を見るために、データを 1ヶ月毎にずらしてExcelの内容を変更する、 ということなのでしょうが、もし、Excelに 挿入するデータがAccessにあるならば、やはり Excelファイルのデータの更新をコードで 自動変更、たとえば古いデータの列の削除、 新しいデータの挿入、ヘッダの書き換え、などを 自動化するのが妥当だと、思いますが。 (ファイルは常に一つしかいらない、という前提ですが) それならば、データをインポートすることは ないと思います。Excelファイルのデータが初期とは変更 されるとか、そのログをとるためにインポートが 必要であるとか、インポートしないと載せられないデータ がある、というようなことなら別ですが。 こういうことは、もしかしたらとっくに実行しておられる かもしれませんね。

naoto0216
質問者

お礼

<追記> ちなみに、Bは毎月業者から送られてくるファイルで、 Aは自社にて更新しているファイルです。 よって、エクスポートする内容としては、業者の情報に 自社の情報が付加されたものとなります。 ※このエクスポートしたファイルが翌月のAになります。 Bは契約期間が記載されており、満了前後5ヵ月分が 記載されているものとなるので、毎月スライドしている 感じのものです。 なので、Aも併せてスライドさせる必要があります。 ※スライドしないと、どんどん横長の表になってしまうので。

naoto0216
質問者

補足

前の質問に記載しておりますが、2つファイルをインポートして、 Bの全件に対してAを紐付けて(Aの情報を付加)して Excelにエクスポートする必要があります。 で、Aの方に「x月」があります。 なのでインポートする必要はあります。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

いろいろなオブジェクトの階層の中で、 名前の一意性が維持されなければ プログラムが成り立たないことは おわかりだと思いますので、説明は 必要ないとは思いますが、動的に フィールド名が変更できるならば いつかは必ず同じ名前のフィールド名が 出現できるようなことが可能になります。 一方が100というフィールド名で、一方が 50というフィールド名なら100のフィールドを 開くたびに1減らし、50のフィールドを 開くたびに1加えると・・・、ということです。

naoto0216
質問者

補足

フィールド名を変更する・・・という訳ではありません。 インポートしたテーブルのフィールド名は一切変更しません。 例えば、 インポートしたテーブルに2月 3月 4月 5月 とフィールド名があったら、 クエリに3月 4月 5月 のフィールドだけを採用したい・・・その為に、 クエリのデザイン画面のフィールドの箇所(※)で「今月-3ヵ月」「今月-2ヵ月」 「今月-1ヵ月」っていう指定が出来るのかなーと思った次第です。 ※画像の青枠

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

クエリのフィールド名はテーブルのフィールド名 と同じで、たとえばフィールド名を関数のDate などで設定出来るとするならば開くたびにフィールド名が 変化します。そのために何が起こるか想像が できると思いますが。フォームのレコードソース などには設定できません。 ようするに、作成したクエリが、動的にフィールド名が 変更できないかということならば「NO」です。 前回の質問の回答でのコードをのせる必要があるのか わかりませんが、フィールド名が動的に変更できない となれば、クエリを作る必要があるのかないのか わからないので、そのあたりはどうでしょう。 「予め」作る、ということはいずれは必要、ということですか。 あるいは、単にファイルの書き換えなのか、あるいは エクスポート先がサーバーとか・・・・。 変更できなければ、現状でGOということですか。

naoto0216
質問者

補足

インポートしたファイルのテーブル名が固定で、かつ フィールド名も固定であれば、予めクエリを作成しておく ことができますよね。 テーブル名は固定だけどフィールド名が変わってしまう ケースで、「予め」作っておくことが出来るのかな?と 思い質問させて頂きました。 >たとえばフィールド名を関数のDate >などで設定出来るとするならば開くたびにフィールド名が >変化します。そのために何が起こるか想像が >できると思いますが。 これが想像できなかったので、フィールド名に「今月-1ヵ月」で できるのかなーと思った次第です。 >フィールド名が動的に変更できない >となれば、クエリを作る必要があるのかないのか >わからないので、そのあたりはどうでしょう。 今更ながら仰る通りですね。 確かにクエリ結果をExcelにエクスポートするだけであれば クエリを作成しておく必要が無いですね。 今まで、2つのファイルをインポート⇒これらでクエリ作成⇒ エクスポート とやってたので、クエリ作成に執着してしまいました。 勉強になりました。 ありがとうございました。

回答No.3

補足: 3の処理においては、実際には SELECT ・・・・ XXXXX, YYYYY, ZZZZZ ・・・・ FROM ・・・・ INNER JOIN ・・・・; という雛形を用意して Replace() で置換した方がてっとり早いかもしれません。 PS、ADOXを利用したくない場合は、月時を指定してXXXXX YYYYY ZZZZZ を書き換えるという手もあります。 もちろん、信頼性は落ちますが・・・。

回答No.2

>テーブル構造が毎回違います。 >ですから、実行すべきSQL文をその都度作成しています。 × SQL文中の列名を可変にしたい・・・。 〇 SQL文中の列名にテーブルの列名を反映したい・・・。 私なら・・・ 1、テーブルAの列名を取得する。 2、SQL文の列名と照合する。 3、ミスマッチしていたら取得した列名と入れ替える。 ということをやります。 今、次のようなSQL文をテーブル構造とマッチするように書き換えることに挑んでいます。 >フォームに配置した >1、テキストボックス[現SQL文]に現状のSQL文を表示したい。 >2、テキストボックス[テーブルAの列リスト]に新しいテーブル情報を表示したい。 >3、テキストボックス[新SQL文]に新しいSQL文を作成し表示したい。 >できれば、コマンドボタン[エクスポート]でエクスポートも実行したい。 このようなことに挑んでいます。 と、もう少し質問の焦点を絞らえたがいいかも知れません。 PS、70歳も近くなって最新のやり方に疎いので・・・。 まあ、昔は ADOX を利用して作ったものです。

naoto0216
質問者

補足

ご回答ありがとうございます。 >と、もう少し質問の焦点を絞らえたがいいかも知れません。 質問に書かせて頂いておりますが、単純に  ・毎回インポートするファイルの見出し(フィールド名)が変わる  ・このようなケースで予めクエリを作成しておくことはできるか というだけなんです。 出来るのか出来ないのか、出来るのではあればどのような方法で? ということをご教示頂ければと思い質問させて頂いた次第です。 ・・・とはいっても、わたしとしては「クエリを作成」=デザイン画面上で 作成という意味で書きましたが、その辺が分かり辛かったかもしれ ません。すみません。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

前回の質問の回答で、 >Excelへの書き込みはどのような方法でファイルのヘッダ >などを書き込んでいるのでしょうか。 としたのは、クエリのフィールド名をエクスポート するときに、VBAであらかじめ新規のファイルを 作り、フィールド名をExcelファイルに設定するのですが、 そのときに、VBAコードの中で、クエリのフィールド名を 3ヶ月前  format(dateadd("m",-3,date),"m") 2ヶ月前  format(dateadd("m",-2,date),"m") 1ヶ月前  format(dateadd("m",-1,date),"m") 今月    format(date,"m") のように設定します。たとえば、Excelの列で、A1から F1=ID F2=format(dateadd("m",-3,date),"m") & "月" F3=format(dateadd("m",-2,date),"m") & "月" F4=    ・       ・       ・       ・ のように。 それから、クエリのコピー位置をA2からにして、 ヘッダを除いてエクスポートあるいは書き込み というコードを書けばいいのでは、ということです。 これくらいなら、コードはかけますよね?それとも・・・・。

naoto0216
質問者

補足

エクスポートする際に、フィールド名を変更するってこと だったんですね。失礼しました。 ということは、結論としてはこのようなケースの場合は 「予めクエリを作っておけない」ってことになるのでしょうか。 今回の質問の主旨といたしましては、  ・インポートするファイルの見出し(フィールド名)が毎回変わる  ・このようなケースで予めクエリを作成することはできるか ということです。 確かに最終的にエクスポートする際に、フィールド名が変われば それはそれでよいのですが、ローカルにクエリを作成するときに (デザイン画面上で)フィールド名が変わったとしても何か方法が あるのでは?ということで質問させて頂きました。 CreateQueryDefを使ってSQL文中のフィールド名の箇所を 変数にして目的のクエリを作成することは可能ですが、今回の 肝としてはクエリのデザイン画面上で・・ということでした。 質問の書き方が悪かったですね。すみません。

関連するQ&A

  • ビデオカード交換2

    すみません、 http://okwave.jp/qa/q6622402.html の質問の続きですが、、、 電源側のケーブルに「P2」って書いてあるケーブルがありました。 もしかして、これをどこかに差す込むべきでしょうか? 赤枠です。 青枠は電源側奥の写真です、、、

  • Accessのクエリで2

    お伺い致します。 テーブル名:テーブルA  フィールド:月日,販売先,品番 テーブル名:テーブル期間  フィールド:分類、始月日、終月日 テーブル名:材料テーブル  フィールド:品番,材料1,材料2, 分類 の3テーブルが有り ”テーブルA”の月日の違いで”テーブル期間”の分類を表示させた後 現在品番と分類で材料1、材料2の使用量をクエリで以下のように表示 クエリ名:Q_テーブルA 月日,販売先,品番, 材料1, 材料2 0501,東京販売,18-18, 270, 180...材料の使用量は月日と品番で決まる、 1105,仙台販売,18-21, 290, 190 0801,大阪販売,21-21, 300, 190 0907,東京販売,27-18, 350, 175  ここでお伺いしたい事は 材料テーブルの事ですが実際は品番が30種類、材料が10種類の300データに及び それに期間による材料テーブル1と2の2種類あります 各々の表はエクセルで計算させインポートさせた後ユニオンクエリで一緒にし テーブル作成クエリで”材料テーブル”を作成するという事をしていますが。 そのまま、テーブル1とテーブル2を月日の違いによる分類1,2でスイッチさせて クエリ”Q_テーブルA”を作成する方法が有りませんでしょうか 簡単に出来ると思いつつも良い方法が浮かばず回り道しています。 よろしくお願い致します。

  • アクセスの更新クエリ

    私は以前に、アクセスの桁あわせについての質問をしたことがあるものです。その時は『Format関数』を利用してやる方法を教えていただいたのですが、新たに疑問が出たので質問をさせていただくことにしました。 状態としましては、今エクセルのシートを二つインポートし、片方は1~20の連番のフィールド(テキスト型)があります。もう一つは01~20の連番のフィールド(テキスト型)です。この二つのテーブルの間にリレーションシップをとりたいので型は揃えていないといけないので、『Format関数』を利用し、【Format(Val([code]),"00")】と入力し更新クエリを実行しました。 実際に処理をしていくと、フィールド名が同じのテーブルが幾つもある状態なのですが、この場合その都度更新クエリをテーブルの数だけ作成しなくてはいけないのでしょうか?それとも、フィールド名が同じの場合何か1つの更新クエリで桁をあわせることは可能なのでしょうか? 長くなってしまいましたが、どなたかご存知の方教えて下さい。お願いします。

  • Access 追加クエリについて

    こんにちは! Accessについて、質問させていただきます。 追加クエリを5つ作成したのですが、『複数値を持つフィールドをINSERT INTO クエリに含めることはできません』とエラーが出ます。 調べたところ、ルックアップウィザードに追加クエリが使用できないものと思われます。 追加クエリの元になるテーブルには、ルックアップウィザードを適用しているフィールド(他のテーブルから値を取得している)が複数あります(フィールド名:取次名・担当者名・形態)。 ちなみに、5つの追加クエリのうち1つはルックアップウィザードのフィールド(値を手入力で設定)も1つありますが正常に作動しています。 何か解決策はありますでしょうか? よろしくお願いします!!

  • アクセス クエリがうまく動きません

    添付画像をご覧ください。 「品番」フィールドと「品番の大文字化」フィールドとを比較し、その結果を「判定」に返すクエリを作成しました。小文字を含んだ品番があった場合、判定で1で返すようにしているのですが、「判定」の抽出条件に1を入力して、クエリを実行すると、パラメータの入力が求められてしまいます。 結果としては、判定:1のみを抽出したかったのですが、それがうまくできません。 どうしたらよいでしょうか。。 「品番」フィールド →品番 「品番の大文字化」フィールド →品番大文字化: StrConv([品番],1) 「判定」フィールド →判定: StrComp([品番],[品番大文字化],0)

  • 【Access】2つのクエリを1つにまとめる方法

    下記のT_Subテーブルでmain_idフィールド毎のdayフィールドの最大値のレコードを取得し、 取得したレコードの中でT_Mainのidフィールドに存在するもののみを表示したいと思い、 下記のQ_T_Sub_SelectクエリとQ_Ansクエリを作成し、 Q_Ansクエリを実行する事で意図した動作になったと思います。 その後、この2つのクエリを1つのクエリにまとめようと思ったのですが、 どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、 ご教示の程よろしくお願いします。 【Q_T_Sub_Selectクエリ】 SELECT T_Sub.* FROM T_Sub WHERE (((T_Sub.id)=(SELECT TOP 1 id FROM T_Sub Q WHERE Q.main_id = T_Sub.main_id ORDER BY day DESC, id DESC ))); 【Q_Ansクエリ】 SELECT T_Main.id, T_Main.field1, Q_T_Sub_Select.id, Q_T_Sub_Select.day, Q_T_Sub_Select.field2 FROM T_Main LEFT JOIN Q_T_Sub_Select ON T_Main.id = Q_T_Sub_Select.main_id; 【Q_Ansクエリの実行結果】 T_Main.id|field1|Q_T_Sub_Select.id|day|field2 1|A|2|     |2000 3|C|6|2011/03/10|200 【テーブル(T_Main)】 id|field1 1|A 3|C 【テーブル(T_Sub)】 id|main_id|day|field2 1|1|     |100 2|1|     |2000 3|2|2011/03/04|400 4|2|2011/03/03|500 5|3|2011/03/10|300 6|3|2011/03/10|200 なお、1つのクエリにまとめたい理由ですが、最終的にはクエリではなく、 Visual Basic上に記述を移植したいと思っているためです。 ちなみに、1つのクエリをVisual Basic上に移植して SQLの実行結果を利用するイメージは何となく分かるため、 2つのクエリを1つにまとめる方法を希望しましたが、 2つのSQL文があってもクエリなどを使用せず、 Visual Basic上への記述のみで動作する方法があれば、そのような方法でも大丈夫です。 以上、よろしくお願いします。

  • ACCESS2000 クエリをテーブル化するマクロ(VBA)おしえてください

    こんにちは。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1801262 の質問者です。コレの続きを教えてください。 まとめますと、クロス集計クエリや、ユニオンクエリをそのまま扱うと、データや計算式がからまってエラーになったり、処理が遅かったりするので、テーブル化してからいじりたいのです。 マクロは データベース変換 変換の種類…インポート データベースの種類…MS ACCESS データベース名…L:\パス\パス\ファイル名.MDB オブジェクトの種類…クエリ オブジェクト名…クエリ名 変換先名…テーブル名 テーブル構造のみ変換…いいえ としてみましたが、クエリとしてインポートされてしまいます。 いちどCSVか何かでエクスポートしてから、テキスト変換するという手もありますが、もっとスマートな方法がありましたら教えてください。 VBA も勉強中なので、VBAでお答えいただいてもけっこうです。 よろしくお願いします。

  • Accessのクエリーのデザインを印刷したい

    Accessでクエリーをデザインビューで開くと、 四角い枠で囲まれて ・フィールド名 ・元のテーブル名 ・並べ替え ・表示/非表示 ・抽出条件 等が表示されますがこのままを印刷できないですか? SQLという形だとデータベース解析とかいうメニューで印刷できるのですが……枠に囲まれたクエリーのデザインビューのまま印刷したい。

  • アクセスVBAでテーブル作成クエリを作れる?

    アクセス97です。 テーブル作成クエリで 他のmdbに テーブルを作成してるのですが 他のmdbのフルパスが固定でなく可変です。 テーブル作成クエリの 他のデータベース名を VBAで変更出来るでしょうか? もしくは VBAでテーブル作成クエリを 作成出来るでしょうか?

  • アクセスのクエリの作り方

    初心者なので教えてくださいませんか? アクセスでテーブルを複数作成して、それをクエリで結合するときに、どのテーブルからどのフィールドを選べばいいのかわかりません。 例えば・・・ 売上テーブル:NO 売上日 商品コード 数量 商品テーブル:商品コード 商品名 単価 この二つのテーブルを結合するクエリを作ります。 NO 売上日 商品コード 商品名 単価 数量 上記のフィールドを使用したいのですが、このとき、商品コードをどちらのテーブルのを使ったらよいのでしょう。 その判断は何からしたらよいのでしょうか。 うまく説明できているかわかりませんが、よろしくお願いします。

専門家に質問してみよう