我在自动增加字母方面需要帮助。
表1中的描述字段的值如下:B39
此Table1记录在Table2中具有相关记录:
B39_a
B39_b
B39_c
B39_d
我要做的就是表2中的描述自动获取表1中的记录并添加特定字母。它始终以“ 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 Record)具有默认值:
=IncrementString(DLast("[SeqNo]","[table2]"))
但是就像我说过的那样,它的数量增加了一倍。我还必须通过输入“ a”来手动启动该过程。
答案 0 :(得分:1)
请考虑以下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)
答案 1 :(得分:1)
该函数或调用代码目前均不允许使用“ A ## _”前缀。如果确实必须将此前缀保存到Table2,则必须对代码进行调整以对其进行处理。照原样,建议不要在表2中将“ A ##”组标识符保存为前缀。使用查询将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"))