【问题标题】:MS Access VBA change column to display from Value List to numberMS Access VBA 更改列以从值列表显示为数字
【发布时间】:2020-12-18 15:10:11
【问题描述】:

我在 MS Access 中有下表:

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

我的表格样本数据:

tblapp
app_id  app
1        NO
2        No
3        YES

我想将列 app 转换为显示数字

no = 1yes = 2

使用 vba

转换欲望表:

tblapp
app_id  app
1        1
2        1
3        2

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

还有其他解决方案吗?

【问题讨论】:

  • 这是一个很好的解决方案。来吧。
  • @Gustav 谢谢Gustav。我会去这个解决方案。我相信你的消息。
  • @Gustav 我可以用ALTER TABLE Statement重命名列吗?
  • 我不知道 - ALTER TABLE statement (Microsoft Access SQL)。因此,复制到临时字段,删除旧的,使用正确的数据类型重新创建它,从临时字段复制数据,删除临时字段。
  • @Gustav 我创建了以下答案。它工作正常。

标签: vba ms-access


【解决方案1】:

基于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

【讨论】:

    【解决方案2】:

    如果表非常大,您可能会发现根据所需的新列创建一个全新的表会更高效,您只需在其中通过适当的转换传输数据即可。您最有可能使用已保存的查询来执行此操作(从而避免对 VBA 的需要),或者,为来自 VBA 的查询运行 SQL。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多