Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Access 2013)
前後のデータを参照してNULLを埋める
投稿日時: 18/07/02 20:08:08
投稿者: TOM57

教えてください。
下記のように(@⇒A)空白を前のデータで埋めるVBAは作成できたのですが、
さらに後ろのデータが何なのか(空白は除く)によって処理をしたいのですが、
どのようにしたらいいでしょうか
 
前のデータが1 後ろのデータが1の場合は1それ以外は0で埋めたいのです(結果B)
クエリで作成しようと思って考えたのですが、8万件ありかなり処理が
遅くなるのでVBAで処理しようと思います。
よろしくお願いします。
 
@
ID    フラグ
1    1
2    
3    
4    1
5    
6    0
7    1
8    
9    1
10    
11    0
 
A
ID    フラグ
1    1
2    1
3    1
4    1
5    1
6    0
7    1
8    1
9    1
10    1
11    0
 
B
ID    フラグ
1    1
2    1
3    1
4    1
5    0
6    0
7    1
8    1
9    1
10    0
11    0
 
 
AVBA
Dim rs As DAO.RecordSet
Dim flg As String
 
Set rs = CurrentDB.OPenRecordSet("SELECT フラグ FROM テーブル1 ORDER BY ID")
 
DO until rs.EOF
 
If rs!フラグ <> "" Then
flg= rs!フラグ
Else
rs.Edit
rs!フラグ = flg
rs.Update
End If
 
rs.MoveNext
Loop

回答
投稿日時: 18/07/03 08:24:03
投稿者: よろずや

提示された処理の前に、最後から逆順に読んで、
0だったらflg=0、
""だったら、rs!フラグ=flg
1だったらflg=""
ってのを一発かましてやればよろしいかと。

回答
投稿日時: 18/07/03 09:56:18
投稿者: sk

引用:
空白を前のデータで埋める

引用:
後ろのデータが何なのか(空白は除く)によって処理をしたい

引用:
前のデータが1 後ろのデータが1の場合は1
それ以外は0で埋めたいのです

引用:
SELECT フラグ FROM テーブル1 ORDER BY ID

[テーブル1]の先頭のレコード(前のレコードが存在しない)、
または最後のレコード(後ろのレコードが存在しない)の
[フラグ]の値が Null(あるいは空文字列)である場合も
0 で埋めればよいのでしょうか。
 
引用:
ID フラグ

引用:
Dim flg As String

引用:
If rs!フラグ <> "" Then

また、[フラグ]のデータ型はテキスト型なのでしょうか。

投稿日時: 18/07/03 23:22:44
投稿者: TOM57

よろずやさん
 
ありがとうございます。
自分なりに考えて試したいと思います。
 
skさん
いつも質問の仕方が悪く申し訳ございません。
 

引用:

[テーブル1]の先頭のレコード(前のレコードが存在しない)、
または最後のレコード(後ろのレコードが存在しない)の
[フラグ]の値が Null(あるいは空文字列)である場合も
0 で埋めればよいのでしょうか。
 

 
上記の場合0でお願いします。
 
 
引用:

また、[フラグ]のデータ型はテキスト型なのでしょうか。
 

 
すいません。間違えておりました。
[フラグ]のデータ型は数値型でお願いします。

回答
投稿日時: 18/07/04 09:32:14
投稿者: sk

引用:
上記の場合0

引用:
[フラグ]のデータ型は数値型

(標準モジュール)
-------------------------------------------------------------------
Sub subReplaceNull()
On Error GoTo Err_subReplaceNull
     
    Dim ws As DAO.Workspace
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
     
    Dim strSQL As String
    Dim lngFlag As String
    Dim lngPreviousID As Long
    Dim lngPreviousFlag As String
    Dim lngNextID As Long
    Dim lngNextFlag As String
      
    Set ws = DBEngine.Workspaces(0)
    Set db = CurrentDb
       
    lngPreviousID = -1
    lngPreviousFlag = 0
      
    strSQL = "SELECT * FROM [テーブル1]" & _
            " WHERE [フラグ] IS NOT NULL" & _
            " ORDER BY [ID];"
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
           
    ws.BeginTrans
    On Error GoTo RollBack_subReplaceNull
 
    Do Until rs.EOF
        lngNextID = rs![ID]
        lngNextFlag = rs![フラグ]
        If (lngPreviousFlag = 1) And (lngNextFlag = 1) Then
            lngFlag = 1
        Else
            lngFlag = 0
        End If
        strSQL = "UPDATE [テーブル1]" & _
                 " SET [フラグ] = " & lngFlag & _
                 " WHERE [フラグ] IS NULL" & _
                 " AND ([ID] > " & lngPreviousID & ")" & _
                 " AND ([ID] < " & lngNextID & ");"
        Debug.Print strSQL
        db.Execute strSQL, dbFailOnError
        Debug.Print db.RecordsAffected & " 件のレコードを更新しました。"
        lngPreviousID = rs![ID]
        lngPreviousFlag = rs![フラグ]
        rs.MoveNext
    Loop
 
    strSQL = "UPDATE [テーブル1]" & _
             " SET [フラグ] = 0" & _
             " WHERE [フラグ] IS NULL" & _
             " AND ([ID] > " & lngPreviousID & ")"
    Debug.Print strSQL
    db.Execute strSQL, dbFailOnError
    Debug.Print db.RecordsAffected & " 件のレコードを更新しました。"
 
    ws.CommitTrans
    On Error GoTo Err_subReplaceNull
 
    MsgBox "レコードの更新処理が完了しました", vbInformation, "実行完了"
 
Exit_subReplaceNull:
On Error Resume Next
 
    Set rs = Nothing
    Set db = Nothing
    Set ws = Nothing
 
    Exit Sub
 
RollBack_subReplaceNull:
    ws.Rollback
     
Err_subReplaceNull:
    MsgBox Err.Number & ": " & Err.Description, _
           vbCritical, _
           "実行時エラー(subReplaceNull)"
    Resume Exit_subReplaceNull
End Sub
-------------------------------------------------------------------
 
以上のようなコードを実行なさればよろしいかと。

投稿日時: 18/07/08 23:10:29
投稿者: TOM57

skさん
 
ありがとうございます。
できました。
 
ただ私の勉強不足で理解できていないので、これから勉強します。
 
本当にありがとうございます