アクセス2000でデータベースを作成しています。レポートについて分からないことがあるので教えてください。
・ImageFileというフィールドにイメージファイルのフルパスを入力しておき、フォーム上のPictureを配置し、下記のようなコードを記述して、Pictureに、イメージファイルを読み込んで表示させています。
Private Sub Form_Current()
If IsNull(Me.ImageFile) Then
  Me.イメージ.Picture = "d:\nonimage.jpg"
Else: Me.イメージ.Picture = Me![ImageFile]
End If
End Sub
・同じような方法でレポートでイメージを印刷させることは出来ないでしょうか?
 尚、ImageFileはレコード毎に異なるものを使用しています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

レポートの詳細_Format イベントに、同じコードを書いちゃってください。



不明点とかあったら、補足してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QACCESSのVBAでPrivate Sub ~endsubの後の区切り線が消えてしまう

ACCESSでかなり長いVBAのプログラムを書いてあるのですが不定期にエラーが出ます。デバッグ画面で確認するとendsubで区切られたはずのプログラムが区切り線がなくなっていてアクションを起こしてくれません。これってACCESSのバグですか?あるいは私の書き方に無理があるのでしょうか?

Aベストアンサー

まず、End Sub が重なったら、実行時エラーにはなりませんね。
たぶん、原因は、メモリのオーバーフローではありませんか?遠因では、「長いVBAのプログラム」というのが問題ではないでしょうか?

どのような内容かは分かりませんが、Object を放置してあって、その実行を重ねて使ってしまう。例えば、RecordSet をそのまんまにしてしまうとか?また、Public ステートメントにObjectを宣言し、Close していないとか、やってはいけないミスですね。便利だからとグローバル変数を安易に書く人がいますが、私は、慎重に使って多用しないようにしています。

まして、ループの中で、Object の設定をするなんていうのは、論外ですが、時々見かけます。

それはともかくとして、マクロならともかく、「長いVBA」コードというのは、更新も利かず、エラーでも迷宮入りになりかねませんから、各役割をパーツにして、サブルーチン化し、メインを設けて構造化してください。私の場合は、PCが古いので、サブルーチンの中で、その都度、Objectの開放をして負担を減らしています。掲示板などのサンプルは、一本で書くのが慣例ですが、実務では分けるようにしています。

まず、End Sub が重なったら、実行時エラーにはなりませんね。
たぶん、原因は、メモリのオーバーフローではありませんか?遠因では、「長いVBAのプログラム」というのが問題ではないでしょうか?

どのような内容かは分かりませんが、Object を放置してあって、その実行を重ねて使ってしまう。例えば、RecordSet をそのまんまにしてしまうとか?また、Public ステートメントにObjectを宣言し、Close していないとか、やってはいけないミスですね。便利だからとグローバル変数を安易に書く人がいますが、私は、...続きを読む

QCurrent、Openがそれぞれ2回発動する

テーブルには適当なデータが入っています。

フォーム1を作り、コマンドボタンを1個だけ設置して、フォーム2を開くようにするために

Private Sub コマンド0_Click()
DoCmd.OpenForm Form_フォーム2.Name
End Sub

としました。

フォームはテーブルをレコードソースとしています。

フォーム2のモジュールに
Private Sub Form_Current()
Debug.Print "Form_Current"
End Sub

Private Sub Form_Open(Cancel As Integer)
Debug.Print "Form_Open"
End Sub

としたのですが、結果は
Form_Open
Form_Current
Form_Open
Form_Current
になります。

よって、二つのイベントの中にいくつかのプロシージャーが入っているのですが
2回ずつ実行されてしまい、求めている結果と異なってしまいます。

これを回避する方法はありますか?

どうしてもフォーム1のコマンドボタンを押して、フォーム2をひらきたいのです。
よろしくお願いします。

テーブルには適当なデータが入っています。

フォーム1を作り、コマンドボタンを1個だけ設置して、フォーム2を開くようにするために

Private Sub コマンド0_Click()
DoCmd.OpenForm Form_フォーム2.Name
End Sub

としました。

フォームはテーブルをレコードソースとしています。

フォーム2のモジュールに
Private Sub Form_Current()
Debug.Print "Form_Current"
End Sub

Private Sub Form_Open(Cancel As Integer)
Debug.Print "Form_Open"
End Sub

としたのですが、結果は
Form_Open
Form_Current
Form_O...続きを読む

Aベストアンサー

>DoCmd.OpenForm Form_フォーム2.Name
だと二回発生しますね。
クラスとしてのフォーム2の関係から?のような気がしますが
残念ながらスキルを持ち合わせていません。
DoCmd.OpenForm "フォーム2"
なら1回だけでした。

QMe.FilterOn = True は先でも後で

Me.FilterOn = True は先でも後でも問題ないですか?

アクセスのvbaでフォームにフィルタをかけるときに
今まで
---------------------------------------
Private Sub コマンド2_Click()
Me.Filter = "フィールド = '" & "test" & "'"
Me.FilterOn = True
End Sub
---------------------------------------
とコードを書いていましたが
---------------------------------------
Private Sub コマンド2_Click()
Me.FilterOn = True
Me.Filter = "フィールド = '" & "test" & "'"
End Sub
---------------------------------------
でも機能しました。

という事は、
Me.FilterOn = Trueは
Me.Filter の前でも問題ないのでしょうか?

Me.FilterOn = Trueは
Me.Filter の後と習ったので疑問に思っています。
よろしくお願いいたします。

Me.FilterOn = True は先でも後でも問題ないですか?

アクセスのvbaでフォームにフィルタをかけるときに
今まで
---------------------------------------
Private Sub コマンド2_Click()
Me.Filter = "フィールド = '" & "test" & "'"
Me.FilterOn = True
End Sub
---------------------------------------
とコードを書いていましたが
---------------------------------------
Private Sub コマンド2_Click()
Me.FilterOn = True
Me.Filter = "フィールド = '" & "test" & "'"
End Sub
----------...続きを読む

Aベストアンサー

興味もあって2007でやってみました。


私の今までの書き方)

  If (Len(sWhereCondition) = 0) Then
    Me.FilterOn = False
    Me.Filter = ""
  Else
    Me.Filter = sWhereCondition
    Me.FilterOn = True
  End If

ここで、

Me.FilterOn = False 状態の時、Me.Filter を変更しても何も起きません

Me.FilterOn = True 状態の時、
・ Me.Filter を変更すると、再クエリが発生しました
・ Me.FilterOn = True を再設定しても再クエリされませんでした

Me.FilterOn = False 状態の時、
    Me.Filter = sWhereCondition
    Me.FilterOn = True ' ★

    Me.FilterOn = True ' ★ ' ☆
    Me.Filter = sWhereCondition ' ★

の記述にすると ★ で再クエリが発生しました。
ただ、☆ 時に Me.Filter = "" なら True にはなりませんでいた。
True にならない可能性があるので、

    Me.Filter = sWhereCondition
    Me.FilterOn = True

が正しい順と思われます。

Me.FilterOn = True 状態の時、
    Me.Filter = "" か Me.FilterOn = False でフィルタ解除されました。
Me.FilterOn = False 時に Me.FilterOn = False しても変化はありませんでした。
ただ、Me.Filter = "" とすると自動で Me.FilterOn = False に変化。
また、Me.Filter = "" 時に Me.FilterOn = True にはできませんでした。

これらの動きをまとめてみると、

    Me.Filter = sWhereCondition ' ★1
    Me.FilterOn = True ' ★2

だけで良さそうです。
(sWhereCondition = "" なら FilterOn は自動で False になって True にできない)
Me.FilterOn = True 状態の実行では、★1で再クエリ
Me.FilterOn = False 状態の実行では、★2で再クエリ
てな動きになるのでしょうか・・・


なので、ご質問への回答としては、

Me.FilterOn = True
Me.Filter = "フィールド = '" & "test" & "'"

と記述すると、
実施前 Me.Filter = "" であれば、フィルタはかからない。
実施前 Me.Filter = "" でなければ、最悪2回再クエリすることになる。
(実施前 Me.FilterOn = False だったら2回)
(実施前 Me.FilterOn = True だったら1回)
という事になるのでしょうか。


※ 私の環境でのものなので、検証はしてください。

興味もあって2007でやってみました。


私の今までの書き方)

  If (Len(sWhereCondition) = 0) Then
    Me.FilterOn = False
    Me.Filter = ""
  Else
    Me.Filter = sWhereCondition
    Me.FilterOn = True
  End If

ここで、

Me.FilterOn = False 状態の時、Me.Filter を変更しても何も起きません

Me.FilterOn = True 状態の時、
・ Me.Filter を変更すると、再クエリが発生しました
・ Me.FilterOn = True を再設定しても再クエリされませんでした

Me.FilterOn = Fal...続きを読む

QPicture Managerについて

Office2003についているPicture Managerについて
ご質問します。
画像の加工や共有ソフトなのらしいのですが
bmpの拡張子の画像をjpegの拡張子にする項目が
Picture Managerを使うと変更できなくなってしまします
変更する場合はPicture Managerをアンインストールしたほうが
いいのでしょうか?
またアンインストールした場合はOffice全体に悪影響などは
ないのでしょうか?
まったくそのへんわからないのでわかる方お願いします。

Aベストアンサー

一般的には、Office Picture Managerをアンインストールすることは問題ないはずですが、

> 画像の加工や共有ソフトなのらしいのですが、bmpの拡張子の画像をjpegの拡張子にする項目がPicture Managerを使うと変更できなくなってしまします

こちらの方が問題だと思います。

私は画像関係のソフトだけで、5種類以上のフリーソフトやおまけソフトをインストールしていますが、そのような他のソフトを排斥するようなソフトはまったくありません。(有料ソフトは1種類だけです。)

画像の保存形式を変更する機能は、ほとんどの画像ソフトで可能です。
他のソフトにない特別な機能を使われるのでなければ、そのソフトの使用をお止めになった方が無難だと思います。

QVBA Private Sub Worksheet_Calculate()

「ユーザー定義関数」で計算されるセルがセルB2にある場合、シートモジュールの
Private Sub Worksheet_Calculate()で、他の再計算は無視し、そのユーザー定義関数が計算されたことを判断するためにはどのような記述をすればいいのでしょうか?

Aベストアンサー

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application.Volatile
 Sheetname = Target.Parent.Name

 If OldName = "" Then
   OldName = Sheetname
 End If

 If OldName <> Sheetname Then
  MsgBox OldName & "が " & Sheetname & " に変更されました"
  OldName = Sheetname
  End If

End Function
---------------------------------------------

コードを書いたあと、Sheet1のA1に、=sheetname(A1) を入れておく


ようは、以前のシート名を保持しておき
ユーザー定義関数が再計算されるとき比較するだけです。

もちろん、Calculateイベントで同様のことをしてもOKですよね。

何回も言うようですが、このサンプルは、ユーザー定義関数の入っている、シート1つだけに対応です。

全てのシートに対応したい場合は、ちょっと考えてみてください。
以上です。
 

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報