1

Access 2003 データベースに、VBA で生成された従業員のステータス/フィードバック レポートがあります。VBA でレポートを作成するのは、レポートの目的の書式設定が、この方法 (複数のレコードセットを結合する、レコードセットから複数のレコードを他のレコードセットと並べて表示する、いくつかの書式要素に基づいてカスタマイズする) のほうが簡単であることがわかったからです。部門など)。これらのレポートを作成するためのより良い方法があるかもしれませんが、これは問題なく機能しているため、できれば再作成は避けたいと思います。

私の問題は次のとおりです。これは従業員のフィードバック フォームであるため、上司が見たいが従業員には見せたくない詳細があります。レポートが生成されると、スーパーバイザーはデータを確認したり、レポート自体から変更を加えたりする機会があります (ユーザーフォーム、レポートのイベント処理を介して)。レビューの一部は、1 セットのフィールド (ラベルとしてレポートに追加されたもの) を確認することですが、これらのフィールドは、レポートが最終的に印刷されるときに非表示にする必要があります。

頭の中で、この方法で特定のコントロールを非表示にする方法を以前に見たことがあると思い、Google でこの MSDN リソースを検索しましたDisplayWhen。ただし、DisplayWhenフォームでのみ使用できるようです。レポートを使用してこの値 (または同様の/関連するオプション) を設定する方法はありますか? SO で検索を行ったところ、DisplayWhenのクエリで 1 つの質問しか見つかりませんでしたが、これは役に立ちませんでした。

.Visible = Falseスーパーバイザーはこれらのフィールドを表示する必要があるため、レポートのレポートの作成に使用しても機能しません。イベント処理オプションがないため、印刷時にこのプロパティを設定できるようには見えません。印刷コマンドをキャプチャするカスタム イベント ハンドラーを作成できますか?

コントロール作成コードは次のとおりです。

Private Sub AddOneOnOneField(Rpt As Report, Left As Integer, Top As Integer, Width As Integer, Height As Integer, _
    Optional Cap As String = vbNullString, Optional Align As Integer = cnFontCenter, Optional Size As Integer = 10, _
    Optional Bold As Integer = cnBoldFont, Optional DisplayWhen As Byte = 0)

    With CreateReportControl(Rpt.Name, acLabel, acDetail, vbNullString, vbNullString, _
        Left, Top, Width, Height)

        .Properties("FontSize") = Size
        .Properties("FontWeight") = Bold
        .Properties("BorderStyle") = 1
        .Properties("TextAlign") = Align
        .Properties("Caption") = Cap
        .Properties("DisplayWhen") = DisplayWhen ' This does not work!
    End With

End Sub

私の質問を繰り返すには:

  • 特定のレポート フィールドを印刷プレビューでのみ表示し、印刷では表示しないように設定するにはどうすればよいですか?
  • レポートから印刷コマンドを取得するカスタム イベント ハンドラーを作成できますか?
  • DisplayWhenレポート フィールドにプロパティ (または類似/関連オプション)を設定する方法はありますか?
4

2 に答える 2

1

データを非表示にすることが非常に重要である場合は、間違ったデータベースを選択しています。それがややカジュアルな場合は、管理者にコードを入力して、コードに基づいてフィールドを非表示または表示するように依頼できます。または、管理者にわずかに異なるフロントエンドを提供することもできます。

于 2012-07-16T18:39:41.910 に答える
0

これは理想的ではありませんでしたが、機能します。VBA を使用してレポートを作成するとき、レポート モジュール内にコードを作成するためのコードが既にありました。その関数に追加して、フィールドの印刷/強制非表示をキャプチャし、印刷してから非表示を解除しました。

Private Sub AddReportCode(mdlNew As Module)
Dim sNewCode As String

    sNewCode = "Option Compare Database" & vbCr & "Option Explicit"
    sNewCode = sNewCode & vbCr
    sNewCode = sNewCode & vbCr & "Public Sub CapturePrint()"
    sNewCode = sNewCode & vbCr & "Dim v As Variant"
    sNewCode = sNewCode & vbCr & "If Application.CurrentObjectName = ""OneOnOneReport"" And Application.CurrentObjectType = acReport Then"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = False"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 3) = ""Occ"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = False"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acNormal"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 4) = ""HIDE"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = True"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = True"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewPreview"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "End Sub"

    mdlNew.DeleteLines 1, mdlNew.CountOfLines

    mdlNew.InsertText sNewCode

End Sub

読みやすくするために、実行後のモジュール内の実際のコードを次に示します。

Option Compare Database
Option Explicit

Public Sub CapturePrint()
Dim v As Variant
If Application.CurrentObjectName = "OneOnOneReport" And Application.CurrentObjectType = acReport Then
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    Reports("OneOnOneReport").Visible = False
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 3) = "Occ" Then
            v.Visible = False
        End If
    Next v
    DoCmd.OpenReport "OneOnOneReport", acNormal
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 4) = "HIDE" Then
            v.Visible = True
        End If
    Next v
    Reports("OneOnOneReport").Visible = True
    DoCmd.OpenReport "OneOnOneReport", acViewPreview
End If
End Sub

レポートに新しいコントロールを追加するとき (質問本文の元のコードを参照)、オプションでコントロールに名前を割り当てる機能を追加しました。

.Properties("Name") = NewName

名前を複製せずに必要なすべてのコントロールに名前を付けることができるように、コントロール作成コードが のNewName引数で呼び出されました。"HIDE" & ControlTop & ControlLeft非表示にする前に、レポートをデザイン モードで開いて、画面のちらつき/速度低下を防ぎます。次に、印刷コードは、レポートのすべてのコントロールを循環して "HIDE" で始まる名前を探し、それらを非表示にします。すべてのコントロールが非表示になると、レポートは印刷のために通常どおりに再度開かれ、プロセスが繰り返されてこれらのコントロールが再表示され、元のレポートがユーザーに表示されます。

私はまだprintイベントを適切にキャプチャできませんでした (そして、これが解決策が私のお気に入りのオプションではない場所です)。代わりに、レポートの最初の作成時にユーザーに印刷するように促し、新しく作成されたCapturePrintSub を呼び出します (これらのフィールドを非表示にしながら) )。そうしないことを選択した場合は、フィールドを非表示にせずに通常どおり印刷するか、レポートを再生成して非表示にするか、再度プロンプトを表示することができます。

于 2012-07-17T14:44:49.363 に答える