Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルVBAでパラメーターを設定したい
記事No42876
投稿日: 2018/01/05(Fri) 16:12
投稿者あーちゃん
解決済: ON
参照先http://www.ruriplus.com/msaccess/tch/tch_007.html
OS:windows7
Access Version:2010

Accessで集計ツールを作成しています。
まずフォームで抽出したい期間を入力します。
元となるデータからクエリで必要なデータを抽出して、クロス集計クエリで集計を行います。
クロス集計の結果をレポートで印刷して完了です。
ちなみに下記がクロス集計の見本となります。

【クロス集計】
|01(月)|02(火)|03(水)|04(木)|05(金)|06(土)|・・・・・・
みかん | 1 | 1 | 2 | 4 | 5 | 1 |
りんご | 2 | 1 | 3 | 6 | 7 | 9 |
もも | 1 | 1 | 1 | 1 | 1 | 0 |
バナナ | 1 | 1 | 1 | 1 | 1 | 1 |

「みかん」や「リンゴ」の集計項目は変更ありませんが、日付と曜日は抽出する期間により異なる為、
下記のサイトを参考にVBAを書いています。
【参考サイト】 
http://www.ruriplus.com/msaccess/tch/tch_007.html

【VBA】
Private Sub Report_Open (Cancel As Integer)
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim cnt As Integer
Dim fld As DAO.Field
Dim rst As Recordset

Set db = CurrentDb()
Set qd = db.QueryDefe("クロス集計")
With qd
.Parameters("[Forms]![フォーム]![日付始]") = Forms!フォーム!日付始
.Parameters("[Forms]![フォーム]![日付終]") = Forms!フォーム!日付終
Set rst = .OpenRecordset
.Close
End With
rst.Close

For cnt = 2 To qd.Fields.Count - 1
Set fld = qd.Fields(cnt)
Me("Label" & cnt).Caption = fld.Name
Me("Field" & cnt).ControlSource = fld.Name

Next
End Sub

上記を実行するとエラーは発生しませんが、レポートは空白のままです。
※フォームで日付を設定する関係でパラメータをクエリに設定しています。
ただ、テストでパラメータの設定を無くしてVBAを修正すると、問題なくレポートが完成します。
上記のVBAでは、どこの箇所が悪いのでしょうか

VBAは初心者でほぼ知識が0の状態です。
どうかご教授お願いします。

タイトルRe: VBAでパラメーターを設定したい
記事No42877
投稿日: 2018/01/05(Fri) 21:17
投稿者hatena
解決済: ON
下記のように修正すればどうでしょうか。
実際にテストしてないので、ミスがあるかもしれませんが。

Private Sub Report_Open(Cancel As Integer)
    Dim db As DAO.Database
    Dim qd As DAO.QueryDef
    Dim cnt As Integer
    Dim fld As DAO.Field
    Dim rst As Recordset

    Set db = CurrentDb()
    Set qd = db.QueryDefe("クロス集計")
    With qd
        .Parameters("[Forms]![フォーム]![日付始]") = Forms!フォーム!日付始
        .Parameters("[Forms]![フォーム]![日付終]") = Forms!フォーム!日付終
        Set rst = .OpenRecordset
'        .Close  ←クエリを開いているわけでないので必要なし
    End With
'    rst.Close   ←せっかく開いたレコードセットを閉じては駄目

'   ↓rst のフィールド名を取得して、標題、コントロールソースに設定
    For cnt = 2 To rst.Fields.Count - 1
        Set fld = rst.Fields(cnt)
        Me("Label" & cnt).Caption = fld.Name
        Me("Field" & cnt).ControlSource = fld.Name
    Next
    
    rst.Close 'ここでレコードセットを閉じる
End Sub

タイトルRe^2: VBAでパラメーターを設定したい
記事No42878
投稿日: 2018/01/09(Tue) 08:53
投稿者あーちゃん
解決済: ON
hatena様

ご返信頂きありがとうございます。
早速試してみましたが。

「実行時エラー ”3420”
オブジェクトが正しくないか、現在設定されていません」

と表示されてしまい、デバックを行うと

「 rst.Close 'ここでレコードセットを閉じる」で黄色に反転してしまいます。

レポートは相変わらず空白のままです。

タイトルRe^3: VBAでパラメーターを設定したい
記事No42879
投稿日: 2018/01/09(Tue) 11:08
投稿者hatena
解決済: ON
> 「実行時エラー ”3420”
> オブジェクトが正しくないか、現在設定されていません」
>
> と表示されてしまい、デバックを行うと
>
> 「 rst.Close 'ここでレコードセットを閉じる」で黄色に反転してしまいます。

rst は前の方でも参照しているのに、そこでエラーにならずに、
ここでエラーになるのはありえません。

サンプルを作成して回答のコードで試してみましたが、エラーなくレポートが開いて、
正しく表示されました。

実際のコードが間違っているのだと思います。
コードの意味を理解して、実際のものに適合するように書き換えてください。

どうしてもうまくいかないなら、実際のコードをコピーして貼り付けください。

タイトルRe^4: VBAでパラメーターを設定したい
記事No42880
投稿日: 2018/01/09(Tue) 16:12
投稿者あーちゃん
解決済: ON
hatena様
ご返答ありがとうございます。
早速コードの見直しを行い下記に書き直しました!
※因みにコードはコピーして貼り付けています
そうするとエラーにはなりませんでしたが、やはりレポートは空白のままでした。
他に考えられる事はあるでしょうか?
自分で調べながらやってはいるのですが、もうお手上げ状態です(/_;)

Private Sub Report_Open(Cancel As Integer)
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim cnt As Integer
Dim fld As DAO.Field
Dim rst As Recordset

Set db = CurrentDb()
Set qd = db.QueryDefs("クロス集計")
With qd
.Parameters("[Forms]![フォーム]![日付始]") = Forms!フォーム!日付始
.Parameters("[Forms]![フォーム]![日付終]") = Forms!フォーム!日付終
Set rst = .OpenRecordset
End With

For cnt = 2 To qd.Fields.Count - 1
Set fld = qd.Fields(cnt)
Me("Label" & cnt).Caption = fld.Name
Me("Field" & cnt).ControlSource = fld.Name

Next

rst.Close
End Sub

タイトルRe^5: VBAでパラメーターを設定したい
記事No42881
投稿日: 2018/01/09(Tue) 16:31
投稿者hatena
解決済: ON
> Private Sub Report_Open(Cancel As Integer)
>     Dim db As DAO.Database
>     Dim qd As DAO.QueryDef
>     Dim cnt As Integer
>     Dim fld As DAO.Field
>     Dim rst As Recordset
> 
>     Set db = CurrentDb()
>     Set qd = db.QueryDefs("クロス集計")
> With qd
>       .Parameters("[Forms]![フォーム]![日付始]") = Forms!フォーム!日付始
>       .Parameters("[Forms]![フォーム]![日付終]") = Forms!フォーム!日付終
>     Set rst = .OpenRecordset
>    End With
> 
>     For cnt = 2 To qd.Fields.Count - 1
>         Set fld = qd.Fields(cnt)

上記の2行の、qd を rst に変更してください。

>         Me("Label" & cnt).Caption = fld.Name
>         Me("Field" & cnt).ControlSource = fld.Name
>         
>     Next
>    
>    rst.Close
> End Sub

パラメータクロス集計クエリの場合、QueryDef(コード中ではqd)ではフィールドを取得できない。
OpenRecordset でレコードセットを開いて、そのレコードセット(rst)に対してフィールドを取得する必用があります。

タイトルRe^6: VBAでパラメーターを設定したい
記事No42882
投稿日: 2018/01/09(Tue) 17:21
投稿者あーちゃん
解決済: ON
hatena様!!
出来ました!!思い通りになりました!!
本当にありがとうございます。
かれこれ3ヵ月がかりで作成しているツールでした。

そして勉強になりました。
本当にありがとうございました!!

タイトルRe^7: VBAでパラメーターを設定したい
記事No42884
投稿日: 2018/01/10(Wed) 11:40
投稿者hatena
解決済: ON
「クロス集計」に修正しておきました。

タイトルRe^8: VBAでパラメーターを設定したい
記事No42885
投稿日: 2018/01/10(Wed) 12:44
投稿者あーちゃん
解決済: ON
> 「クロス集計」に修正しておきました。

ありがとうございました!

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る