【问题标题】:How to search a field in a table in Access如何在 Access 中的表中搜索字段
【发布时间】:2012-08-29 18:03:11
【问题描述】:

使用 VBA,如何在名为 "ServiceYES" 的表中的字段 " 中搜索文本字符串,例如 "CHIR"服务”

之后,我想保存 "CHIR" 存在于表 "ServicesYES" 中的所有行的相邻字段。 “ServiceYES” 表如下:

我基本上是想在“服务”列中找到所有“CHIR”,然后保存CHIR左侧的名称,例如“FRANKL_L”, "SANTIA_D" 作为一个数组。

提前感谢您的所有帮助。

【问题讨论】:

    标签: ms-access find vba


    【解决方案1】:

    首先创建一个SELECT 查询。

    SELECT Code_Perso
    FROM ServicesYES
    WHERE Service = 'CHIR';
    

    如果您只需要唯一值,请使用 SELECT DISTINCT Code_Perso

    如果您想让它们按字母顺序排序,请添加 ORDER BY Code_Perso

    获得满意的查询后,根据该查询打开一个 DAO 记录集,并循环遍历它返回的 Code_Perso 值。

    您不需要将它们直接加载到最终数组中。将它们添加到逗号分隔的字符串中可能更容易。之后,您可以使用 Split() 函数(假设您的 Access 版本 >= 2000)来创建您的数组。

    以下是帮助您入门的示例代码。它主要是标准的样板,但它实际上可能工作......一旦你给它“你的查询”。

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strItems As String
    Dim varItems As Variant
    Set db = CurrentDb
    Set rs = db.OpenRecordset("yourquery", dbOpenSnapshot)
    With rs
        Do While Not .EOF
            strItems = strItems & "," & !Code_Perso
            .MoveNext
        Loop
        .Close
    End With
    If Len(strItems) > 0 Then
        ' discard leading comma '
        strItems = Mid(strItems, 2)
        varItems = Split(strItems, ",")
    Else
        MsgBox "Oops.  No matching rows found."
    End If
    Set rs = Nothing
    Set db = Nothing
    

    【讨论】:

    • 创建返回所需信息的查询。不管你用什么名字来保存它,把它放到这一行:Set rs = db.OpenRecordset("yourquery", dbOpenSnapshot)
    • @Paolo,这就是我在你的另一个问题中所说的。左连接查询中的所有表并查找 3 个 ID 相等的行将为您提供最终结果集。如果没有查询来完成您的工作,VBA 将无法找到您的结果。
    【解决方案2】:

    我对此进行了测试,它似乎有效。此函数将提取 ServiceYes='CHIR' 的所有记录并将 Code_Person 值转储到它将返回的数组中:

    Function x() As String()
        Dim rst As Recordset
        Set rst = CurrentDb.OpenRecordset( _
             "Select * from ServiceYES where Service='CHIR'")
    
        Dim Arr() As String
        Dim i As Integer
    
        While rst.EOF = False
             ReDim Preserve Arr(i)
             Arr(i) = rst.Fields("Code_Person")
             i = i + 1
        rst.MoveNext
        Wend
        x = Arr
    End Function
    

    示例用法:

    Debug.Print x()(0)
    

    【讨论】:

      【解决方案3】:

      保罗,

      这是我在几分钟内拼凑起来的东西。您可以将其添加到模块中的 VBA 编辑器中。它使用一种技巧来使 RecordCount 属性正常运行。至于返回数组,您可以更新函数并创建调用例程。如果您需要那段代码,请发表评论。

      谢谢!

      Option Compare Database
      
      Function QueryServiceYES()
          Dim db As Database
          Dim saveItems() As String
      
          Set db = CurrentDb
      
          Dim rs As DAO.Recordset
          Set rs = db.OpenRecordset("SELECT Code_Perso, Service, Favorites " & _
                                      "FROM ServiceYES " & _
                                      "WHERE Service = 'CHIR'")
      
          'bug in recordset, MoveFirst, then MoveLast forces correct invalid "RecordCount"
          rs.MoveLast
          rs.MoveFirst
      
          ReDim Preserve saveItems(rs.RecordCount) As String
      
          For i = 0 To rs.RecordCount - 1
              saveItems(i) = rs.Fields("Code_Perso")
      
              rs.MoveNext
          Next i
      
          'print them out
          For i = 0 To UBound(saveItems) - 1
              Debug.Print saveItems(i)
          Next i
      
          rs.Close
          Set rs = Nothing
      
          db.Close
          Set db = Nothing
      End Function
      

      【讨论】:

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