none
Report.CurrentViewの書き込み可否 RRS feed

  • 質問

  • Private Sub Report_open(cancel As Integer) Set Oframe = Me.グラフ If IsNull(Me.OpenArgs) = False Then Me.CurrentView = 0 Oframe.RowSource = Function("クエリ名", Me.OpenArgs) Oframe.Requery Me.CurrentView = 5 Else End If End Sub

    上のコードを実行使用したところ CurrentViewプロパティが読み取り専用とエラーが起きてしまいました。
    VBAリファレンスでは読み取り/書き込みプロパティとなっているのに……おかしい。

    以下のコードでレポートを呼び出しました。

    Private Sub GraphPrint_click()
        DoCmd.OpenReport "レポート", acViewReport, , , acDialog, Me.測定日コード.value
    End Sub

    これはMicrosoft社に相談すべきでしょうか?おかしい、開いた後に変更ができない。おかしい、おかしい、おかしい。

    2019年1月11日 4:58

回答

  • 上のコードを実行使用したところ CurrentViewプロパティが読み取り専用とエラーが起きてしまいました。
    VBAリファレンスでは読み取り/書き込みプロパティとなっているのに……おかしい。

    恐らく、実際は読み取り専用のプロパティなのでしょう。

    そもそも Report オブジェクトの CurrentView プロパティは Access 2007 から追加されたメンバーなのですが、それ以前のバージョンから AccessObject オブジェクトにも同じく CurrentView という同様の役割を持つプロパティが存在しており、こちらは読み取り専用のプロパティとして定義されています。

    そして、あるレポートが開かれている状態で Report オブジェクト型の変数と AccessObject オブジェクト型の変数で同時にそのレポートを参照すると 2 つのオブジェクトの CurrentView プロパティ の値が完全に一致することから推測した限り、「内部的には、前者のプロパティが後者のプロパティをただ参照するだけの実装になっている」という可能性が考えられます。

    DoCmd.OpenReport "レポート", acViewReport, , , acDialog, Me.測定日コード.value

    If IsNull(Me.OpenArgs) = False Then Me.CurrentView = 0 Oframe.RowSource = Function("クエリ名", Me.OpenArgs) Oframe.Requery Me.CurrentView = 5 Else End If

    レポートビューで開かれたレポートをデザインビューに切り替え、グラフオブジェクトの RowSource プロパティに何らかの文字列(テーブル名/クエリ名/SQLステートメント)を設定し、更に印刷プレビューに切り替える」という操作を行なわれていますが、これは何を目的とされている(何故そうする必要がある)のでしょうか。


    • 編集済み sk.exe 2019年1月11日 6:54
    • 回答としてマーク 秋茜十三 2019年3月4日 7:46
    2019年1月11日 6:53

すべての返信

  • 上のコードを実行使用したところ CurrentViewプロパティが読み取り専用とエラーが起きてしまいました。
    VBAリファレンスでは読み取り/書き込みプロパティとなっているのに……おかしい。

    恐らく、実際は読み取り専用のプロパティなのでしょう。

    そもそも Report オブジェクトの CurrentView プロパティは Access 2007 から追加されたメンバーなのですが、それ以前のバージョンから AccessObject オブジェクトにも同じく CurrentView という同様の役割を持つプロパティが存在しており、こちらは読み取り専用のプロパティとして定義されています。

    そして、あるレポートが開かれている状態で Report オブジェクト型の変数と AccessObject オブジェクト型の変数で同時にそのレポートを参照すると 2 つのオブジェクトの CurrentView プロパティ の値が完全に一致することから推測した限り、「内部的には、前者のプロパティが後者のプロパティをただ参照するだけの実装になっている」という可能性が考えられます。

    DoCmd.OpenReport "レポート", acViewReport, , , acDialog, Me.測定日コード.value

    If IsNull(Me.OpenArgs) = False Then Me.CurrentView = 0 Oframe.RowSource = Function("クエリ名", Me.OpenArgs) Oframe.Requery Me.CurrentView = 5 Else End If

    レポートビューで開かれたレポートをデザインビューに切り替え、グラフオブジェクトの RowSource プロパティに何らかの文字列(テーブル名/クエリ名/SQLステートメント)を設定し、更に印刷プレビューに切り替える」という操作を行なわれていますが、これは何を目的とされている(何故そうする必要がある)のでしょうか。


    • 編集済み sk.exe 2019年1月11日 6:54
    • 回答としてマーク 秋茜十三 2019年3月4日 7:46
    2019年1月11日 6:53
  • コードは何よりも雄弁に物語る。

    Private Function Function(ByRef Queryname As String, ByVal IDnumber As Long) As String
        Dim query As QueryDef
        Dim strSQL As String
        Dim CondNew As String
        Dim CondBef As String
        CondNew = "WHERE (((Format([測定日],""yyyy/mm/dd"")) Between (SELECT Format([測定日],""yyyy/mm/dd"") FROM 測定日 WHERE ((測定日.測定日コード)=" + CStr(IDnumber) + ")) And (SELECT Format(DateValue(Format([測定日],""yyyy/mm/dd""))-(365.25/12),""yyyy/mm/dd"") FROM 測定日 WHERE ((測定日.測定日コード)=" + CStr(IDnumber) + "))))"
        CondBef = "WHERE (((Format([測定日],""yyyy/mm/dd"") Between Format(Now(),""yyyy/mm/dd"") And (Format(Datevalue(Now())-365.25/12,""yyyy/mm/dd"")))))"
        Set query = CurrentDb.QueryDefs(Queryname)
        strSQL = query.SQL
        strSQL = Replace(strSQL, CondBef, CondNew, , , vbTextCompare)
        ParamQueryMod = """" + strSQL + """"
    End Function
    
    Queryname.SQL
    "SELECT Format([測定日],"yyyy/mm/dd") AS 測定, FormatNumber([北槽].[酸濃度],0) AS 北酸, FormatNumber([中槽].[酸濃度],0) AS 中酸, FormatNumber([南槽].[酸濃度],0) AS 南酸, FormatNumber([廃酸].[酸濃度],0) AS 廃酸
    FROM (測定者 AS 測定者_1 INNER JOIN (((測定日 INNER JOIN 塩酸 AS 廃酸 ON 測定日.測定日コード = 廃酸.測定日コード) INNER JOIN 塩酸 AS 中槽 ON 測定日.測定日コード = 中槽.測定日コード) INNER JOIN 塩酸 AS 南槽 ON 測定日.測定日コード = 南槽.測定日コード) ON 測定者_1.測定者コード = 測定日.測定者) INNER JOIN 塩酸 AS 北槽 ON 測定日.測定日コード = 北槽.測定日コード
    WHERE (((Format([測定日],"yyyy/mm/dd") Between Format(Now(),"yyyy/mm/dd") And (Format(Datevalue(Now())-365.25/12*5,"yyyy/mm/dd")))))
    GROUP BY Format([測定日],"yyyy/mm/dd"), FormatNumber([北槽].[酸濃度],0), FormatNumber([中槽].[酸濃度],0), FormatNumber([南槽].[酸濃度],0), FormatNumber([廃酸].[酸濃度],0), 測定者_1.測定者名, 北槽.槽の位置コード, 中槽.槽の位置コード, 南槽.槽の位置コード, 廃酸.槽の位置コード
    HAVING (((北槽.槽の位置コード)=1) AND ((中槽.槽の位置コード)=2) AND ((南槽.槽の位置コード)=3) AND ((廃酸.槽の位置コード)=4))
    ORDER BY Format([測定日],"yyyy/mm/dd") DESC;
    "

    サブクエリでIDを元にBetween条件を設定する。これによりIDの日付から範囲を指定する。
    グラフの内容を動的更新して表示印刷するプログラムを作りたかった。ただし力不足だった。
    パラメータクエリではレポート表示時に利用者にIDの入力を要求してしまう。IDは技術上必要であって利用者に見せるべきではない。

    そこでSQL文の組み立てを関数f(ID)としてSQL文字列を作成してレポートに代入する。
    動的なグラフを作成したかった。何故、貴方はそうも簡単に乗り越えていく?

    前回のクラスモジュールが入力なら、今回の動的グラフは出力である。情報支配≒コンピュータ制御≒プログラミング

    これで、伝わりましたか?

    言い換えるとAccessObjectを継承してReportクラスを作っているために、CurrentViewプロパティは元から読み取り専用であると?

    DoCMD.OpenReport,, ...... Where句 ……IDを引数に不完全なWhere句を生成、フィルターされた状態で開く。この方法もありかもしれない。



    2019年1月11日 7:22