MS Access VBA将列从"值列表"更改为"数字"



我在MS Access中有下表:

  • app_id=PK,自动递增
  • app=数字,显示为值列表(否,是(

我的表格样本数据:

tblapp
app_id  app
1        NO
2        No
3        YES

我想将列app转换为显示编号

CCD_ 2和CCD_ 3

使用vba

转换愿望表:

tblapp
app_id  app
1        1
2        1
3        2

一种解决方案是创建一个新列,复制数据。然后删除旧列,并将新名称重命名为旧名称。

还有其他解决方案吗?

基于Gustav注释,我提出了以下解决方案。

VBA代码:

Private Sub btn_Click()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sql As String
Set dbs = CurrentDb
' Add temp column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN temp_app NUMBER;"
' Add-update data to temp column.
Set rst = dbs.OpenRecordset("SELECT app_id, IIF(app="NO", 1, 2) AS temp_app FROM tblapp;", dbOpenDynaset)
With rst
Do Until .EOF
sql = "UPDATE [tblapp] SET [temp_app] = '" & rst!temp_app & "' WHERE [app_id] = " & rst!app_id & " ;"
dbs.Execute (sql)
.MoveNext
Loop
End With
' Delete app column(old).
dbs.Execute "ALTER TABLE tblapp DROP app;"
' Add new app column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN app NUMBER;"
' Copy data from temp to app column.
dbs.Execute "UPDATE tblapp Set app = temp_app;"
' Delete temp column.
dbs.Execute "ALTER TABLE tblapp DROP temp_app;"
rst.Close
dbs.Close
End Sub

如果表非常大,您可能会发现根据所需的新列创建一个全新的表更快速高效,只需通过适当的转换即可跨表传输数据。您可以通过保存的查询(从而避免对VBA的需要(来完成这一切,或者,从VBA为查询运行SQL。

它可能更高效的原因是,表数据可能是连续存储在磁盘上的,因此添加新列并不是简单地将新数据添加到连续区域的末尾,而是为新列的每行值每n个字节添加一个新空间。这可能会导致对磁盘空间进行大量的重新组织工作。如果您采用上述替代方法,它可能会暂时占用更多空间(因为您必须创建第二个表(,但总体而言可能会快得多。

最新更新