我们部门使用 Microsoft Access 数据库来管理大约 300,000 条记录。系统的前端允许用户向捐赠者的记录添加评论。正如您可能猜到的那样,评论字段变成了狂野的西部,没有关于如何输入评论的标准。更糟糕的是,在我开始之前,在捐赠者已经为其记录分配了评论的情况下,工作人员将打开现有的评论,而不是创建新评论(后端表中的新行)评论并在末尾添加附加注释。仅由空格分隔!
添加注释的情况之一是发现重复记录。重复项将被禁用,并附有列出原始记录 ID 以供参考的注释。
我们迁移到新系统的时间已经到了,我很想将这些 ID 号从注释字段中取出,以便可以将它们添加到新表中,并在我们导入不必要的数据之前将原始记录和重复记录链接在一起。数据存入新数据库。
我遇到的问题是;如果没有,如何编写查询以从作为文本字段的注释字段中间提取引用的 ID 值?所有 ID 的长度都是 7 位数字。以下是如何输入这些评论的大约 4,000 个实例的几个示例。
在搜索论坛时,我能够构建一个可以在查询中引用的公共函数,但它会提取字符串中的所有数值,而不仅仅是 7 个连续数字的字符串中的数值?
Public Function ExtractDonorID(strInput) As String
Dim strResult As String, strCh As String
Dim z As Integer
If Not IsNull(strInput) Then
For z = 1 To Len(strInput)
strCh = Mid(strInput, z, 1)
Select Case strCh
Case "0" To "9"
strResult = strResult & strCh
Case Else
End Select
Next z
End If
ExtractDonorID= strResult
End Function
有什么想法吗?
也许是这样的,但正则表达式可能更好:
Sub Tester()
Dim v
For Each v In Array("dup see 1189827, Rita is Mrs. White", _
"dup see 11898278, Rita is Mrs. White", _
"4-16-18 d DUPE - 1344126", _
"4-16-18 d DUPE - 134412")
Debug.Print v, vbLf, "Found: " & ExtractNumericId(v)
Next v
End Sub
Public Function ExtractNumericId(ByVal strInput) As String
Const NUM_DIGITS As Long = 7 'this many and no more....
Dim txt As String, patt As String
Dim z As Long, l As Long
If Not IsNull(strInput) Then
l = Len(strInput)
patt = String(NUM_DIGITS, "#") 'checking for x digits...
strInput = strInput & " " 'kludge in case digits are at the end of the input
z = 1
Do While z <= l - (NUM_DIGITS - 1)
txt = Mid(strInput, z, NUM_DIGITS)
If txt Like patt Then
'check next character is not also a digit...
If Not Mid(strInput, z + NUM_DIGITS, 1) Like "#" Then
ExtractNumericId = txt
Exit Function
Else
z = z + NUM_DIGITS 'skip this section...
End If
End If
z = z + 1
Loop
End If
End Function