1

我有一个 MS Access (.accdb) 表,其中包含如下数据:

Location Number
-------- ------
ABC      1
DEF      1
DEF      2
GHI      1
ABC      2
ABC      3

每次我将数据附加到表中时,我都希望该数字对于该位置是唯一的。我正在通过 MS Excel VBA 访问此表 - 我想创建一个新记录(我在代码中指定位置)并创建一个唯一的序列号。有没有办法设置表格,以便在添加记录时自动发生这种情况?我是否应该编写一些描述的查询并确定每个位置的下一个编号,然后在创建记录时同时指定位置和编号?

我写信给下表:

    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseServer
    rst.Open Source:="Articles", _
         ActiveConnection:=cnn, _
         CursorType:=adOpenDynamic, _
         LockType:=adLockOptimistic, _
         Options:=adCmdTable
    rst.AddNew
    rst("Location") = fLabel.Location 'fLabel is an object contained within a collection called manifest
    rst("Number") = 'Determine Unique number per location
    rst.Update

任何帮助,将不胜感激。

编辑 - 添加了我正在努力解决的 VBA 代码,因为问题被搁置了

4

3 回答 3

0

对于 Access 2010 及更高版本,这是一种更好的方法。它使用表的Before Change数据宏推导出下一个序列号并将其放入新记录的 [Number] 字段中:

更改前.png

这种方法的优点是:

  • 每当添加新记录时,将应用序列号,无论它是如何添加的。
  • Excel VBA 代码不必担心创建序列号;它“刚刚发生”。
  • 由于此代码位于表级别,因此对于多用户环境应该是安全的。

有关数据宏的更多信息,请参阅

创建数据宏

于 2013-11-05T09:32:30.773 回答
0

您需要在数据类型表中添加一个新列AutoNumber

office.microsoft.com:在 Access 中自动生成数字的字段

您可能还应该将此列设置为主键。

于 2013-11-04T05:40:55.587 回答
0

我怀疑你正在寻找这样的东西:

Dim con As ADODB.Connection, cmd As ADODB.Command, rst As ADODB.Recordset
Dim newNum As Variant

Const fLabel_Location = "O'Hare"  ' test data

Set con = New ADODB.Connection
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb;"

Set cmd = New ADODB.Command
cmd.ActiveConnection = con
cmd.CommandText = "SELECT MAX(Number) AS maxNum FROM Articles WHERE Location = ?"
cmd.CreateParameter "?", adVarWChar, adParamInput, 255
cmd.Parameters(0).Value = fLabel_Location
Set rst = cmd.Execute
newNum = IIf(IsNull(rst("maxNum").Value), 0, rst("maxNum").Value) + 1
rst.Close

rst.Open "Articles", con, adOpenDynamic, adLockOptimistic, adCmdTable
rst.AddNew
rst("Location").Value = fLabel_Location
rst("Number").Value = newNum
rst.Update
rst.Close
Set rst = Nothing
Set cmd = Nothing
con.Close
Set con = Nothing

但是请注意,此代码不是多用户安全的。如果有多个用户同时运行此代码的可能性,那么您可能会得到重复的 [Number] 值。

(要使代码对多用户安全,您需要在 ([Location], [Number]) 上创建一个唯一索引,并添加一些错误捕获以防rst.Update失败。)

编辑

对于 Access 2010 及更高版本,请考虑使用事件驱动的数据宏,并在我对此问题的其他答案中显示。

于 2013-11-05T12:58:39.930 回答