電子書籍の厳選無料作品が豊富!

こんにちは。
アクセスで教えていただきたいのですが、顧客からの受領データを基に当方で入力をするのですが、その際、受領データを一部変更することがあります。そこで、データを変更した場合、backcolorを変更するなど、変更したことが分かるようにしたいのですが、何か方法はないでしょうか。ダーティ時のバックカラーの変更でやってみたのですが、全てのレコードのプロパティが変更になってしまいました。データを変更したレコードのみ変更したいのですが。
よろしくお願いします。

A 回答 (3件)

#1です



では、次に簡単な方法になります。

条件付き書式を使うことには変わりはありません。


処理で各テキストボックスの Tag を使用します。
この Tag には格納できる文字数に制限があるので注意してください。

連結して表示しているテキストボックスの名前が以下であると仮定します。

"an","日付", "品番ID", "設備ID", "売上", "生産数"

そのレコードを一意に特定できるものが "an" であるとします。
(確認した時の an はオートナンバー)

各テキストボックスの Tag には、変更があった時の an を格納していきます。

an = 1 の "日付" に変更があったら、テキストボックス "日付" の Tag に ,1 を、
さらに an = 2 の "日付" に変更があったら、,1,2 の様に追加していきます。

で、この "日付" の条件付き書式には、
[日付].[OldValue]<>[日付] Or InStr([日付].[Tag] & ",","," & [an] & ",")>0

前回の条件に、Or InStr([日付].[Tag] & ",","," & [an] & ",")>0 を追加しています。

Tag が、,1,2 だったら、,1,2, に加工して、[an] を , , で囲んだパターンがあるか、で判別します。

この Tag を作成するのは、フォームの「更新前処理」で行います。

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Dim vFld As Variant
  Dim vTmp As Variant
  Const FIXAN As String = "an"

  If (Not Me.NewRecord) Then
    vFld = Array("日付", "品番ID", "設備ID", "売上", "生産数")
    For Each vTmp In vFld
      With Me(vTmp)
        If (.Value <> .OldValue) Then
          .Tag = .Tag & "," & Me(FIXAN)
        End If
      End With
    Next
  End If
End Sub


今回の例では、一意のものがオートナンバーなので、新規登録の更新前処理で確定していない(?)ため処理から外してます。
新規登録時も色付けするのなら、更新後処理と連携して作る必要があります。
(更新前処理では新規であるか Me.NewRecord で判別できますが、更新後処理ではできなかったか、と)


Tag の文字数制限に引っ掛かるのなら、
"日付", "品番ID", "設備ID", "売上", "生産数" らの影武者をヘッダーに配置して
Tag 部分の処理を、その影武者に設定すればよいと思います。
もちろん、非表示にしておききます。
影武者の名前先頭に「tk」を付けたとすると

.Tag = .Tag & "," & Me(FIXAN)

Me("tk" & vTmp) = Me("tk" & vTmp) & "," & Me(FIXAN)

Or InStr([日付].[Tag] & ",","," & [an] & ",")>0

Or InStr([tk日付] & ",","," & [an] & ",")>0

で大丈夫と思います。

Tag では確認しましたが、影武者では未検証


一度変更し、確定させ、さらに1つ前に戻しても色は付いたままになります。
(これは変更が2回行われたものになるので)
( ,1 は、,1,1 になりますが判別には影響ありません:文字数の制限に・・・)

※必要であれば、読み込み時等で Tag 部分を初期化します。

使える方法かは、判断してください。
    • good
    • 0
この回答へのお礼

30246kiku様
非常に丁寧なご回答有難うございました。
サンプルを試してみましたが、非常に良い感じです。
私はVBA初心者なのでこの内容を自身のDBに上手く投影できるかどうか不安ですがなんとかチャレンジしてみます。
私は教えて!gooを初めて投稿したのですが、このように非常に早く丁寧なご回答を戴き誠に感謝しております。

お礼日時:2009/12/09 23:51

#2です



> "日付", "品番ID", "設備ID", "売上", "生産数" らの影武者をヘッダーに配置して

表現が適切ではなかったと思います。

それぞれに対応させる非連結のテキストボックスをヘッダーに配置して
"tk日付", "tk品番ID", "tk設備ID", "tk売上", "tk生産数" の様に名前付けする
ということです。

いまだにこの方法は未検証です。
(多分、大丈夫かと)
    • good
    • 0

> データを変更したレコードのみ変更したいのですが



レコードが更新確定された時には、色は消えてもいいのでしょうか。
(その方が簡単なのですが)

項目を変更している部分だけ色を付けて、確定後は色が消えるということで、

以下例)

条件付き書式を使用します。
1つのテキストボックスのみの例としますので、他にあれば同様な設定をしてください。

連結したテキストボックス名を「txt日付」、そのコントロールソースは「日付」と仮定します。

デザイン画面で、テキストボックス「txt日付」をクリック後、条件付き書式を、
条件部分を「式」として、 [txt日付].[OldValue]<>[txt日付] を記述後、背景色を選びます。
で、OK ボタン。

ここの条件付き書式の設定を必要数分行います。
(それぞれのテキストボックス名に置き換えながら)

最後に、フォームの「更新後処理」で、フォームを再計算させます。
Private Sub Form_AfterUpdate()
  Me.Recalc
End Sub

これで、修正したら色が付きます。確定したら色は消えます。
なお、新規登録時には色は付きません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
実行して上手くいきましたが、更新確定すると色は消えてしまいますね。
出来れば、ずっとこの状態を保っておきたいのですが難しいでしょうか?

お礼日時:2009/12/08 22:14

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

関連するカテゴリからQ&Aを探す