Microsoft Access 掲示板

views
4 フォロー
6,283 件中 5,441 から 5,480 までを表示しています。
3

Accessでできないことはないです。
が、かなりの高度なスキルが必要です。
質問内容から想像するにめいさんが、そのような高度なスキルをお持ちとは思えません。
いちどソフト屋さんに見積もりを出してみてください。かなりの金額のシステムになると思います。
このような掲示板で扱える案件でもありません。

2
めい 2020/04/14 (火) 17:48:35 c9c22@10970

ご連絡ありがとうございます。
こちらのURLのような伝票を印刷したいと考えております。
https://goqsystem.com/ittaigata

送り状はCSVですが、明細書はPDFで、Accessを使用して1枚の伝票に印刷したいと考えております。
どなたかお分かりでしたら、方法を教えて下さい。

11

hirotonさん、サポートありがとうございます。
ItemsSelected はインデックスが入るのでした。あと、コピペミスもしてました。
うしねこさん、hirotonさんの回答を参考に修正してください。

1

CSV と PDF ってまったくジャンルの違うものですが、それを「1枚の伝票に印刷したい」とは、まったく意味が分かりません。もう少し具体的に説明してもらえませんか。

14

2020/04/08 の私の回答の方法を一度試してみてください。
集計期間の日付を更新クエリで t月 に生成しますので、それを使って集計するようにします。その為に、式はシンプルになります。2つめのクエリで月次移動平均の計算に必要なデータは揃うと思いますので、それに必要な式を追加すればできると思います。

13

hirotonさん
返信ありがとうございます。

商品数が数百と仕入売上で数千レコードあるのでやはり難しそうですね。

商品別に仕入数量、仕入金額、売上数量をまとめてVBAで金額部分を計算という方法でやってみようと思います。

エクセルでVBAをちょっと触ったくらいの知識しかないので、時間がかかるかもしれませんがまた相談させてください。

hatenaさん
返信ありがとうございます。

月次移動平均は下記の計算方法になります。

・期首在庫数量
・期首在庫金額
・7月仕入数量
・7月仕入金額
・7月払出数量
・7月払出金額 → (期首在庫金額+7月仕入金額)/(期首在庫数量+7月仕入数量)× 7月払出数量
・7月在庫数量 → 期首在庫数量+7月仕入数量-7月払出数量
・7月在庫金額 → 期首在庫金額+7月仕入金額-7月払出金額

毎月の在庫金額が前月の在庫金額を元に計算してしまうので複雑になってしまうという事ですね。

10
hiroton 2020/04/14 (火) 13:51:09 修正 fc935@f966d
For Each Itm In Me![製品リストbox].ItemsSelected

これでItmに入るのはリストのインデックスになってますね。ItemsSelected プロパティ (Access)
(インデックスを入れる変数名にItmを使うのはなんかやだなぁと思ったけどリンク先の例文もvarItmだった・・・)

    '製品用フィルター生成
    Dim listIndex As Variant
    For Each listIndex In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Me![製品リストbox].ItemData(listIndex)  & "'"
    Next

あと

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
'           trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter  ←コピペミス?'
            strFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

VBEのオプション設定のお勧めを徹底解説
VBA触るなら読まないと損するページです。
つまらないミスをなくすためにも変数宣言の強制を。

9
うしねこ 2020/04/14 (火) 11:11:04

貼り付けます。

選択数: 4
strFilter: 製品コード In ('0','1','3','5')
Form.Filter: 製品コード In ('0','1','3','5')
選択数: 3
strFilter: 製品コード In ('0','1','3')
Form.Filter: 製品コード In ('0','1','3')
選択数: 3
strFilter: 製品コード In ('0','1','2')
Form.Filter: 製品コード In ('0','1','2')
選択数: 3
strFilter: 製品コード In ('0','1','2')
Form.Filter: 製品コード In ('0','1','2')

8

コードに下記のようにデバッグ用のコードを埋め込んでください。

その後、フォームを開いて、リストボックスでリストを複数選択して、フィルタ適用ボタンをクリックします。

次に、Ctrl+G でイミディエイトウィンドウを開いて、そこに出力されているテキストをコピーしてここに貼り付けてもらえますか。

Private Sub フィルタ適用ボタン_Click()

    Dim strFilter As String 'フィルタ文字列

    Debug.print "選択数: " & Me![製品リストbox].ItemsSelected.Count '※デバッグコード

    '製品用フィルター生成
    Dim Itm As Variant
    For Each Itm In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next

    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"

        Exit Sub
    End If

    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"

    Debug.print "strFilter: " & strFilter '※デバッグコード

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
            trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

    Debug.print "Form.Filter: " & Me![販売実績サブ].Form.Filter '※デバッグコード

End Sub
7
うしねこ 2020/04/14 (火) 09:36:18

hatenaさんありがとうございます。

顧客ID:数値型
製品コード:テキスト型

コード提示いたします。

デバッグをしてみたところ、 Itmがemptyになっていることに気が付きました。
サブフォームになにも表示されなくなってしまう件と
なにか関係がありますでしょうか・・・?

‘‘‘Private Sub フィルタ適用ボタン_Click()

    Dim strFilter As Variant 'フィルタ文字列
    Dim trFilter As Variant

    '製品用フィルター生成
    Dim Itm As Variant

    For Each Itm In Me![製品リストbox].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next
    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"

        Exit Sub

    End If

    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"

    '顧客用フィルター追加
    If Me!コンボID <> "" Then
            trFilter = "顧客ID=" & Me!コンボID & " AND " & strFilter
    End If

    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

End Sub‘‘‘

6
hatena 2020/04/13 (月) 14:57:02 修正

では、まず、私の回答のコードを参考にして、実際に書いたコードを提示してください。

あと、顧客ID と 製品コード のデータ型も教えてください。(数値型か、テキスト型か)

5
うしねこ 2020/04/13 (月) 11:04:00

hatenaさんありがとうございます。

が、しかし、エラーは出なくなったのですが、
フィルタ適用ボタンを押してもサブフォームになにも出てこなくなってしまいました 泣
(フォームを開いたときはすべてのデータが表示されるのですが、
その後顧客IDを選んで、製品コードを選んで、「フィルタ適用」を押すとなにも表示されなくなってしまいます。)

4
hatena 2020/04/10 (金) 22:51:54 修正 >> 3

あっ、すみません。間違てますね。下記に修正してください。

strFilter = "顧客ID=" & Me!cb顧客 & " AND " & strFilter

元の回答も修正しておきます。

3
うしねこ 2020/04/10 (金) 17:16:07

hatenaさんありがとうございます!

早速試したのですが、
strFilter = "顧客ID=" & Me!cb顧客 & " AND " strFilter
ここで「構文エラー」になってしまいます・・・泣

2
新人情シス 2020/04/09 (木) 15:00:24 bcee9@5a927

hatena様

早速のご回答ありがとうございます。
ご指導頂きましたようにやると集計が出来ました。

数日悩んでいたので目からうろこが落ちる思いです。
本当にありがとうございました。

企業名地域名取引件数の合計
A社アメリカ10
A社カナダ5
A社フランス6
A社アジア7
A社南米28
B社アメリカ3
B社カナダ5
B社イギリス100
B社アジア140
B社南米35
C社アメリカ50
C社フランス47
C社アジア237
C社南米5
D社アメリカ50
D社イギリス40
D社アジア140
D社南米8
E社フランス20
E社イギリス30
E社アジア40
1

下記のような取引国マスターを作成します。

取引国コード取引国地域コード地域名
1アメリカ1アメリカ
2カナダ2カナダ
3フランス3フランス
4イギリス4イギリス
10中国10アジア
11香港10アジア
12韓国10アジア
13台湾10アジア
20ブラジル20南米
21コロンビア20南米
22チリ20南米

クエリを作成して、元テーブルと取引国マスターを取引国コードで結合します。
集計クエリにして、企業名、企業コード、地域コード、地域名 でグループ化して、取引件数を合計にすればご希望の結果になります。

2
hatena 2020/04/08 (水) 17:28:58 修正

下記のような仕様だと仮定した場合のコード例

顧客を選択するコンボボックス
名前 cb顧客
連結しているフィールド 顧客ID(数値型)

Private Sub フィルタ適用ボタン_Click()
    Dim strFilter As String 'フィルタ文字列

    '製品用フィルター生成
    Dim Itm As Variant
    For Each Itm In Me![リスト].ItemsSelected
        strFilter = strFilter & ",'" & Itm & "'"
    Next
    If strFilter = "" Then
        MsgBox "製品をリストから選択してください。"
        Exit Sub
    End If
    strFilter = "製品コード In (" & Mid(strFilter, 2) & ")"
    
    '顧客用フィルター追加
    If Me!cb顧客 <> "" Then
        strFilter = "顧客ID=" & Me!cb顧客 & " AND " & strFilter
    End If
    
    If strFilter <> "" Then
        Me![販売実績サブ].Form.Filter = strFilter
        Me![販売実績サブ].Form.FilterOn = True
    End If

End Sub
12

上記で仕入関係のデータは得られます。移動平均もクエリ内で計算できると思います。
同様に、売上関係のデータを出力するクエリを作成します。
2つのクエリを[月ID]で結合すれば月別の移動平均データができると思います。

月別データが縦に並びますが、もし、横に並べないなら、クロス集計クエリで横並びに変換できます。

11
hatena 2020/04/08 (水) 12:35:10 修正

ちょっと考えてみました。

まず、下記のようなテーブルを作成します。

テーブル名 T月

フィールド 名データ型
月ID  数値型(主キー)
期首日 日付/時刻型
月末  日付/時刻型

月ID に 1 から 12 までの数値を入力します。

下記の更新クエリを実行します。

UPDATE t月, t決算日
SET
 t月.期首日 = DateSerial(Year([決算日]),Month([決算日])-11,0)+1,
 t月.月末 = DateSerial(Year([決算日]),Month([決算日])-11+[月ID],0);

これでt月は下記のようになります。

月ID期首日月末
12019/07/012019/07/31
22019/07/012019/08/31
32019/07/012019/09/30
42019/07/012019/10/31
52019/07/012019/11/30
62019/07/012019/12/31
72019/07/012020/01/31
82019/07/012020/02/29
92019/07/012020/03/31
102019/07/012020/04/30
112019/07/012020/05/31
122019/07/012020/06/30

下記のようなクエリを作成します。

SELECT
 t商品マスタ.商品ID, t商品マスタ.商品名, t商品マスタ.期首数量, t商品マスタ.期首金額,
 t月.月ID
 Sum(t仕入明細.仕入数量) AS 仕入数量計,
 Sum([仕入数量]*[仕入単価]) AS 仕入金額計
FROM t月, t商品マスタ INNER JOIN t仕入明細 ON t商品マスタ.商品ID = t仕入明細.仕入商品ID
WHERE t仕入明細.仕入日 Between [期首日] And [月末]
GROUP BY
 t商品マスタ.商品ID, t商品マスタ.商品名, t商品マスタ.期首数量, t商品マスタ.期首金額,
 t月.月ID
ORDER BY
 t月.月ID;

これで移動平均を計算できるデータは揃うと思いますがいかがでしょうか。

実際のデータでの確認はしてませんので、見落としがあるかもしれません。
考え方を参考にしてください。下記のような考え方です。

  • 日付計算が複雑なので、必要な日付を先に計算してテーブルに格納しておく。→T月
  • T月 と 他のテーブルは結合しない → T月とデータのすべての組み合わせが出力される。
  • これを、[期首日]から[月末]で抽出する。
  • それを集計する。
10
hatena 2020/04/08 (水) 10:55:30 修正

「月次移動平均」というのを知らなかったのと、hirotonさんの回答が付いたので、お任せしてましたが、なかなか苦労してますね。

「月次移動平均」というものをちょっと調べてみましたか、下記の理解であってますでしょうか。

期首日からのある月までの合計金額を合計数量で割ったもの。

つまり、今回は6/30が決算日のようですので、
7月度移動平均は、(期首金額+7月金額計)/(期首数量+7月数量計)
8月度移動平均は、(期首金額+7月~8月金額計)/(期首数量+7月~8月数量計)
9月度移動平均は、(期首金額+7月~9月金額計)/(期首数量+7月~9月数量計)
・・・
ということでよろしいでしょうか。

新たにデータベース、テーブルを作成し、レコードを数行入力して下記コードで実行してみましたが

ということなら、そのデータベースのファイルを送付してもらえますか。
右カラムの一番下に「ファイル送信フォーム」のリンクがありますので、そこから送信してください。
内容を確認して、ここにファイルリンクを置きますので、だれでもダウンロードしてそれをもとに実験できますので、的確な回答が付きやすいと思います。

1
hiroton 2020/04/08 (水) 10:26:18 65ab2@f966d

複数選択可能なリストボックスを使ったうんぬんってそれなりに高度な内容(だと思っている)ので本題との難易度の差がどこで躓いているのかよくわからんです

Filter プロパティ (Access)

FilterにはWHERE句と同等の文字列を設定する(てきとー)なので

Me![販売実績サブ].Form.Filter = "顧客ID=1 AND 製品コード IN('a','b')"

のようになるようstrFilterを作ってあげれば良いです

9
hiroton 2020/04/06 (月) 17:37:30 dea5e@f966d

現象を確認しました。
hirotonの上げた構文は8月以降の式が想定と異なっていたためエラーにならなかったようです。

いろいろ試してみましたが、一時テーブルを作成して、「n月金額」部分のみ計算させるような(sumもiifもnzもない)クエリを作っても11か月以上同時に表示しようとするとエラーが発生してしまいました。

フィールドを順次参照していることと、そのフィールドが計算式になっていることが重なって「複雑」となるようですが、明確な条件はわかりませんでした。

いろいろやってみたところ、クエリでの計算を減らすとなんとかなることもあるようでした。例えば標準モジュールに以下のユーザー定義関数を作成し、クエリ上の計算式を置き換えます。

Function 払出金額(前月金額, 前月数量, 当月仕入金額, 当月仕入数量, 当月売上数量)
    払出金額 = (前月金額 + 当月仕入金額) / (前月数量 + 当月仕入数量) * 当月売上数量
End Function

Function 当月金額(前月金額, 前月数量, 当月仕入金額, 当月仕入数量, 当月売上数量)
    当月金額 = 前月金額 + Nz(当月仕入金額, 0) - Nz((前月金額 + 当月仕入金額) / (前月数量 + 当月仕入数量) * 当月売上数量, 0)
End Function
:
 Sum(IIf([月]=1,[仕入数量])) AS 8月仕入数量,
 Sum(IIf([月]=1,[仕入金額])) AS 8月仕入金額,
 Sum(IIf([月]=1,[売上数量])) AS 8月売上数量,
 払出金額([7月金額],[7月数量],[8月仕入金額],[8月仕入数量],[8月売上数量]) AS 8月払出金額,
 Sum(IIf([月]<=1,[仕入数量]-[売上数量])) AS 8月数量,
 当月金額([7月金額],[7月数量],[8月仕入金額],[8月仕入数量],[8月売上数量]) AS 8月金額,
:

ただ、表示までこぎつけても、数件のテストデータだけでも表示までにそれなりの時間がかかっていたので、実用できるかはちょっと疑問です。「複雑すぎ」ると言われるのも納得かなと

金額計算部分がフィールドを繰り返し参照する重い処理になっているので、出力用のテーブルを事前に作成しておいて金額部分以外を出力したのち、VBAで金額部分を計算させるのがいいんじゃないのかなぁと思いました

1

下記で紹介している関数を使って、18インチモニターの時は縮小するようにすればどうでしょうか。

フォーム上のコントロールのサイズを拡大/縮小する関数 - hatena chips

8

もう、見てないようなので閉じます。

9

解決済みということで、閉じます(凍結)。

26

解決したようなので閉じます。

25
mikami 2020/04/03 (金) 15:13:29 fbb2a@d54d5

できました。本当に助かりました。DAOの方も、少し勉強したいと思います。
ありがとうございました。

8
名前なし 2020/04/03 (金) 15:05:04 e2559@c90e0 >> 6

早々にご対応いただき有難うございます。
イメージしていたコードより思いの外複雑でしたが、勉強になりました。
今後ともよろしくお願いいたします。

8
名前なし 2020/04/03 (金) 10:16:46 6d87b@60c58

新たにデータベース、テーブルを作成し、レコードを数行入力して下記コードで実行してみましたが
10か月未満では表示できましたが、それを超えると表示できなくなってしまいました。

何か他に原因があるのでしょうか。

SELECT
 q.商品ID,
 Max(q.商品名) AS 商品名,
 Sum(IIf(月=-1,仕入数量)) AS 期首数量,
 Sum(IIf(月=-1,仕入金額)) AS 期首金額,
 Sum(IIf([月]=0,[仕入数量])) AS 7月仕入数量,
 Sum(IIf([月]=0,[仕入金額])) AS 7月仕入金額,
 Sum(IIf([月]=0,[売上数量])) AS 7月売上数量,
 ([期首金額]+[7月仕入金額])/([期首数量]+[7月仕入数量])*[7月売上数量] AS 7月払出金額,
 Sum(IIf([月]<=0,[仕入数量]-[売上数量])) AS 7月数量,
 [期首金額]+Nz(Sum(IIf([月]=0,[仕入金額])),0)-Nz([7月払出金額],0) AS 7月金額,

 Sum(IIf([月]=1,[仕入数量])) AS 8月仕入数量,
 Sum(IIf([月]=1,[仕入金額])) AS 8月仕入金額,
 Sum(IIf([月]=1,[売上数量])) AS 8月売上数量,
 ([7月金額]+[8月仕入金額])/([7月数量]+[8月仕入数量])*[8月売上数量] AS 8月払出金額,
 Sum(IIf([月]<=1,[仕入数量]-[売上数量])) AS 8月数量,
 [7月金額]+Nz(Sum(IIf([月]=1,[仕入金額])),0)-Nz([8月払出金額],0) AS 8月金額,

 Sum(IIf([月]=2,[仕入数量])) AS 9月仕入数量,
 Sum(IIf([月]=2,[仕入金額])) AS 9月仕入金額,
 Sum(IIf([月]=2,[売上数量])) AS 9月売上数量,
 ([8月金額]+[9月仕入金額])/([8月数量]+[9月仕入数量])*[9月売上数量] AS 9月払出金額,
 Sum(IIf([月]<=2,[仕入数量]-[売上数量])) AS 9月数量,
 [8月金額]+Nz(Sum(IIf([月]=2,[仕入金額])),0)-Nz([9月払出金額],0) AS 9月金額,

 Sum(IIf([月]=3,[仕入数量])) AS 10月仕入数量,
 Sum(IIf([月]=3,[仕入金額])) AS 10月仕入金額,
 Sum(IIf([月]=3,[売上数量])) AS 10月売上数量,
 ([9月金額]+[10月仕入金額])/([9月数量]+[10月仕入数量])*[10月売上数量] AS 10月払出金額,
 Sum(IIf([月]<=3,[仕入数量]-[売上数量])) AS 10月数量,
 [9月金額]+Nz(Sum(IIf([月]=3,[仕入金額])),0)-Nz([10月払出金額],0) AS 10月金額,

 Sum(IIf([月]=4,[仕入数量])) AS 11月仕入数量,
 Sum(IIf([月]=4,[仕入金額])) AS 11月仕入金額,
 Sum(IIf([月]=4,[売上数量])) AS 11月売上数量,
 ([10月金額]+[11月仕入金額])/([10月数量]+[11月仕入数量])*[11月売上数量] AS 11月払出金額,
 Sum(IIf([月]<=4,[仕入数量]-[売上数量])) AS 11月数量,
 [10月金額]+Nz(Sum(IIf([月]=4,[仕入金額])),0)-Nz([11月払出金額],0) AS 11月金額,

 Sum(IIf([月]=5,[仕入数量])) AS 12月仕入数量,
 Sum(IIf([月]=5,[仕入金額])) AS 12月仕入金額,
 Sum(IIf([月]=5,[売上数量])) AS 12月売上数量,
 ([11月金額]+[12月仕入金額])/([11月数量]+[12月仕入数量])*[12月売上数量] AS 12月払出金額,
 Sum(IIf([月]<=5,[仕入数量]-[売上数量])) AS 12月数量,
 [11月金額]+Nz(Sum(IIf([月]=5,[仕入金額])),0)-Nz([12月払出金額],0) AS 12月金額,

 Sum(IIf([月]=6,[仕入数量])) AS 1月仕入数量,
 Sum(IIf([月]=6,[仕入金額])) AS 1月仕入金額,
 Sum(IIf([月]=6,[売上数量])) AS 1月売上数量,
 ([12月金額]+[1月仕入金額])/([12月数量]+[1月仕入数量])*[1月売上数量] AS 1月払出金額,
 Sum(IIf([月]<=6,[仕入数量]-[売上数量])) AS 1月数量,
 [12月金額]+Nz(Sum(IIf([月]=6,[仕入金額])),0)-Nz([1月払出金額],0) AS 1月金額,

 Sum(IIf([月]=7,[仕入数量])) AS 2月仕入数量,
 Sum(IIf([月]=7,[仕入金額])) AS 2月仕入金額,
 Sum(IIf([月]=7,[売上数量])) AS 2月売上数量,
 ([1月金額]+[2月仕入金額])/([1月数量]+[2月仕入数量])*[2月売上数量] AS 2月払出金額,
 Sum(IIf([月]<=7,[仕入数量]-[売上数量])) AS 2月数量,
 [1月金額]+Nz(Sum(IIf([月]=7,[仕入金額])),0)-Nz([2月払出金額],0) AS 2月金額,

 Sum(IIf([月]=8,[仕入数量])) AS 3月仕入数量,
 Sum(IIf([月]=8,[仕入金額])) AS 3月仕入金額,
 Sum(IIf([月]=8,[売上数量])) AS 3月売上数量,
 ([2月金額]+[3月仕入金額])/([2月数量]+[3月仕入数量])*[3月売上数量] AS 3月払出金額,
 Sum(IIf([月]<=8,[仕入数量]-[売上数量])) AS 3月数量,
 [2月金額]+Nz(Sum(IIf([月]=8,[仕入金額])),0)-Nz([3月払出金額],0) AS 3月金額,

 Sum(IIf([月]=9,[仕入数量])) AS 4月仕入数量,
 Sum(IIf([月]=9,[仕入金額])) AS 4月仕入金額,
 Sum(IIf([月]=9,[売上数量])) AS 4月売上数量,
 ([3月金額]+[4月仕入金額])/([3月数量]+[4月仕入数量])*[4月売上数量] AS 4月払出金額,
 Sum(IIf([月]<=9,[仕入数量]-[売上数量])) AS 4月数量,
 [3月金額]+Nz(Sum(IIf([月]=9,[仕入金額])),0)-Nz([4月払出金額],0) AS 4月金額,


 Sum(IIf([月]=10,[仕入数量])) AS 5月仕入数量,
 Sum(IIf([月]=10,[仕入金額])) AS 5月仕入金額,
 Sum(IIf([月]=10,[売上数量])) AS 5月売上数量,
 ([4月金額]+[5月仕入金額])/([4月数量]+[5月仕入数量])*[5月売上数量] AS 5月払出金額,
 Sum(IIf([月]<=10,[仕入数量]-[売上数量])) AS 5月数量,
 [4月金額]+Nz(Sum(IIf([月]=10,[仕入金額])),0)-Nz([5月払出金額],0) AS 5月金額,


 Sum(IIf([月]=11,[仕入数量])) AS 6月仕入数量,
 Sum(IIf([月]=11,[仕入金額])) AS 6月仕入金額,
 Sum(IIf([月]=11,[売上数量])) AS 6月売上数量,
 ([5月金額]+[6月仕入金額])/([5月数量]+[6月仕入数量])*[6月売上数量] AS 6月払出金額,
 Sum(IIf([月]<=11,[仕入数量]-[売上数量])) AS 6月数量,
 [5月金額]+Nz(Sum(IIf([月]=11,[仕入金額])),0)-Nz([6月払出金額],0) AS 6月金額

FROM (SELECT
 商品ID,
 商品名,
 -1 AS 月,
 期首数量 AS 仕入数量,
 期首金額 AS 仕入金額,
 0 AS 売上数量,
 0 AS 売上金額
  FROM t商品マスタ, t決算日

  union all
  SELECT
 仕入商品ID,
 "",
 (month([仕入日])+5) mod 12,
 仕入数量,
 仕入単価*仕入数量,
 0,
 0
  FROM t仕入明細, t決算日
  WHERE 仕入日 Between DateAdd("yyyy",-1,[決算日]+1) And [決算日]

  union all
  SELECT
 売上商品ID,
 "",
 (month([売上日])+5) mod 12,
 0,
 0,
 売上数量,
 売上単価*売上数量
  FROM t売上明細, t決算日
  WHERE 売上日 Between DateAdd("yyyy",-1,[決算日]+1) And [決算日]
)  AS q
GROUP BY q.商品ID;
24

おはようございます。今回は届いていました。
動化確認してみましたら、確かにそのエラーがでますね。クエリも普通に開けるので特に問題はないですね。

ためしに、ADODBの処理をDAOに書き直してみましたら、エラーなく実行できるようになりました。

Private Sub コマンド25_Click()
 Dim a As String
    a = MsgBox("請求書履歴に登録しますか。はいを押すと請求書履歴に保存されます。", vbOKCancel)
    
    If a = vbCancel Then
    MsgBox ("中止しました")
    Exit Sub
    End If
    
   Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Dim rs1 As DAO.Recordset
    
    'Connectionは一つで共有する
    Set DB = Application.CurrentDb
    Set rs = DB.OpenRecordset("Q_月間請求書履歴", dbOpenForwardOnly, dbReadOnly)
    Set rs1 = DB.OpenRecordset("T_seikyu", dbOpenDynaset, dbAppendOnly)
       
    Do Until rs.EOF
        '"月間請求書履歴"(rs)のデータを"データ"(rs1)に新規追加
        rs1.AddNew
        rs1!請求書NO = rs!請求書NO
        rs1!請求日 = rs!請求日
        rs1!会社名 = rs!会社名
        rs1!氏名 = rs!氏名
        rs1!現場名 = rs!現場名
        rs1!工事名 = rs!工事名
        rs1!請求金額 = rs!請求金額
        rs1.Update
        '"月間請求書履歴"(rs)を次レコードへ移動
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    rs1.Close
    Set rs1 = Nothing
    
    DB.Close
    Set DB = Nothing
    
    DoCmd.OpenForm "F_seikyu"

End Sub

なぜ、ADODBでは失敗するのかは原因が分かりませんが、DAOの方がAccessのテーブルとは相性がいいと思います。

7
hatena 2020/04/03 (金) 09:04:18 修正 >> 6

カレンダーの範囲をまたぐときにも対応できる様に処理を追加しました。

Public Sub SetSchedule()
    Dim i As Integer
    For i = 1 To 42
        Me("T" & i).Caption = ""
        Me("G" & i).Caption = ""
    Next
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset( _
        "SELECT 開始日, 終了日, 件名 FROM T_予定 WHERE " & _
        "終了日>#" & FirstDay & "# AND 開始日<=#" & FirstDay + 42 & "#", _
        dbOpenForwardOnly, dbReadOnly)
    Do Until rs.EOF
        Dim BeginI As Long
        BeginI = rs!開始日 - FirstDay
        If BeginI > 0 Then
            Me("T" & BeginI).Caption = rs!件名
        Else
            Me("T1").Caption = rs!件名
        End If
        
        If Not IsNull(rs!終了日) Then
            If BeginI > 0 Then
                Me("G" & BeginI).Caption = ChrW(8656) '"←"
            Else
                BeginI = 0
            End If
            
            Dim EndI As Long
            EndI = rs!終了日 - FirstDay
            If EndI <= 42 Then
                Me("G" & EndI).Caption = Me("G" & EndI).Caption & ChrW(8658) '"→"
            Else
                EndI = 43
            End If
            For i = BeginI + 1 To EndI - 1
                Me("G" & i).Caption = "="
            Next
        End If
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
End Sub

下記がサンプルファイルです。

FrmCalendar2.zip

23
mikami 2020/04/03 (金) 08:39:58 fbb2a@d54d5

おはようございます。送信致しました。今回は届いていると思います。よろしくお願いします。

6
名前なし 2020/04/02 (木) 23:07:06 e2559@c90e0 >> 5

早速のお返事有難うございます。
上記コードを理解できるように努めてみます。

追伸;
ちなみに月跨ぎの場合はエラー表示が出ました。
例えば、
月マタギの”2月”を表示した瞬間、”G59”フィールドが見つかりません。
日付をクリックすると”T43870”フィールドが見つかりません。というのもでした。

お時間の都合が付きましたら、教えていただけると幸いです。

5

ガントチャート表示用のラベルを42個、予定表示のラベルの下に配置してください。
名前は、G1 ~ G42 とします。
文字配置は「中央」にしておくといいと思います。

SetSchedule関数を下記のように修正してください。

Public Sub SetSchedule()
    Dim i As Integer
    For i = 1 To 42
        Me("T" & i).Caption = ""
        Me("G" & i).Caption = ""
    Next
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset( _
        "SELECT 開始日, 終了日, 件名 FROM T_予定 WHERE " & _
        "開始日>#" & FirstDay & "# AND 開始日<=#" & FirstDay + 42 & "#", _
        dbOpenForwardOnly, dbReadOnly)
    Do Until rs.EOF
        Dim BeginI As Long
        BeginI = rs!開始日 - FirstDay
        Me("T" & BeginI).Caption = rs!件名
        If Not IsNull(rs!終了日) Then
            Dim EndI As Long
            EndI = rs!終了日 - FirstDay
            Me("G" & BeginI).Caption = ChrW(8656) '"←"
            Me("G" & EndI).Caption = Me("G" & EndI).Caption & ChrW(8658) '"→"
            For i = BeginI + 1 To EndI - 1
                Me("G" & i).Caption = "="
            Next
        End If
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
End Sub

これで表示できると思います。
ただし、月またぎの予定は考慮してないので、現状のままだとエラーになるか、表示できないと思いますので、
その辺を考慮した処理を追加する必要があります。

今日のところはここまでで。明日、時間が取れたら、月またぎの部分のコードを追加します。
Furuさんの方でもまずは上記のコードの内容を理解して、可能なら月またぎの処理も考えてみてください。

4

ご返信有難うございます。

基本的に1日に複数の予定を入れることは無いです。
テーブルのデータはまだ勉強中というのもあり簡素化しています。
"開始日","終了日","件名","備考"

のみです。
よろしくお願いいたします。

22

mikamiさん、まだファイルが届いてません。送信に失敗しているかもしれませんので、もう一度送信してもらえますか。

3

それなら比較的に簡単にできそうです。
1日に複数の予定が入ることはないですか。
テーブルのデータ例を何レコードか提示していただけたら、サンプルコードを提示できると思います。

2
名前なし 2020/04/02 (木) 16:43:04 e2559@c90e0

ご返信有難うございます。

ちなみに↑の場合は、単純に”件名”ラベルの中に打ち込む感じでも可能と思っていますが、
コチラのイメージ的には別ラベルで、例えば、エクセルで作成できるガントチャートのような
感じでした。
フォーム内 指定日(”開始日”)をクリックし、予定を入力すると別ラベルに”←”が表示され、
”終了日”を入力すると、別ラベル中間日に”=”と最終日に”→”が表示されるイメージです。

4月
| 1日  | 2日 | 3日 | 4日 | 5日 |
| 出張 |     |     |   |    |
|  ←  |  = |  = |  = |  →  |

どのようなVBAを使用すると可能になるかをご教示いただけると幸いです。

7
hiroton 2020/04/02 (木) 16:17:02 b0bf4@f966d

modだと12月以降の数字がマイナスになってしまった

すみません。計算式を間違えていました。

Month([仕入日])+5 Mod 12

見えてる範囲の(画像の)データを作成し試していますが、NZ追加、月算出方法の変更を掛けてもこちらでは問題なく表示がされます。

12か月分入力すると

ということですが、表示できなくなるのは質問同様半年を超えたあたりということでしょうか?
クエリで表示月を減らすと表示されますか?
新規にACCESSファイルを作り、テストデータを作ってみるとどうですか?