Access VBA質問箱 IV

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

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


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

【11725】Re:アクセスデータの容量について
お礼  かい  - 10/7/13(火) 9:10 -

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

返信ありがとうございます
やっぱり、SQLServerやOracleですか・・・
いろいろネットで調べて、その辺を取り入れていかなくてはいけないのかなーっと
思いながらも、もしかしたら、Accessに似たいいものはないかと・・・
思っていました。

SQLServerやOracleは超初心者な私でも、できるような、入りやすいものなのでしょうか?
・ツリー全体表示

【11724】Re:LANでのWithEventsは無謀ですか
発言  pon  - 10/7/12(月) 19:20 -

引用なし
パスワード
   ▼247b さん: ありがとうございます
途中報告です テストは明日以降となってしまいました


>>ドライブレターを割り当てる(X:\フォルダ名\フォルダ名 などの形式)に変更した方が無難に思います。
>>IN句でネットワークパスを使用すると、環境によってはうなく参照できない場合があるようです。
>時折他作業で、フルパス直書き時、いつまでたっても接続できないこともありました
>なるほどです ありがとうございます

ドライブレターの割り当てを組み込んでみましたが
割り当て先を触られることがありそうな気がして悩んでしまいました
結局、
起動時割当、終了時割当削除
起動時既割当なら、割当済みでした 管理者に報告する メッセージ で終了
みたいな感じにしました
普通はどのような処理になるのでしょうか
上記、まだ多摩では試していませんがコメント有ればよろしくお願いいたします


>とりあえず、下記だけ。

>というSQLなので、TmpT_PJ_DTは使用してないと思うのですが。
ありがとうございます
SQL確認しました
ユーザーフォームのアクティブレコードが対象になるということですね

動作的には
1、サブフォームのレコードWクリックでファイルサーバーの対象のブックを開く
2、ブックが編集されたら、frm.mdbのtmpテーブルにdt書き込み(1レコードしか存在しない)
3.ブック保存時に、上記テーブルのレコードでdt.mdbのレコードを更新する
通常であれば
DT.mdbの更新先レコードは、サブフォームのアクティブレコードで指定出来ると思いますが
使用者がどんな操作をするのかわからず、途中でmdbをみた拍子にアクティブレコードが
変わってしまうかも知れない
保存時イベントで、更新するレコードはtmpテーブルのレコードを元にするので間違いはない
また
同一形式のテーブルに保存できているので、更新操作時予定外の不具合が発生することはない
といった思いでした

もともとこの辺、勝手な理解しかしていないのですが
TmpT_PJ_DTを元に更新処理を進めるのは不利な操作となるのでしょか

動作確認は
クエリのデータシートビューで確認して安心しているみたいな状況なので・・・

コメント有りましたらよろしくお願いいたします
・ツリー全体表示

【11723】Re:LANでのWithEventsは無謀ですか
発言  247b  - 10/7/11(日) 15:13 -

引用なし
パスワード
   こんにちわ
とりあえず、下記だけ。

>>このSQL文、DT02_PJ_DT.IDXをSELECTしてますが、不要ではないかと思います。
>は
>FROM DT02_PJ_DT INNER JOIN TmpT_PJ_DT ON DT02_PJ_DT.IDX = TmpT_PJ_DT.IDX
>みたいにしとけばよい であっていますか?

strSQL = "SELECT DT02_PJ_DT.*, DT02_PJ_DT.IDX FROM DT02_PJ_DT IN '" & LC_get_path & "' WHERE DT02_PJ_DT.IDX=""" & Forms("MF01_JOB選択F").Controls("T02_PJ_DT").Controls("IDX") & """;"

というSQLなので、TmpT_PJ_DTは使用してないと思うのですが。
・ツリー全体表示

【11722】Re:LANでのWithEventsは無謀ですか
発言  pon  - 10/7/9(金) 18:36 -

引用なし
パスワード
   247b さん ありがとうございます

>LANであっても、距離があるので、回線の細さが影響している可能性もあり得ます。
>その場合は、多摩から更新をかけてしばらく放置しておけば更新されているという動きをするはずです。
ん〜 そうなんですか
この辺の知識皆無です 勉強になります


>このSQL文、DT02_PJ_DT.IDXをSELECTしてますが、不要ではないかと思います。
>それがなければ、dbOpenDynasetではなく、dbOpenTableでRecordsetを開けると思うのですが。
>個人的にですが、ダイナセットは追加・更新・削除では使用しないようにしています。

うう この辺の知識も整理されていません
実際のところ色々な書き方があって理解しないままそのとき目に付いたものを使用みたいなです


>このSQL文、DT02_PJ_DT.IDXをSELECTしてますが、不要ではないかと思います。

FROM DT02_PJ_DT INNER JOIN TmpT_PJ_DT ON DT02_PJ_DT.IDX = TmpT_PJ_DT.IDX
みたいにしとけばよい であっていますか?


>それがなければ、dbOpenDynasetではなく、dbOpenTableでRecordsetを開けると思うのですが。

こちらもいまいち理解が乏しく、ググッてみました

OpenRecordset メソッドのレコードセット
 ://www.tsware.jp/labo/labo_04.htm
では Table が早い との記述がありました

また

dbOpenTable と dbOpenDynaset の違い
 ://uwasora.at.webry.info/200907/article_7.html
では
OpenrecordsetのType(開く種類)
 ://web.archive.org/web/20051031204518 ://www.penhagi.com/access/ota2001/5941.htm
の紹介がありましたが
ずいぶん前のQAでした
この人はどうやって拾ったんだろう??

その他、アドバイスありましたらよろしくお願いいたします


>ドライブレターを割り当てる(X:\フォルダ名\フォルダ名 などの形式)に変更した方が無難に思います。>IN句でネットワークパスを使用すると、環境によってはうなく参照できない場合があるようです。
時折他作業で、フルパス直書き時、いつまでたっても接続できないこともありました
なるほどです ありがとうございます


>とはいえ、まずはデバッグしてみるのが良いかと。
多摩では、VBA触れる人がいないので、出力するものを送って試してみようと思います

>純粋にLAN環境でのDAOの使用に関わる問題ではないでしょうか。
ありがとうございます
可能なことがわかって安心できました

月曜以降になってしまいますが、アドバイス頂いた事項試してみたいと思います
・ツリー全体表示

【11721】Re:条件によって自動的に番号をふりたい
お礼  かなり初心者  - 10/7/9(金) 18:30 -

引用なし
パスワード
   ▼超初心者 さん:
>▼かなり初心者 さん:
>
>今現在、どのような操作(VBA)で
>> Ifが上手く使えていない様で、欲しい結果が得られません。
>なのでしょう?

解決出来ました。

ありがとうこざいました
・ツリー全体表示

【11720】Re:アクセスデータの容量について
発言  247b  - 10/7/9(金) 14:01 -

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

ACCESSのようにDB、画面、帳票の全てを網羅するようなアプリで且つACCESSよりスペックの高いものは無かったように記憶しています。
100万件を超えるデータをACCESSで扱うのはかなりストレスを感じると思います。
ですので、DBは商用DB(SQLServerやOracle)に移行するのが無難な策ではないでしょうか。
この場合、画面はACCESSで開発し、処理自体は商用DBにやらせるという方策もあります。
商用DB側の処理は、T-SQL(SQLServer)、PL/SQL(Oracle)での開発になってしまします。
処理をACCESS側(クエリやVBAを使用して)でやらせると、処理速度の向上という意味では期待薄になってしまいます。
以上、ご参考。
・ツリー全体表示

【11719】Re:LANでのWithEventsは無謀ですか
発言  247b  - 10/7/9(金) 13:47 -

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

▼pon さん:

>で下記、試しましたが、多摩の人だけがうまく動作しません
LANであっても、距離があるので、回線の細さが影響している可能性もあり得ます。
その場合は、多摩から更新をかけてしばらく放置しておけば更新されているという動きをするはずです。原因としては可能性は低いですが、念のため。


>Private Sub xlsApp_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
ブレークポイントを仕掛けるとしたら、↑の行に置けば、エクセルの保存処理直前にこの行で止まるはずです。

>  strSQL = "SELECT DT02_PJ_DT.*, DT02_PJ_DT.IDX FROM DT02_PJ_DT IN '" & LC_get_path & "' WHERE DT02_PJ_DT.IDX=""" & Forms("MF01_JOB選択F").Controls("T02_PJ_DT").Controls("IDX") & """;"

このSQL文、DT02_PJ_DT.IDXをSELECTしてますが、不要ではないかと思います。
それがなければ、dbOpenDynasetではなく、dbOpenTableでRecordsetを開けると思うのですが。
個人的にですが、ダイナセットは追加・更新・削除では使用しないようにしています。

あと、
LC_get_path変数には、ネットワークパス(\\サーバー名\フォルダ名\フォルダ名 という形式)が入っているのでしょうか。その場合、ドライブレターを割り当てる(X:\フォルダ名\フォルダ名 などの形式)に変更した方が無難に思います。IN句でネットワークパスを使用すると、環境によってはうなく参照できない場合があるようです。
その意味では、多摩環境のネットワーク設定が、他と同じになっているかを確認してみるのも良いと思います。

とはいえ、まずはデバッグしてみるのが良いかと。
イベントプロシージャは、例えばボタンをクリックした時の処理を記述するものですが、WithEvents指定した変数のオブジェクトについても、同様にそのオブジェクトでイベントが発生した場合、そのイベント発生時の処理を記述できるようにするものです。
このため、
Private Sub xlsApp_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
という記述は、ボタンのクリックイベントと同じ用な感覚で、xlsApp変数に格納されているExcel.ApplicationオブジェクトのWorkbookBeforeSaveイベント発生時の処理を記述していることになります。
コードと説明を拝見する限り、WithEventsはExcelのオブジェクトに対して定義しているようなので、LANとの関係は特にないと思われます。
純粋にLAN環境でのDAOの使用に関わる問題ではないでしょうか。
うまく説明できているかわかりませんが。
・ツリー全体表示

【11718】Re:実行時エラー'2467'指定した式で、閉...
質問  pon  - 10/7/9(金) 10:49 -

引用なし
パスワード
   247b さん おはようございます

>実行時エラー'2467'指定した式で・・・
で「ググってはみたのですが、あまり情報は見つかりませんでした。

>経験談ですが。
貴重かつ詳細なアドバイスありがとうございます
勉強になります

>多分、こんな感じです
組み込ませて頂きたいと思います
ありがとうございました


>余談ですが上記の問題はクラスモジュールでも発生します。
>クラスモジュールのPublicスコープで、例えば以下のような変数定義を行い、
> Dim x As New DAO.Recordset
>Initializeプロシージャ(Class_Initialize())でx変数を使用しようとすると、稀にエラーになります。
>ご参考。


うう

実はもう1つ不具合が発生しています 

場所的に多摩から
ファイルサーバーにDT.mdbへのレコード更新が何故か出来ません


頂いた ご参考 と関係しているような気もしますが理解が足りていません


別途
LANでのWithEventsは無謀ですか
www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=11717;id=access
をQしました。

こちらにもアドバイス有ればよろしくお願いいたします


追記です

247b さん

【11601】MDBの分離 と レコード操作 pon 
www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=11601;id=access
でも お世話になりました ありがとうございました


本来は あちらの方法で実行したかったのですが

理解と時間が足らず
上記 LANでのWithEventsは無謀ですか
の方法となってしまいました

とても残念な思いですが、時間を作ってチャレンジするつもりです

上記での書き込みテスト結果ですが
連続する3レコードに一斉書き込み(1,2,3 ポッチ)ですが不具合は出ていません
トランザクションでのエラーが有ればこの辺もう少し調べてみたいと思っているのですが
遭遇しないので・・・みたいなです (^-^;)


そんなこんなで、
【11601】MDBの分離 と レコード操作 pon 

247b  - 10/4/23(金) 20:18 -
に、ご返事したいなと思いつつ

継続Qが有りそうなのでと思っているうちに 放置状態みたいな形になっていて
申し訳ありませんでした

この状態がまだ当分続いてしまうような気もしますが
申し訳ないですがよろしくお願いいたします
・ツリー全体表示

【11717】LANでのWithEventsは無謀ですか
質問  pon  - 10/7/9(金) 10:46 -

引用なし
パスワード
   こんにちは よろしくお願いいたします


都港区会社A-同じ建物 同一部署 3人
都多摩会社B 1人
で下記、試しましたが、多摩の人だけがうまく動作しません

下記のような使用可能なのでしょうか
可能、不可能等
アドバイス頂けると助かります
よろしくお願いいたします


動作概要

・ファイルサーバーに帳票(エクセルブック)を保存しています
・アクセスDT.mdbに上記一覧リストのテーブルを有しています
・アクセスFRM.mdb(配布用、ローカルPCで使用)は
  DT.mdbの一覧リストをデータシート形式で表示
  レコード選択で、ファイルサーバの帳票ブックを開く(同時使用は禁止) 
  アクセスのクラスモジュールのWithEventsで
    セル編集時、指定セル値取得
    帳票ブック保存時、DT.mdbのレコード更新

 としていますが、多摩の人だけ、DT.mdbへの更新が出来ていません

 クラスモジュール WithEvents の 理解足りていないため
 デバッグもいまいち思い通りに出来ていないです

 何かアドバイス頂けると助かります
 よろしくお願いいたします
 

'----------------------------------------------------------------
アクセスコード
'----------------------------------------------------------------
Class1

Private Sub xlsApp_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)

  'tmpテーブルdt登録
  edit_TmpT_PJ_DT  
  
  'SVテーブルdt登録
  edit_DT02_PJ_DT  
  
End Sub

'----------------------------------------------------------------
Module10

'ローカルPC内TMPテーブルにレコード追加
Function edit_TmpT_PJ_DT()
   Dim db As Database
   Dim RT As Recordset
   Set db = CurrentDb
  
   db.Execute ("DELETE FROM TmpT_PJ_DT")  
  
   Set RT = db.OpenRecordset("TmpT_PJ_DT", dbOpenTable)
  
   On Error Resume Next
   RT.MoveFirst

   'RT.Edit
   RT.AddNew
  
    RT![依頼部署] = da1_iraibusyo
    ・
    ・
    RT![IDX] = d0_NO
    
   RT.Update
  
   On Error GoTo 0

   RT.Close
   db.Close
End Function

'サーバー更新
'Function edit_DT02_PJ_DT()
Sub edit_DT02_PJ_DT()

  Dim ws As DAO.Workspace
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim strSQL As String
  Dim I As Long
  
  strSQL = "SELECT DT02_PJ_DT.*, DT02_PJ_DT.IDX FROM DT02_PJ_DT IN '" & LC_get_path & "' WHERE DT02_PJ_DT.IDX=""" & Forms("MF01_JOB選択F").Controls("T02_PJ_DT").Controls("IDX") & """;"
  
  Set ws = DBEngine.Workspaces(0)
  Set db = CurrentDb
  Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
  ws.BeginTrans
  
  rs.Edit

    rs![依頼部署] = da1_iraibusyo
    ・
    ・
    rs![mckd] = d32_mckd_dt
  
  rs.Update
  
  ws.CommitTrans
  rs.Close
  Set rs = Nothing
  db.Close
  Set db = Nothing
  
End Sub

'----------------------------------------------------------------
・ツリー全体表示

【11716】アクセスデータの容量について
質問  かい  - 10/7/9(金) 9:59 -

引用なし
パスワード
   今、アクセスでデータ管理していますが、
最終的には、クロス集計をさせていますが、データ数が100万件以上になり、
今後もデータ量は増える予定ですが、
とっても、処理が遅くて、全部のクエリ等を終えるころには、数時間かかることもあります。

アクセスでは限界のようなので、もっとアクセスに似たソフトで、
大容量のデータを処理できるものはないのでしょうか?

ご存知の方がおられましたら、教えていただきたいです

よろしくお願いします
・ツリー全体表示

【11715】Re:条件によって自動的に番号をふりたい
発言  超初心者  - 10/7/9(金) 9:32 -

引用なし
パスワード
   ▼かなり初心者 さん:

今現在、どのような操作(VBA)で
> Ifが上手く使えていない様で、欲しい結果が得られません。
なのでしょう?
・ツリー全体表示

【11714】条件によって自動的に番号をふりたい
質問  かなり初心者  - 10/7/8(木) 21:54 -

引用なし
パスワード
   Access初心者で頭を悩ませています。
勉強不足でお恥ずかしいのですが、助けて頂ければと思い投稿させて頂きました。

テーブル名:台帳
フィールド名:年号、記号、番号

記号ごとの更に年号ごとに自動的に番号をふりたいのですが、Ifが上手く使えていない様で、欲しい結果が得られません。

年号はテキストで入力
記号は英数でリストボックスから入力
番号は001のように表示

例:10-N-001
    09-B-001
    10-N-002
・ツリー全体表示

【11712】Re:実行時エラー'2467'指定した式で、閉...
発言  247b  - 10/7/8(木) 19:01 -

引用なし
パスワード
   こんばんわ。

経験談ですが。
フォームのオープン時イベント内で、そのフォームのコントロール等にアクセスしようとすると、
 閉じているかまたは存在しないオブジェクトを参照しています。
というメッセージが表示されることがあります。
MDBファイルを開き、最初にフォームを開いた時に、フォームオブジェクトが生成され、Formsコレクションに追加されるという動作を裏でしているようなのですが、フォームオブジェクトの生成が、マクロ処理のスピードに追いつけない時にこの問題が発生するらしい、と解釈しています。

このため、対処法としては、Open、Loadイベントは使用せず、OpenFormした後に、フォームに定義したPublicイベントを呼び出すという方法をとっています。この方法だと、オブジェクトの生成後の呼び出しになるため、問題が発生しません。
多分、こんな感じです

Public Function OPEN_MF01_JOB選択F() As Integer
  Dim frm As Form_MF01_JOB選択F
  DoCmd.OpenForm "MF01_JOB選択F"
  Set frm = Forms("MF01_JOB選択F")
  frm.Init
End Function

Public Sub Init()

  Me!T02_PJ_DT.Form.RecordSource = set_sql  '20100708 ←ここで止まる

End Sub

余談ですが上記の問題はクラスモジュールでも発生します。
クラスモジュールのPublicスコープで、例えば以下のような変数定義を行い、
 Dim x As New DAO.Recordset
Initializeプロシージャ(Class_Initialize())でx変数を使用しようとすると、稀にエラーになります。
ご参考。
・ツリー全体表示

【11711】Re:実行時エラー'2467'指定した式で、閉...
発言  pon  - 10/7/8(木) 17:51 -

引用なし
パスワード
   追記です


>配布前テストで数人に試してもらったところ

都港区会社A-同じ建物 同一部署 3人
都多摩会社B 1人
での作業環境でした

昨日 多摩の人が上記不具合発生,今朝も同じ不具合確認
本日 こちらで多摩の人のIDで試してみて不具合が再現しました
   コード上不具合は見つからず先ほどの書き込みになったのですが
   いつのまにか、エラーが無くなってしまいました
   そこで、多摩の人に昨日と同じファイルで動作確認してもらうと
   エラーは出ませんでした

良く分かりませんが、アクティブデイレクトリの不具合?みたいな
ような気もしますが良く分かりません

サポート部署に聞きましたが要領を得る答えは聞けませんでした

アドバイス有りましたらよろしくお願いいたします
・ツリー全体表示

【11710】実行時エラー'2467'指定した式で、閉じて...
質問  pon  - 10/7/8(木) 14:43 -

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

わかりにくいと思いますが、よろしくお願いいたします


配布前テストで数人に試してもらったところ
ログイン者によって
実行時エラー'2467'指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。
が出ます

構成は
ファイルサーバーにDT.mdb:セキュリティ設定でアクセス権設定
ローカルPCのFRM.mdb を配布
  データシート形式のフォームに、DT.mdbのレコードを表示させる 
しています

同じ、FRM.mdb を 渡しているのに、Nさんだけエラーが出ます

色々試した結果、セキュリティのアクセス権がないと同じ症状が出ることは確認出来ましたが
アクセス権はちゃんと設定してあります


やむを得ず、NさんのログインIDとパスワードを借りて
動作確認してみましたが同じ症状となりました


不具合の再現1

FRM.mdbをWクリックで起動すると

1.エラー
実行時エラー '2467':
指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。
で終了

2.アクションの実行エラー
マクロ名:Autoexec
条件 true
アクション名:プロシージャの実行
引数:OPEN_MF01_JOB選択F()

となってしまうので


不具合の再現2

OPEN_MF01_JOB選択F()
にブレークポイントを設けて
1)マクロ名:Autoexec を クリック

2)下記が走って
Public Function OPEN_MF01_JOB選択F() As Integer




      DoCmd.OpenForm "MF01_JOB選択F"

End Function

3)下記が走る
フォームモジュール MF01_JOB選択F
Private Sub Form_Open(Cancel As Integer)




  Me!T02_PJ_DT.Form.RecordSource = set_sql  '20100708 ←ここで止まる

End Sub

'20100708 ←ここで止まる

実行時エラー'2467'指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。
が出ます
となってしまいます


set_sqlが悪いのかと思い下記試しました
クエリにSQLを貼り付け、データシートビューにするとちゃんと表示されます
つまりアクセス権は問題ないと

そこで

Me!T02_PJ_DT.Form.RecordSource
をイミディエイトウインドウで確認してみました

?[Forms]![MF01_JOB選択F]![T02_PJ_DT].NAME
T02_PJ_DT

?[Forms]![MF01_JOB選択F]![T02_PJ_DT].form.name
実行時エラー '2467':
指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。

となってしまいます


不具合の発生しないログインID パスワードでは

?[Forms]![MF01_JOB選択F]![T02_PJ_DT].name
T02_PJ_DT

?[Forms]![MF01_JOB選択F]![T02_PJ_DT].form.name
sF_T02_PJ_DT

となります


つまり
?[Forms]![MF01_JOB選択F]![T02_PJ_DT].form.name
実行時エラー '2467':
指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。

Me!T02_PJ_DT.Form.RecordSource = set_sql
実行時エラー '2467':
指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。

で同じ原因かと思いますが
ここから先どうすればいいのかわかりません

アドバイスよろしくお願いいたします
・ツリー全体表示

【11709】Re:データのないフィールドの表示
回答  小僧  - 10/7/6(火) 23:39 -

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

> フォームで作ることを考えて

という事ですので、VBAを使って回答させて頂きますね。

まずは準備としてテーブルの仕様固めからです。

先にご提示頂いた売上テーブルについてなのですが、
一番上のレコード

>  107 |********|20100620



> (20日締めなので21日〜20日)

という事なので存在してはいけないという事で大丈夫でしょうか?

今後の作業で 右2桁を持って日付とする様な操作が出て来るので
20100620 と 20100720 が同時に存在していると
同じ「20」という日付で集計されてしまいます。


次に

> 支店テーブル

が存在するという事ですので、

支店コード    支店名
101        A支店
102        B支店
103        C支店

の様なデータの持たせ方をして
売上テーブルは「支店コード」で管理してみましょう。

支店コード|伝票番号|売上計上日
--------------------------------
105    |********|20100621
103    |********|20100623


テーブルの準備が整いましたら VBA の出番です。

Sub MakeCrossQuery()
Dim strSQL As String
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim QD As DAO.QueryDef

  Set DB = CurrentDb
  
  'クエリ Q_Cross の存在チェック
  'なかった場合には作成
  'あった場合には使いまわし
  
  strSQL = " SELECT * FROM MsysObjects WHERE NAME ='Q_Cross'"
  
  Set RS = DB.OpenRecordset(strSQL, dbOpenSnapshot)
  If RS.EOF Then
    Set QD = DB.CreateQueryDef("Q_Cross")
  Else
    Set QD = DB.QueryDefs("Q_Cross")
  End If
  RS.Close
  
  'クロス集計クエリの作成
  
  strSQL = ""
  strSQL = strSQL & " TRANSFORM Count(売上テーブル.伝票番号) AS 伝票番号のカウント "
  strSQL = strSQL & " SELECT 売上テーブル.支店コード "
  strSQL = strSQL & " FROM 売上テーブル "
  strSQL = strSQL & " GROUP BY 売上テーブル.支店コード "
  strSQL = strSQL & " PIVOT Right([売上計上日],2);"

  QD.SQL = strSQL
  QD.Close
  
  MsgBox "クロス集計クエリ作成終了"

End Sub


上記をコピーし、標準モジュールに貼り付け実行させた後
クエリ「Q_Cross」が出来る事を確認してみて下さい。


ここまで出来ましたら段々と

> 伝票のなかった支店
>毎月ごとに自動で31があったりなかったりにできる仕様

に対応して行こうと思います。
・ツリー全体表示

【11708】Re:データのないフィールドの表示
発言  MIT48  - 10/7/6(火) 20:01 -

引用なし
パスワード
   ▼小僧 さん:
回答ありがとうございます。

仕事中は返信ができないので家でになってしまいました
遅くなり申し訳ありませんm(__)m


説明不足ですみません(><)
補足させていただきます。

>使うのが別の方であれば尚更テーブルやクエリや見せずに
>フォーム上に配置したコマンドボタン等にて操作して頂くのが
>一般的だと思われるのですがいかがでしょうか。

フォームで作ることを考えて、使用者がクエリやテーブルにはさわらないように作成したいとかんがえております。
フォームだけは先に作ってしまってるのであとは中身を完成させなければというところです・・・

かなりの手間をかける覚悟もできております。


>仕様についてですが、
>最終目的の Excelに Export ができるだけで良いのか

最終的には毎月ごとにEXCELにExportできるまでで大丈夫です。
テーブルは集計が終わるごとに内容は削除できるようにし、次の月からはまた新しくデータを集めて集計という形にしようと考えています。


>また、列見出しについての仕様も
>ご提示して頂ければと思います。
>
>例えば2010年6月の場合、31日は存在しないため
>… 29 30 1 2 …
>としたいのか、それとも列見出しは31個固定で
>… 29 30 31 1 2
>で良いのかによって作りが多少変わって来ますね。

列見出しについてですが、小僧さんのおっしゃったところで悩んだんです!
いろいろ調べたのですがよくわからなくなり、うるう年があったらもっと大変みたいなことしかわかりませんでした・・・
できれば毎月ごとに自動で31があったりなかったりにできる仕様が理想なのですが・・・可能でしょうか?

現時点では31日を固定してある仕様にしておこうと考えていました。


>クロス集計クエリを使う上では
>行見出しの扱いに注意する必要があります。

ご忠告ありがとうございます。
いろいろ調べる過程で行見出しや列見出しの決定の仕方が重要なようだというのはわかっていたのですが・・・これから勉強していこうと思います。


まだまだ説明不足な部分があるかと思いますが、あればご指摘してください。
よろしくお願いいたします。
・ツリー全体表示

【11707】Re:データのないフィールドの表示
発言  小僧  - 10/7/6(火) 9:58 -

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

> 使うのは支店の方なのでできるだけ余計な手間を省き
> クエリだけでなんとかしたいと思っています。

使うのが別の方であれば尚更テーブルやクエリや見せずに
フォーム上に配置したコマンドボタン等にて操作して頂くのが
一般的だと思われるのですがいかがでしょうか。

使って頂く方の操作の手間を省くためには
MIT48 さんが相応の手間を掛けないと難しいかと思われます。


> 各支店の伝票を集計するツールを作成している
> エクセルにエクスポートしたい

仕様についてですが、
最終目的の Excelに Export ができるだけで良いのか、
それとも 今後も Access の ツールとして
色々データ操作をされたいのかによって
回答の内容も変わりますので教えて下さい。

また、列見出しについての仕様も
ご提示して頂ければと思います。

例えば2010年6月の場合、31日は存在しないため
… 29 30 1 2 …
としたいのか、それとも列見出しは31個固定で
… 29 30 31 1 2
で良いのかによって作りが多少変わって来ますね。


クロス集計クエリを使う上では
行見出しの扱いに注意する必要があります。

ミニミニ Access Tips
フィールド、コントロール、オブジェクトや変数などに付ける「名前」について
h tp://ww3.tiki.ne.jp/~kaya/Ac_tips.html#Tips0_001

上記サイトにもありますが、
テーブル(クエリ)のフィールドには

> 先頭に半角数字は使用しない

という様なお約束があります。
クロス集計クエリで日付をそのまま行見出しにした場合、
上記のタブーを犯してしまう事になります。

> フィールド名は、上記のタブーを犯していても場合によっては
> フィールド名の前後を [ ] で囲むことで回避できることもあります。

とある通り、注意すれば防げる事項なので
絶対にしてはいけない訳ではありませんが、

例えばクロス集計クエリの中から
更に20日のデータだけ欲しい、などという場合

SELECT 20 FROM クロス集計クエリ
SELECT [20] FROM クロス集計クエリ

2つのクエリ(SQL)は違う結果を返す事になりますので
注意が必要になります。

同様に

SELECT 2010/6/20 FROM クロス集計クエリ



SELECT 2000 ÷ 6 ÷ 20 FROM クロス集計クエリ

と解釈される恐れがあるので注意です。
・ツリー全体表示

【11706】データのないフィールドの表示
質問  MIT48  - 10/7/5(月) 23:41 -

引用なし
パスワード
   ACCESSで行き詰ったので質問させてください(>_<)


各支店の伝票を集計するツールを作成しているところなのですが・・・

完成イメージは下のようなカンジです↓

〔図1〕完成テーブル

   21 22 23 24 25 26 27 28 29 30      16 17 18 19 20
101| 3| 4|34| 7| | | | 6|45| 8|・・・| 6| | | | |
102| 4|34|21| 8| 4| | |27|32| 4|   |35|21| | |21|
103| |56| |10|64| | | |56| |   |17| | | | |
104| |59| | |43| | |67| | |   |98|65| | |46|
105|54|34|37|24|36| | |64|68|24|   |13|25| | |28|
106|38|46|57|53|47| | | |43|57|   |45|67| | |54|
106|78|65|43|65|78| | |32| 6| 8|   |23| 4| | | 5|
107| | 5| 7| 8| 2| | | 5|21| 1|   |12|11| | | 9|
108|12| 4|34|21| 1| | | 7|86|54|   |32| 4| | | 9|

フィールドに月度日付のみ表示(20日締めなので21日〜20日)
列見出しに支店コード(101〜108)
伝票番号をカウントしてクロス集計で表にした状態でエクセルにエクスポートしたいのです。


元データは[売上テーブル]

〔図2〕売上テーブル

 支店|伝票番号|売上計上日
 107 |********|20100620
 105 |********|20100621
 103 |********|20100623
 101 |********|20100623
 101 |********|20100624
 109 |********|20100625
 104 |********|20100625
 103 |********|20100625
 105 |********|20100625
 104 |********|20100628
       :
       : 
 102 |********|20100717
 105 |********|20100717
 104 |********|20100717
 106 |********|20100720
 104 |********|20100720
 105 |********|20100720

この元データは1週間ずつしか取得できないので、追加クエリで[売上テーブル]にデータはためていくようにします。
上のは月度、一月分が集計し終わった状態です。


これだけあれば普通に集計クエリでいけると思うのですが


〔図3〕現状の完成テーブル

   <> 21 22 23 24 27 28 29      16 17 20
101| 0| | | | | | | |・・・| | | |
102| |34|21| 8| 4|27|32| 4|   |35|21|21|
103| |56| |10|64| |56| |   |17| | |
104| |59| | |43|67| | |   |98|65|46|
105| |34|37|24|36|64|68|24|   |13|25|28|
106| 0| | | | | | | |   | | | |
106| 0| | | | | | | |   | | | |
107| | 5| 7| 8| 2| 5|21| 1|   |12|11| 9|
108| | 4|34|21| 1| 7|86|54|   |32| 4| 9|


問題となっているのは休日です。
〔図1〕のように休日は空欄として表示させたいのですが、クロス集計を使うとデータのないところは表示されませんでした。
これは列見出しの支店でも同じでした。
〔図2〕の元データ[売上テーブル]にも休日は集計されません。

列見出しの支店は別に[支店テーブル]を用意して、クロス集計のときに[支店テーブル]を結合させて結合プロパティを設定することでどうにかなったのですが・・・

〔図3〕のように一番左に伝票のなかった支店の0が表示される<>フィールドができてしまいます。


説明下手なうえ長くなりましたが、今解決したいことは

・データのない休日フィールドを表示させる。
・<>の0が表示されるのを表示させない。

〔図1〕の完成形になればいいのですが・・・欲をいうと

・一番右のフィールドには合計フィールドを追加

も検討しています。

作るのは私ですが、使うのは支店の方なのでできるだけ余計な手間を省きクエリだけでなんとかしたいと思っています。
私自身もACCESSはさわって1ヶ月なので用語やSQLなどはわからないところだらけです。
初歩的な質問わけのわからない質問をしてしまうことがあるかと思いますがみなさんにご教授お願いいたしますm(__)m

またこの掲示板のルール等もわからないので説明不足や失礼があったら申し訳ございません。
・ツリー全体表示

【11705】Re:更新クエリで パラメータの入力ダイ...
お礼  pon  - 10/7/4(日) 10:52 -

引用なし
パスワード
   ▼よろずや さん ありがとうございました

 UPDATE T1
 SET
 を
 UPDATE
 T1 inner join T2
 ON T1.F0 = T2.F0
 SET
 として、希望の操作がかないました

 ありがとうございました

今後もよろしくお願いいたします
・ツリー全体表示

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