我正在尝试运行一个脚本,用MS Access 2007中的常量值替换表中的所有空值。我完全知道这可以使用更新查询来完成。但是我需要在一次点击中为所有列执行此操作。我认为find / replace可以做到这一点,但我仍然宁愿最小化这个过程中的任何手动工作。
我尝试使用此代码但是当我尝试运行它时,它只是没有做任何事情。它甚至不会触发错误。
Sub replacingnulls()
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("testtable", dbOpenTable)
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst
Do Until rs.EOF = True
rs.Edit
For Each fld In rs.Fields
If IsNull(fld.Value) Then
fld.Value = 555
End If
Next fld
rs.MoveNext
Loop
Else
MsgBox ("There are no records")
End If
rs.Close
End Sub
答案 0 :(得分:3)
调用rs.Update
保存您对当前记录所做的更改,然后再转到下一条记录。
Next fld
rs.Update ' <-- add this
rs.MoveNext
您可以在每个字段中执行一个UPDATE
,而不是循环遍历表行,然后遍历每行中的每个字段。
Const cstrTable As String = "testtable"
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tdf As DAO.TableDef
Dim strUpdate As String
Set db = CurrentDb
Set tdf = db.TableDefs(cstrTable)
For Each fld In tdf.Fields
' Access will complain if you attempt an UPDATE on an autonumber field,
' so skip field with dbAutoIncrField attribute
If Not ((fld.Attributes And dbAutoIncrField) = dbAutoIncrField) Then
strUpdate = "UPDATE [" & cstrTable & "] SET [" & fld.Name & _
"] = 555 WHERE [" & fld.Name & "] Is Null;"
'Debug.Print strUpdate
db.Execute strUpdate, dbFailOnError
End If
Next
请注意,无论字段的数据类型如何,代码都会尝试用555替换所有Null。如果所有字段都是普通数字,那可能没问题。但是,具有Null的日期/时间字段将变为 Jul 8 1901 00:00:00 。 OTOH,你的记录集方法会做同样的事情......所以如果它在那里也没关系,那么它也应该没问题。