【发布时间】:2012-08-29 18:03:11
【问题描述】:
使用 VBA,如何在名为 "ServiceYES" 的表中的字段 " 中搜索文本字符串,例如 "CHIR"服务”。
之后,我想保存 "CHIR" 存在于表 "ServicesYES" 中的所有行的相邻字段。 “ServiceYES” 表如下:
我基本上是想在“服务”列中找到所有“CHIR”,然后保存CHIR左侧的名称,例如“FRANKL_L”, "SANTIA_D" 作为一个数组。
提前感谢您的所有帮助。
【问题讨论】:
使用 VBA,如何在名为 "ServiceYES" 的表中的字段 " 中搜索文本字符串,例如 "CHIR"服务”。
之后,我想保存 "CHIR" 存在于表 "ServicesYES" 中的所有行的相邻字段。 “ServiceYES” 表如下:
我基本上是想在“服务”列中找到所有“CHIR”,然后保存CHIR左侧的名称,例如“FRANKL_L”, "SANTIA_D" 作为一个数组。
提前感谢您的所有帮助。
【问题讨论】:
首先创建一个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)
我对此进行了测试,它似乎有效。此函数将提取 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)
【讨论】:
保罗,
这是我在几分钟内拼凑起来的东西。您可以将其添加到模块中的 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
【讨论】: