Accessレポートの透過PNGが透明にならない:白・グレー・黒の四角が出るときの確認点

AccessVBA

Accessのレポートに透過PNGを貼ったのに、透明にならない。

Accessのレポートで帳票を作るとき、会社のロゴや印影(社判・角印)の画像を入れることがあります。背景を透明にしたPNG画像を用意したのに、PDFにしてみると透明にならず、画像のまわりが四角く塗られていることがあります。

同じ透過PNGでも、イメージコントロールの設定によって背景が白、グレー、透明と変わる

3つとも同じ透過PNGで、薄い緑はレポートのセクション(ヘッダーや詳細などの帯)に付けた背景色です。左と中央は画像の範囲が四角く塗られ、右だけは緑のまま表示されています。

結論から言うと、確認するところは2つです。

  1. イメージコントロール(画像を入れている枠)の背景スタイルを「透明」にする
  2. グループヘッダーの画像にグレーや黒の四角が残るなら、セクションの代替の背景色を「色なし」にする
シチュエーション

帳票に会社のロゴを入れたい
背景に色を付けたヘッダーの上に、ロゴを置いている

枠の大きさに合わせて画像を縮小している
画像の左右や上下の余白が、白やグレーの帯になる

グループヘッダーに画像を置いている
透明にしたのに、グレーや黒の四角が残る

印影を社名に重ねたい
画像を文字の上に置いたら、文字が隠れてしまった

確認1:イメージコントロールの背景スタイル

透過が効いていないように見えますが、検証した範囲では、塗っているのはPNGではなくイメージコントロールの「背景スタイル」と「背景色」です。設定を変えてPDFに出力した結果は次のとおりです。

背景スタイル背景色透明な部分・余白の表示
普通白白で塗られる
普通グレーグレーで塗られる
透明白・グレーセクションの背景色が見える(背景色の設定は無視される。グループヘッダーなどは確認2を参照)

レポートをデザインビューで開き、イメージコントロールを選択して、プロパティシートの「書式」タブで「背景スタイル」を「透明」にします。

検証用にVBAで配置したイメージコントロールは、背景スタイルが「普通」、背景色が「白」でした。セクションの背景も白いレポートでは、塗られていても見た目では分かりません。ヘッダーに色を付けたときに気付きやすくなります。

枠と画像の比率が違うときの余白
プロパティシートの「OLEサイズ」が「ズーム」のとき、枠と画像の比率が違うと、枠の中に余白ができます。この余白も「普通」だと塗られ、「透明」にすれば塗られなくなります。

枠が横長で印影が正方形のとき、普通では余白が白く塗られ、透明では背景色のまま表示される

確認2:グループヘッダーでは代替の背景色も見る

グループヘッダーやグループフッターに置いた画像は、背景スタイルを「透明」にしても四角く色が付くことがあります。 検証では、画像の透明な部分に、帯とは逆の色が見えました。帯が「背景色」のときは四角に「代替の背景色」が見え、帯が「代替の背景色」のときは四角に「背景色」が見えます。

グループヘッダーの画像。代替の背景色が黒や薄いグレーだと四角く色が付き、色なしでは消える

どれも背景スタイルは「透明」で、上下2段はグループヘッダーの1回目と2回目です。背景色は薄い緑にしています。左は代替の背景色が黒の場合で、帯と四角の色が入れ替わっています。中央の薄いグレーは、検証用に新しく作ったレポートの値です。右の「色なし」にすると、四角は消えました。

グループヘッダー(またはグループフッター)のセクションを選択し、プロパティシートの「書式」タブで「代替の背景色」を「色なし」にするか、「背景色」と同じ色にします。リボンの「交互の行の色」でも設定できます。

詳細セクションでは、複数ページにわたって確認しても、この四角は出ませんでした。レポートとページのヘッダー・フッターは、VBAで確認すると代替の背景色の設定がなく、この四角も出ませんでした。

文字や図形に重ねるときの注意

検証したPDFでは、背景スタイルを「透明」にしても、画像の透明な部分に下のものは透けませんでした。見えたのはセクションの背景色だけです。

印影を社名に重ねるときは、文字を手前にします。

画像が手前だと文字が隠れ、文字が手前で両方透明なら重なって見え、ラベルが普通だと印影が隠れる

左は画像が手前で、社名の一部が隠れています。画像を選択して、「配置」タブの「最背面へ移動」を実行すると、中央のように文字が手前になります。このとき、ラベルの背景スタイルも「透明」にしておきます。右のように「普通」のままだと、今度はラベルの背景で印影が隠れます。社名をテキストボックスに入れている場合は、テキストボックスの背景スタイルも確認してください。

図形で帯を作っている場合
色の付いた四角形を帯として敷き、その上に画像を置くと、透明な部分には四角形ではなくセクションの背景色が見えます。

黄色の四角形の上に置いた透明の画像は、セクションの白が見えて白い四角になる

帯がセクション全体なら、四角形ではなくセクションの「背景色」で色を付けると、画像の透明な部分に帯の色が見えます。グループヘッダーでは確認2も見てください。

まとめて設定するプロシージャサンプル

レポートに画像が何枚もある場合は、まとめて設定できます。標準モジュールに以下のコードを貼り付けます。

'=========================================================
'  プロシージャ名:gs_SET_IMG_TRANSPARENT
'  機能  :指定レポートのイメージコントロールの
'            背景スタイルを「透明」に一括設定します。
'            グループヘッダー/フッターの画像は、代替の背景色の
'            確認が必要なのでイミディエイトウィンドウに表示します。
'
'  【引数】
'    strReportName :対象レポート名
'
'  【使用例】
'    Call gs_SET_IMG_TRANSPARENT("R_受注明細")
'=========================================================
Public Sub gs_SET_IMG_TRANSPARENT(strReportName As String)
    On Error GoTo err_SET_IMG_TRANSPARENT
    Dim l_ctl As Control          ' コントロール
    Dim l_cnt As Long             ' 設定件数
    Dim l_grp As Long             ' グループセクションの件数
    '=== 読み取り専用だと、設定しても保存されない ===
    If Not CurrentDb.Updatable Then
        MsgBox "読み取り専用で開いているため設定できません。", vbExclamation
        Exit Sub
    End If
    '=== 開いたままだと、未保存の変更まで保存して閉じてしまう ===
    If CurrentProject.AllReports(strReportName).IsLoaded Then
        MsgBox "レポートを閉じてから実行してください。", vbExclamation
        Exit Sub
    End If
    '=== デザインビューで開く ===
    DoCmd.OpenReport strReportName, acViewDesign, , , acHidden
    For Each l_ctl In Reports(strReportName).Controls
        If l_ctl.ControlType = acImage Then
            l_ctl.BackStyle = 0       ' 0:透明 1:普通
            l_cnt = l_cnt + 1
            If l_ctl.Section >= acGroupLevel1Header Then
                l_grp = l_grp + 1
                Debug.Print "要確認:" & l_ctl.Name & "(" & _
                            Reports(strReportName).Section(l_ctl.Section).Name & ")"
            End If
        End If
    Next l_ctl
    '=== 保存して閉じる ===
    DoCmd.Close acReport, strReportName, acSaveYes
    Debug.Print "設定件数:" & l_cnt & "件(うちグループセクション:" & l_grp & "件)"
    Exit Sub
err_SET_IMG_TRANSPARENT:
    MsgBox "【gs_SET_IMG_TRANSPARENT】設定中にエラー発生" & vbCrLf & _
           "番号:" & Err.Number & vbCrLf & _
           "内容:" & Err.Description, vbCritical
    '=== デザインビューで開いたままにしない(変更は保存しない)===
    On Error Resume Next
    DoCmd.Close acReport, strReportName, acSaveNo
End Sub

実行前に、データベースのバックアップを取っておくと安心です。対象のレポートを閉じてから、イミディエイトウィンドウで次のように実行します。

Call gs_SET_IMG_TRANSPARENT("R_受注明細")

このプロシージャで変わるのは、イメージコントロールの背景スタイルだけです。次のものは別に対応してください。

– 「要確認」と表示されたセクションの、代替の背景色

– 画像に重ねるラベルやテキストボックスの背景スタイル

– サブレポートの画像(サブレポート側のレポート名でも実行します)

それでも四角が残るとき

2つを確認しても消えないときは、画像を白い背景に合成して差し替える方法もあります。ただし白い背景の画像は、色の付いた背景の上では四角く見えます。

以前の帳票作成では透明な部分が黒くなったことがありましたが、そのときの原因が代替の背景色だったかどうかは確認できていません。

確認した環境

Windows 11・Access 2021(日本語)で、VBAの DoCmd.OutputTo で出力したPDFを確認しました。画像はレポートに埋め込み、VBAで配置しています。透明度付きのPNGのほか、パレット形式やグレースケールのPNG、GIFでも、詳細セクションでの透過の表示は同じでした。

画面の印刷プレビューやプリンターへの印刷は確認していません。Accessのバージョンや表示方法によっては、結果が違うことも考えられます。

最後に

以上がAccessのレポートで、透過PNGが透明にならないときの確認点です。

画像を作り直す前に、まずイメージコントロールの背景スタイルを確認してみてください。グループヘッダーに置いている画像は、代替の背景色も確認します。

PDFの出力処理については、こちらの記事でも紹介しています。

レポートの文字に「□」が重なる場合は、こちらの記事をご覧ください。

コメント

タイトルとURLをコピーしました