自动递增至特定编号的字母

时间:2019-04-04 21:29:05

标签: ms-access access-vba

我在自动增加字母方面需要帮助。

表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”来手动启动该过程。

2 个答案:

答案 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递增为aaaz递增为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"))