VBA処理がうまくいかない

このQ&Aのポイント
  • VBAを使用した処理が正しく動作しない問題が発生しています。請求年月と物件CDを指定して請求データの更新を行う処理ですが、同じ条件での処理が重複してしまい、正しくデータが保存されません。どの部分を修正すれば良いでしょうか?
  • VBAの処理で問題が発生しています。請求年月と物件CDを指定して請求データの更新を行う処理ですが、同じ条件での処理が重複してしまい、データが正しく保存されません。修正が必要な部分はどこでしょうか?助言をお願いします。
  • VBAを使用した処理で問題が発生しています。請求年月と物件CDを指定して請求データの更新を行う処理ですが、同じ条件での処理が2度行われてしまいます。どの部分を修正すれば良いでしょうか?アドバイスをお願いします。
回答を見る
  • ベストアンサー

access VBA処理がうまくいかない

お世話になります。 T_請求に追加する追加クエリQ_家賃請求Tがあります。 どの物件を更新するかをチェックボックスで指定し、追加クエリの抽出条件にしています。 月に1度のみの操作ですが、数人でこのデータベースを触り、 何度も追加されると困るので2度目以降はエラー処理をさせたいと思っています。 Private Sub 更新_Click() Dim ret As Integer ret = MsgBox("チェック物件を請求更新します。" & vbCrLf & "よろしいですか?", _ vbYesNo + vbQuestion, "請求月次更新") If ret = vbYes Then If DCount("[契約者CD]", "[T_請求]", "[物件CD] = " & Me!物件CD & _ " AND [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") _ <> 0 Then MsgBox "すでに指定物件の請求は更新されています" & vbCrLf & _ "同じ月に請求を2度更新できません" Else DoCmd.SetWarnings False DoCmd.OpenQuery "Q_家賃請求用T" MsgBox "更新されました" DoCmd.SetWarnings True End If Else If MsgBox("処理を中止しました", vbOKOnly + vbDefaultButton1 + vbExclamation) = vbOK Then Me.Undo Cancel = True End If End If End Sub 以上のようなコードを書きました。 処理が正しくできているか確認のために、動作を調べたのですが、 まったく同じ請求年月で同じ物件CDのものが保存先のテーブルに処理されてしまいます。 どの部分を直せばいいのでしょうか? 足りない情報があれば提示しますので、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

>T_入居者情報のフィールド、そのほかに処理日と請求年月を演算で入力するしくみです。 そのクエリで請求年月にはどういう値が入るのかをしらべ、その値が入った場合、 ・・・[T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 0) & "#") > 0 となることを検証してください。

komerice
質問者

お礼

よーーーく見てみたらものすごく初歩的なところでつまづいていたことがわかりました。 [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") <> 0 ではなく [T_請求]![請求年月] = #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") <> 0 でした・・・お恥ずかしい限りです。 お付き合いくださりありがとうございました。

その他の回答 (2)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

クエリで請求年月に翌月1日を入れているなら、 [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#" >を>=にするとか、 dateserial の日付を0にするか、、、 ってことかな? Q_家賃請求用Tで何してんのかわかんないから、合っているかどうかわかんないけど。

komerice
質問者

補足

度々ありがとうございますm()m >クエリで請求年月に翌月1日を入れているなら、 おっしゃる通り、Q_家賃請求用Tでは演算フィールド[請求年月]が存在し、 式には DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) が入っています。 詳細の説明不足で申し訳ありません。 Q_家賃請求用Tの補足をさせていただきますと、 T_入居者情報 契約者CD/契約者名/物件CD/家賃/共益費/・・・ このテーブルの内容をT_請求へコピー(追加)するというクエリです。 T_入居者情報のフィールド、そのほかに処理日と請求年月を演算で入力するしくみです。 私の考えでは、クリックイベントを発生させるF_請求物件選択というフォームの チェックボックスがTrueの物件CD(クエリで抽出条件に指定しています)が T_請求にすでにある、かつ請求年月がダブっていれば追加クエリを実行しない ということができればと思っています。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

Q_家賃請求用T で更新される[請求年月]は処理日の翌月の一日以降なんですか? >DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) とはそういうこと。 処理日の月なら、+1はいらない。

komerice
質問者

補足

早速の回答ありがとうございます! 請求年月ですが、家賃は前払いですので処理日の翌月分です。 例えば今月ですと、8/25に締めて今月末に9月分の家賃を請求します。 請求日というのはあまり必要ないので毎月1日にあわせています。 いかがでしょうか・・・?

関連するQ&A

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • アクセスの印刷VBAを教えて下さい

    アクセス初心者です。 バージョンは2002を使っています。 ネットで探して詳しく分からないままプログラムしています。 フォームで印刷のコマンドボタンを作ってそのボタンをクリックすると表示されてる 1ページのみ印刷したいのですが全てのレコードが印刷されてしまいます。 どうすればいいのか教えて下さい。 下記が今現在のVBAです。 Private Sub 印刷_Click() Dim varCopies As Variant varCopies = InputBox("部数を数字で入力してください", "印刷部数の指定") If Len(varCopies) = 0 Then Exit Sub End If If IsNumeric(varCopies) = False Then MsgBox "部数は数字で入力してください", vbOKOnly + vbCritical, "入力エラー" Exit Sub ElseIf CLng(varCopies) = 0 Then MsgBox "部数は0以上で入力してください", vbOKOnly + vbCritical, "入力エラー" Exit Sub End If If MsgBox("印刷しますか?" & vbCrLf & "部数=" & varCopies _ , vbYesNo + vbInformation, "印刷の確認") = vbYes Then DoCmd.OpenForm "伝票", acPreview, , , acFormReadOnly DoCmd.PrintOut acPrintAll, , , , CLng(varCopies) DoCmd.Close acForm, "伝票" End If End Sub

  • アクセスで複数データ削除

    myPath = "D:\" myfilename = Dir(TxB04) Do Until myfilename = "" DoCmd.TransferText acImportDelim, , "tbl1", myPath & myfilename, False myfilename = Dir Loop MsgBox "取込が正常に終了しました。" MsgBox "二重打刻をチェックしてます。" '取込ファイル名を変換します。 DoCmd.SetWarnings False DoCmd.OpenQuery "データ変換" DoCmd.OpenQuery "実績追加" DoCmd.OpenQuery "重複データ削除" DoCmd.OpenQuery "削除クエリ" DoCmd.SetWarnings True Cmd21.Enabled = False ★Kill (strInFPath)★ 'メッセージマスタ取得 Sqlstate2 = "SELECT * FROM 氏名登録なし;" Set M_MSG2 = MyDB2.OpenRecordset(Sqlstate2, dbOpenSnapshot) If M_MSG2.RecordCount > 0 Then DoCmd.SetWarnings False DoCmd.OpenQuery "くえり1" DoCmd.SetWarnings True End If Exit Sub Err_Set_Seisan_Click: End Sub 今、vbでこのようなデータ取込を作っており★のところで取込データを削除させてます。 ただこれだと1つのデータしか削除できず、複数あったときには対応が困ってます。 こちら歯どのような対応でできるでしょうか? ご指導お願いします。

  • 自動バックアップ

    If MsgBox("保存を開始しますか?", vbOKCancel) = vbOK Then DoCmd.SetWarnings False DoCmd.OutputTo acOutputQuery, "勤務状況一覧表", acFormatXLS, "C:\buckup\勤務状況一覧表.xls", flese DoCmd.SetWarnings True MsgBox "保存が終了しました。" End If このような感じで自動バックアップをさせてるのですが「勤怠状況一覧表」 のあとに日付を追加したいのです。 いろいろやってみてるのですがここの入力は完全なパスと書いてあり、無理なのかなぁと分からなくなってきております。 何か方法等知ってる方、教えていただけませんでしょうか?

  • ACCESS VBA でのCSV取込エラー

    ACCESS VBA でのCSV取込エラー ACCESSにてフォルダ内にあるCSVファイルをすべてインポートしようとしています。 インポート定義を作成して、下記のコードを書いてみましたが、 データはすべてインポートされるのですが、 カンマが無視され、フィールドとフィールドの中間で途切れてデータが格納されてしまいます。 またフィールド4は日付形式なのですがこれがインポートエラーになります。 フィールド1 フィールド2 フィールド3 フィールド4 aaa aa,bbb bbb,ccc  エラー 2日間ほどネットサーフィンをして調べたのですが、 回避方法が見つからなかったので、お知恵を拝借できますでしょうか? よろしくお願いいたします。 Private Sub cmd06_Click() Dim MyFile As String Dim MyName As String Dim strFolderName As String DoCmd.SetWarnings False DoCmd.OpenQuery "Q09_全CSVデータ削除" DoCmd.SetWarnings True strFolderName = GetFolderName() 'フォルダ選択ダイアログを表示 If Len(strFolderName) > 0 Then '選択結果を評価 MyFile = strFolderName & "\*.csv" '【拡張子csvのファイルのみ取得】 MyName = Dir(MyFile, vbNormal) Do While MyName <> "" If MyName <> "." And MyName <> ".." Then If GetAttr(strFolderName & "\" & MyName) <> vbDirectory Then DoCmd.TransferText acImportFixed, "インポート定義", "T03_全CSVデータ", strFolderName & "\" & MyName, False, "" '【取得したファイルをインポート】 End If End If MyName = Dir Loop Else MsgBox "フォルダは選択されませんでした" End If MsgBox "データのインポートが終了しました" End Sub

  • VBAで時間による処理判定

    こんにちは。 エクセルVBAにて次のようなプログラムを作成しておりますが思考のループに入ってしまった為御助力をお願いします。 メインルーチンをキーボード「↑」が押されるまでループする。 その中で処理Aを1秒間隔、処理Bを5秒間隔、処理Cを30秒間隔に実行させる。 ※今回はサンプルコードの為DEBUG.PRINTを実行させる。 現状ループの中にApiSleepを入れ1/1000で制御しています。 処理を実行させると若干もたつきが感じられます。 正確な時間計測は必要としていませんのでシステム日付程度の精度を求めています。 方法は幾つかあると思いますがご協力をお願いします。 以下サンプルコード Public Type TestType   XTime As Integer   XBack As Integer End Type Sub Sample()   Dim KeyChk As Integer   'Dim ThisTime As Integer   Dim Ret1 As TestType   Dim Ret2 As TestType   Dim Ret3 As TestType   KeyChk = 0   With Ret1     .XTime = 1     .XBack = .XTime   End With   With Ret2     .XTime = 5     .XBack = .XTime   End With   With Ret3     .XTime = 30     .XBack = .XTime   End With   Do     KeyChk = GetAsyncKeyState(VK_UP)     Sleep (1000)     'ThisTime = ((Hour(Time) * 60) + Minute(Time) * 60) + Second(Time)     With Ret1       If .XTime = 0 Then         Debug.Print "処理A実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With     With Ret2       If .XTime = 0 Then         Debug.Print "処理B実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With     With Ret3       If .XTime = 0 Then         Debug.Print "処理C実行"         .XTime = .XBack       Else         .XTime = .XTime - 1       End If     End With   Loop While KeyChk = 0   MsgBox ("終了") End Sub API宣言及び仮想キー宣言は省略

  • VBAで同名ファイルの有無を確認させる方法は?

    AccessにてCSVファイルをインポートしたあと、所定の場所にインポート済みファイルを移動させる処理をさせています。 インポート済みのファイルと同じ名前のファイル(このファイルはyyyymmdd.csvと日付を基にしたファイル名称になっています)を取り込もうとしたときに、メッセージボックスを表示させて処理を続行するかどうか問わせたいと考えています。 下記のようにVBAを記述してみたのですが、メッセージボックスは表示されず、インポート処理されてしまいます。 If strFile = strImportedFile Then という、条件がまずいのではないかと思っているのですが、目的に適した記述が思いつきません。 どのような記述がふさわしいでしょうか? ~~~現在の記述~~~ Dim strFile As String Dim strPath As String Dim strImportedFile As String strPath = CurrentProject.Path & "\インポート\" strFile = Dir(strPath & "*.csv") strImportedFile = strPath & "インポート済\" & strFile If strFile = strImportedFile Then MsgBox "すでに処理済の日付のファイルです。" & (Chr(13) & Chr(10)) & "続けますか?", vbOKCancel Exit Sub Else Kill strImportedFile End If DoCmd.SetWarnings False '受け皿になるテーブルをクリアーしてインポート If strFile <> "" Then DoCmd.RunSQL "DELETE * FROM tbl_import" DoCmd.TransferText acImportDelim, "インポート定義", "tbl_import", strPath & strFile, True Name strPath & strFile As strPath & "インポート済\" & strFile End If DoCmd.SetWarnings True '取り込むべき売上ファイルがない場合のためのアラート表示 If strFile = "" Then MsgBox "CSVファイルがありません。" & (Chr(13) & Chr(10)) & "処理を中止します", vbOKOnly Else Exit Sub End If End Sub

  • access2000で使用者を履歴に残したい。

    履歴を取るのに「更新者=使用者」これは、currentuserですよね! 「テーブル全体を履歴に残す」バージョンでテーブルの更新者の規定値にcurrentuser()と入れればできる!と思ったのですが、テーブルではその式は利用できませんでした。モジュールに何か書き込まないとできないのでしょうか? 現在のモジュールは以下の通りです。 Sub History_a() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Ctr.ControlType = 109 Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into あ履歴 select * FROM あ " & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

  • Access2000 VBA - 変更の履歴が取れません

    下記コードで、If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Thenの行で「指定した式には値がありません」というエラーが出てしまいます。 他のQ&Aで見つけた成功例のほぼコピペなのですが・・・・ どこが悪いのか、ご教示頂けないでしょうか? よろしくお願い致します。 __________________________________________________________________________________________ Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then strSQL = "insert into 履歴 values('currentuser'," & Ctr.Value & _ ",'" & Ctr.Name & "','" & Ctr.OldValue & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If Next Ctr End Sub

  • アクセスVBA 追加クエリ

    下記クエリが一つあります。 [Q_商品] ID 商品名 価格 色 サイズ 重さ 送料 備考 [Q_商品]から、[T_テスト]をテーブルの作成から作りました。 [T_テスト]は、毎回利用する時に、すべてデリートして、[Q_商品]のデータを追加したいです。 [T_テスト]のデータの、すべてデリートは下記VBAでできました。 Private Sub コマンド40_Click() 'システムメッセージの非表示 DoCmd.SetWarnings False DoCmd.RunSQL "DELETE FROM T_テスト" 'システムメッセージの表示 DoCmd.SetWarnings True End Sub [Q_商品]のデータを追加するVBAを教えて下さい。 よろしくお願い致します。

専門家に質問してみよう