微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用VBA在Access表中查找值而没有唯一标识符的情况

如何解决使用VBA在Access表中查找值而没有唯一标识符的情况

我有一张这样的桌子:

+-----------+------+
| TableName | Flag |  
+-----------+------+
| TableG    |    0 |  
| TableE    |    0 |  
| TableR    |    1 |  
| TableL    |    1 |  
| TableN    |    0 |  

我想做的是有一个函数来查找Flag = 1的每个TableName,以便我可以将Flag = 1的每个表分配给表单中的按钮(例如,将第一个实例分配给Button1等) )。棘手的是该表无法编辑,因此无法分配唯一的ID /计数来轻松地抓取项目。

这是我到目前为止尝试过的:

  • DLookup无法处理具有多个查找匹配项(例如DLookup(“ TableName”,“ MyTable”,“ Flag = 1”)不允许我访问Flag = 1的所有值),所以我认为我可以用它来将它们存储在数组中
  • 我尝试使用RecordSet(请参见下文),但是我无法弄清楚如何使sql字符串自动添加计数,以便可以引用每个表名(例如TableNameRS(1)来拉取名称)带有Flag = 1的第一个表)
    Public Function TableNameRS(TableID As Integer)
     Dim RS As DAO.Recordset
     Dim sql As String
     Dim Name As Variant
     sql = "select TableName,COUNT(TableName) from MyTable where Flag=1"
     Set RS = CurrentDb.OpenRecordset(sql)
     Name = RS("TableName")
     TableNameRS = Name
     RS.Close
    End Function

我没主意-我在这里有什么选择?

解决方法

如果记录和按钮的数量是固定的,例如10,并且按钮的名称类似btn1,btn2等,请考虑以下过程:

Public Sub TableNameRS(TableID As Integer)
    Dim RS As DAO.Recordset
    Set RS = CurrentDb.OpenRecordset("SELECT TableName FROM MyTable WHERE Flag=1 ORDER BY TableName")
    For x = 1 to 10
        Me("btn" & x).Caption = RS("TableName")
        RS.MoveNext
    Next
    RS.Close
End Function

可以在表单Open事件中调用该过程。然后,按钮Click事件中的代码可以将其标题作为参数传递给需要使用TableName值进行操作的任何其他过程。

在Access查询中计算序列标识符是一个常见的话题MS Access Restart Number Sequence

假设TableName的值是唯一的:

SELECT TableName,DCount("*","table","TableName<'" & [TableName] & "' AND Flag=1")+1 AS Seq,FROM table
WHERE Flag=1
ORDER BY TableName;

可以将该查询用作表单或报表的RecordSource或在其上执行DLookup()。

请注意,过滤器的任何更改都会影响序列计算。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。