アプリ版:「スタンプのみでお礼する」機能のリリースについて

入力した値が不正というよりイベントが違いそうなので教えてください!

今までの質問等で社員管理システムの社員マスタサブフォームのコードに
以下を入力することはできました。

Private Sub 開始日_AfterUpdate()
On Error GoTo エラー処理
'値を削除した場合は何もしない
If IsNull(開始日) Then GoTo 終了処理
'『開始日』の前日の日付を『終了日』に設定
'(割り算扱いされるのを避けるため「#」で括る)
Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#"
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日"
Resume 終了処理
End Sub

Private Sub 終了日_AfterUpdate()
On Error GoTo エラー処理
'値を削除した場合は何もしない
If IsNull(終了日) Then GoTo 終了処理
'『終了日』の翌日の日付を『開始日』に設定
'(割り算扱いされるのを避けるため「#」で括る)
Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#"
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "終了日"
Resume 終了処理
End Sub

これで終了日に日付を入力すると
2113:このフィールドに入力した値が不正です。
となるのを直したいです。
開始日と終了日は共に
データ型 日付/時刻型
書式 yyyy/mm/dd
です。
このイベントを作成する前はエラーにならなかったので
入力した値が不正というよりイベントが違いそうなので教えてください!

A 回答 (7件)

No.4です。



> レコードを削除しても反映させた開始日だけが残ってしまいます!

字数制限に引っ掛かったこともあって、前回は説明不足だったかも
しれませんが(汗)、フォームの『削除後確認』イベント用のコードを
No.4の末尾に記載していますので、ご確認下さい。
(「Private Sub Form_AfterDelConfirm」のところです)


> どこの情報をお伝えすればいいか分からず申し訳ありません・・・

特に「2番目」の方は、私が今まで見たことのないエラーなので、何も
情報がないと、さすがに推測のしようがありません(汗)
(ある程度はWeb検索で見当のつけようもありますが:
 今回の動作確認は単独ユーザーで、同じテーブルを使用する別フォーム等も
 開いたりはしていませんよね?(汗))

まずはエラー表示のMsgBoxの標題を確認して、エラーの発生元を
特定して下さい。
(「MsgBox Err.Number & ":" & Err.Description, , Me.Name & " ~"」の
 「Me.Name & " ~"」の部分から、発生元のフォーム名と該当箇所が
 わかるようにしています: 場所ごとに「" ~"」の部分を変えていないと
 意味がありませんが(汗))

それが特定できたら、次は、そこの先頭の「On Error Goto エラー処理」
の行頭に「'」をつけて(→「'On Error ~」)、エラー処理を無効化(コメント
アウト)した後、エラーが発生したのと同じ処理を実行します。

これで、Access既定のエラーメッセージが表示されるはずです。
そこにある『デバッグ(D)』ボタンをクリックすると、VBAのエラー箇所が
黄色で示されますので、確認して下さい。
(位置の確認後は、VBEのメニューで「実行(R)→リセット(R)」を選択
 するか、ツールバーの『リセット』(青の四角)ボタンをクリックします)


なお、1番目のNull絡みのエラーで、可能性があるのは・・・当初は
予想していませんでしたが、「元の終了日がNull」、ですか(汗)
これについては「元の終了日」を確認している部分のコードを以下の
ように修正してもらえば、多分問題なくなるのではないかと思います:

【前回】(「修正前後で同日になる場合は~」のところ)
  LstDate = !終了日
  If LstDate = NewDate Then Goto 終了処理
【修正】
  LstDate = Nz(!終了日, 0)
  If LstDate = NewDate Then Goto 終了処理
※更新確認Msgでは「0:00:00」として表示されることになります。
  (どうしてもいやな場合は、MsgBoxの実行前にIfで分岐を入れて、
  適当にstrMsgを調整してください(汗))


それと、余談(?)になりますが、今回のご質問は、
  手入力したのが「【3】番目のレコードの『開始日』」だとすると、
  自動修正したいのは「【2】番目のレコードの『終了日』」
ということでよろしいでしょうか。
(どうも、piroin654さんは「【3】番目のレコードの『終了日』」を更新する
 回答をされているようなので、念のため確認が必要と感じた次第です)
「入力した値が不正というよりイベントが違い」の回答画像7
    • good
    • 0
この回答へのお礼

ありがとうございます!
no.4を参考に修正しまして規定値残存の回避はできました!

開始日の更新後処理の"on error ..."の部分を無効化すると、
'3426':
このアクションは、関連付けられたオブジェクトによってキャンセルされました。
というエラーに変わりました。
デバッグをクリックすると".Edit"が黄色で示されます。

"Lstdate=!終了日"の部分を修正しましたが
社員マスタサブフォーム開始日
94:Nullの使い方が不正です。
となります。

おっしゃるとおりで、
手入力したいのが(3)番目のレコードの開始日だとすると、
自動修正したいのは(2)番目のレコードです。

Nullの部分に関しては情報不足で申し訳ないです。
私なりに調べてみますので宜しくお願いします!

お礼日時:2010/08/30 17:13

Q開始日を以下に変更してみてください。


Q開始日のToggleLinkを[サブフォーム表示コントロール名]に
変更します。

[サブフォーム表示コントロール名]はメインフォームで
サブフォームを表示しているコントロール名です。
メインフォームのサブフォームを表示している
コントロールをの端で右クリックすると
プロパティが開かれるのでそこに名前が
入っています。たとえば、初期値は[埋め込み0]
というような名前ですが、あるいは変更している
ならばサブフォーム名がはいっているかも
しれません。



Q開始日

SELECT Max(Temp.終了日) AS 終了日の最大
FROM (SELECT 社員履歴TBL.社員ID, 社員履歴TBL.終了日
FROM 社員履歴TBL
WHERE (((社員履歴TBL.社員ID)=[Forms]![社員マスタFRM]![社員ID]) AND ((社員履歴TBL.終了

日)<[Forms]![社員マスタFRM]![サブフォーム表示コントロール名].Form![終了日]))) AS Temp;
    • good
    • 0
この回答へのお礼

ありがとうございます!

サブフォーム表示コントロールはありません・・・
説明不足で申し訳ありません。・・・
ToggleLinkをクリックすると社員マスタサブフォームが開きます。
社員マスタサブフォームという名前なので勘違いしてしまいました。
一般的に言うサブフォームではないと思います。
社員マスタサブフォームという別のフォームが開くという仕組みでした。
申し訳ありません!

お礼日時:2010/08/30 17:41

サブフォームを表示しているメインフォームの


コントロール名はToggleLinkのままですか。
そうでないならば補足してください。

ToggleLinkのままならば、以下のSQLを新規クエリの
SQLビューに貼り付け、そのままQ開始日
という名前で登録してください。

Q開始日

SELECT Max(Temp.終了日) AS 終了日の最大
FROM (SELECT 社員履歴TBL.社員ID, 社員履歴TBL.終了日
FROM 社員履歴TBL
WHERE (((社員履歴TBL.社員ID)=[Forms]![社員マスタFRM]![社員ID]) AND ((社員履歴TBL.終了

日)<[Forms]![社員マスタFRM]![ToggleLink].Form![終了日]))) AS Temp;


次に、

Private Sub 開始日_AfterUpdate()
On Error GoTo エラー処理
If IsNull(Me!開始日) Then GoTo 終了処理
Me!終了日.Value = DateAdd("d", -1, Me!開始日)
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日"
Resume 終了処理
End Sub

としているコードを以下にしてみてください。

Private Sub 開始日_AfterUpdate()
On Error GoTo エラー処理
If IsNull(Me!開始日) Then GoTo 終了処理
If Not IsNull(DLookup("終了日の最大", "Q開始日")) Then
Me!終了日.Value = DLookup("終了日の最大", "Q開始日")
Else
GoTo 終了処理
End If
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日"
Resume 終了処理
End Sub


まず、これで終了日が希望通りになっているか
確認してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます!

サブフォームを表示しているというより
サブフォームを開くイベントを持つコントロール名がToggleLinkです。
以下のようになっています。
名前:ToggleLink
標題:履 歴
クリック時:
Sub ToggleLink_Click()
On Error GoTo ToggleLink_Click_Err

Me![確定].Enabled = False

If ChildFormIsOpen() Then

CloseChildForm
Else
OpenChildForm
FilterChildForm
End If

ToggleLink_Click_Exit:
Exit Sub

ToggleLink_Click_Err:
MsgBox Error$
Resume ToggleLink_Click_Exit

End Sub

教えていただいたように変更すると以下のエラーになります。

2471:クエリ パラメータとして指定した式でエラー
‘このオブジェクトには、オートメーション オブジェクト
‘Forms!社員マスタFRM!ToggleLink!終了日’
は含まれません’が発生しました。

ToggleLinkの説明不足で申し訳ないですが宜しくお願いします!

お礼日時:2010/08/19 15:16

以前の回答者です。


大変時間が掛かりましたが(汗)、ようやく解決策の目途がついたので・・・
http://oshiete.goo.ne.jp/qa/6038188.html

Private Sub 開始日_AfterUpdate()
On Error GoTo エラー処理

  Dim LstDate As Date, NewDate As Date, strMsg As String

  '値削除/先頭時は何もしない
  If IsNull(開始日) Or (Me.CurrentRecord = 1) Then GoTo 終了処理

  '1日前の日付を算出
   NewDate = DateAdd("d", -1, 開始日)

  'レコードセット上で、前履歴を確認・修正
  With Me.RecordsetClone
    '前履歴に移動
    If Me.NewRecord Then .MoveLast Else .Move -1, Me.Bookmark

    '修正前後で同日になる場合は何もしない
    LstDate = !終了日
    If LstDate = NewDate Then GoTo 終了処理
    
    '更新可否を入力者に確認
    strMsg = "前勤務先の終了日を、以下の通り変更しますか:" & vbCrLf _
        & "変更前 = " & LstDate & vbCrLf & "変更後 = " & NewDate
    If MsgBox(strMsg, vbYesNo) = vbYes Then
      .Edit
      !終了日 = NewDate
      .Update
      終了日.Requery   '更新結果をフォームに反映
    End If
  End With

終了処理:
  Exit Sub

エラー処理:
  MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 開始日"
  Resume 終了処理

End Sub

Private Sub 終了日_AfterUpdate()
On Error GoTo エラー処理

  Dim FstDate As Date, NewDate As Date, strMsg As String

  If IsNull(終了日) Then GoTo 終了処理
  NewDate = DateAdd("d", 1, 終了日)
  With Me.RecordsetClone    
    If Me.NewRecord Or (Me.CurrentRecord = .RecordCount) Then
      '新規/末尾レコード時は既定値で対処
      開始日.DefaultValue = "#" & NewDate & "#"
    Else
      '上記以外の場合は、次レコードに移動してそれを編集
      .Move 1, Me.Bookmark
      FstDate = !開始日
      If FstDate = NewDate Then GoTo 終了処理
      strMsg = "次勤務先の開始日を、以下の通り変更しますか:" & vbCrLf _
          & "変更前 = " & FstDate & vbCrLf & "変更後 = " & NewDate
      If MsgBox(strMsg, vbYesNo) = vbYes Then
        .Edit
        !開始日 = NewDate
        .Update
        開始日.Requery
      End If
    End If
  End With

終了処理:
   Exit Sub

エラー処理:
   MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 開始日"
   Resume 終了処理

End Sub

'削除後の既定値残存の回避(前回質問の「三つ目」)
Private Sub Form_AfterDelConfirm(Status As Integer)
  'レコードを実際に削除した場合のみ、既定値を解除
  If Status = acDeleteOK Then 開始日.DefaultValue = ""
End Sub


・・・以上です。
「入力した値が不正というよりイベントが違い」の回答画像4
    • good
    • 0
この回答へのお礼

ありがとうございます!

教えていただいたように修正しました!
うまくいかないので申し訳ありませんがご指導お願いします!

一つ目が、
所属コードを先に設定し、終了日に規定値"9999/12/31"が入った状態で
前履歴の終了日を規定値から実際の日付に変更すると
94:Null の使い方が不正です。
となります。

二つ目が
開始日を入力して前履歴の終了日に反映させたい時、
更新可否を入力者に確認するところまではうまくいきます!
そこで"はい(Y)"を選択すると

3426:このアクションは、関連付けられたオブジェクトによって
キャンセルされました。

となります。

最後に
レコードを削除しても反映させた開始日だけが残ってしまいます!

二つ目などはもともとある何かが邪魔していそうなのですが、
どこの情報をお伝えすればいいか分からず申し訳ありません・・・
宜しくお願い致します!

お礼日時:2010/08/19 17:32

それと、#はいらないのでは、



>Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#"
Me!終了日.Value = DateAdd("d", -1, Me!開始日)

>Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#"
Me!開始日.Value = DateAdd("d", 1, Me!終了日)
    • good
    • 0
この回答へのお礼

ありがとうございます!
以下のように修正したのでエラーはでなくなりました!
また、変えたい部分がでてきたので、
宜しくお願いします。
下記のコードだと同じレコード内でのイベントになるので
開始日の前日を終了日に代入する時は
一つ前のレコードの終了日にしたいです。
同様に終了日の翌日を開始日に代入する時は
次のレコードにしたいです。
宜しくお願いします!!

Private Sub 開始日_AfterUpdate()
On Error GoTo エラー処理
If IsNull(Me!開始日) Then GoTo 終了処理
Me!終了日.Value = DateAdd("d", -1, Me!開始日)
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "開始日"
Resume 終了処理
End Sub

Private Sub 終了日_AfterUpdate()
On Error GoTo エラー処理
If IsNull(Me!終了日) Then GoTo 終了処理
Me!開始日.Value = DateAdd("d", 1, Me!終了日)
終了処理:
Exit Sub
エラー処理:
MsgBox Err.Number & ":" & Err.Description, , Me.Name & "終了日"
Resume 終了処理
End Sub

お礼日時:2010/08/05 16:34

もう二点、



>Me!終了日.Value = "#" & DateAdd("d", -1, 開始日) & "#"
Me!終了日.Value = "#" & DateAdd("d", -1, Me!開始日) & "#"

>Me!開始日.Value = "#" & DateAdd("d", 1, 終了日) & "#"
Me!開始日.Value = "#" & DateAdd("d", 1, Me!終了日) & "#"

変更してみてください。
    • good
    • 0

二点ほど変更してみてください。



(1)
Private Sub 開始日_AfterUpdate()
のところで、
>If IsNull(開始日) Then GoTo 終了処理



If IsNull(Me!開始日) Then GoTo 終了処理


(2)
Private Sub 終了日_AfterUpdate()
のところで、
>If IsNull(終了日) Then GoTo 終了処理



If IsNull(Me!終了日) Then GoTo 終了処理
    • good
    • 0

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