我需要帮助自动递增一封信。
表1中的描述字段具有如下值:B39
这个Table1记录,在表2中有相关记录:
B39_a
B39_b
B39_c
B39_d
我想要做的就是Table2中的描述自动获取table1中的记录并添加特定的字母。它总是以“a”开头,永远不会达到完整的字母表。
我已经尝试过这个网站的一些代码:http://www.freevbcode.com/ShowCode.asp?ID=5440
Function IncrementString(ByVal strString As String) As String
'
' Increments a string counter
' e.g. "a" -> "b"
' "az" -> "ba"
' "zzz" -> "aaaa"
'
' strString is the string to increment, assumed to be lower-case alphabetic
' Return value is the incremented string
'
Dim lngLenString As Long
Dim strChar As String
Dim lngI As Long
lngLenString = Len(strString)
' Start at far right
For lngI = lngLenString To 0 Step -1
' If we reach the far left then add an A and exit
If lngI = 0 Then
strString = "a" & strString
Exit For
End If
' Consider next character
strChar = Mid(strString, lngI, 1)
If strChar = "z" Then
' If we find Z then increment this to A
' and increment the character after this (in next loop iteration)
strString = Left$(strString, lngI - 1) & "a" & Mid(strString, lngI + 1, lngLenString)
Else
' Increment this non-Z and exit
strString = Left$(strString, lngI - 1) & Chr(Asc(strChar) + 1) & Mid(strString, lngI + 1, lngLenString)
Exit For
End If
Next lngI
IncrementString = strString
Exit Function
End Function
显然它不像它应该的那样工作。它增加了字母,但两次! (i,i,j,j等)
说明文本框(对于Table2记录)具有默认值:
=IncrementString(DLast("[SeqNo]","[table2]"))
但就像我说的那样,通过加倍来增加数量。我还必须通过输入“a”手动启动该过程。
函数和调用代码目前都不允许使用“A ## _”前缀。如果你真的必须将这个前缀保存到Table2,则必须调整代码来处理它。建议不要将“A ##”组标识符保存为Table2中的前缀。使用连接PK / FK字段上的表的查询来检索要导出的相关数据。
DLast()搜索必须考虑“A ##”组标识符,因为对每个组重复该序列。
不幸的是,尝试使用依赖于主窗体ID的动态参数设置DefaultValue属性是不切实际的。首先,子表单在主表单之前加载,因此无法构建默认值,因为主表单数据和控件不可用。此外,当主窗体移动到新记录时,再次没有要构建的默认值的数据。结果是新记录行上的控件显示错误。
使用PK / FK字段进行搜索。
子窗体中的代码调用递增函数的当前事件:
If Me.NewRecord And Not IsNull(Me.Parent.ReferenzNR) Then
Me!SerienBezeichnung = IncrementString(Nz(DLast("SerienBezeichnung", "tbl_GrundminenSerie", "ID_FK=" & Me.Parent.ReferenzID), ""))
End If
请注意,即使现在正在工作,DLast()也可能最终失败,因为记录没有固有的顺序。替代方案可能涉及记录集或嵌套域聚合。在VBA立即窗口中测试的示例:
?DMax("SerienBezeichnung","tbl_GrundminenSerie","ID_FK=5 AND Len([SerienBezeichnung])=" & DMax("Len([SerienBezeichnung])","tbl_GrundminenSerie","ID_FK=5"))
或者,如果你觉得自动编号PK可以依赖于总是增加(这一直是我的观察,虽然不能保证自动编号):
?DLookup("SerienBezeichnung","tbl_GrundminenSerie","ID_FK=5 AND SerienID=" & DMax("SerienID","tbl_GrundminenSerie","ID_FK=5"))
考虑以下VBA功能:
Function IncAlpha(ByVal strA As String, ByVal lngI As Long) As String
If lngI <= 0 Then
IncAlpha = strA
ElseIf strA = vbNullString Then
IncAlpha = IncAlpha("a", lngI - 1)
Else
lngI = lngI + Asc(Right(strA, 1)) - 97
IncAlpha = IncAlpha(Left(strA, Len(strA) - 1), lngI \ 26) & Chr(97 + lngI Mod 26)
End If
End Function
提供小写字母字符串,这个递归函数将通过提供的长整数参数递增字符串,z
递增到aa
,az
递增到ba
,依此类推。
提供空字符串(""
),上面的函数将返回a
。
?IncAlpha("", 1)
a
?IncAlpha("", 26)
z
?IncAlpha("", 27)
aa
?IncAlpha("", 42)
ap
?IncAlpha("", 314159)
qvsa
使用此功能,可以使用以下方法计算后缀:
<prefix> & IncAlpha("", DCount("[SeqNo]","[table2]") + 1)
或者考虑多个前缀:
<prefix> & IncAlpha("", DCount("SeqNo","table2","SeqNo like '" & <prefix> & "*'") + 1)