Ms access 计数并插入唯一值-此代码可以优化吗?

Ms access 计数并插入唯一值-此代码可以优化吗?,ms-access,vba,unique,counter,Ms Access,Vba,Unique,Counter,我需要从Access数据库生成一个使用标准函数无法获得的输出。我进行了广泛的搜索,但当我找到示例代码时,它最终失败了。所以,我从零开始,尽可能地从别人的工作中汲取经验。下面的代码可能非常原始,但它适用于我和数据库中的操作。我真正想看到的是如何使这段代码更加紧凑和高效。我今天没有处理太多的行(我不太确定您的复杂功能想要实现什么。是否要打印从数据库中读取的每个字母在字母表中的位置?这可以通过以下方式轻松实现: filename = "D:\Temp\_test.txt" Set rst = Cur

我需要从Access数据库生成一个使用标准函数无法获得的输出。我进行了广泛的搜索,但当我找到示例代码时,它最终失败了。所以,我从零开始,尽可能地从别人的工作中汲取经验。下面的代码可能非常原始,但它适用于我和数据库中的操作。我真正想看到的是如何使这段代码更加紧凑和高效。我今天没有处理太多的行(我不太确定您的复杂功能想要实现什么。是否要打印从数据库中读取的每个字母在字母表中的位置?这可以通过以下方式轻松实现:

filename = "D:\Temp\_test.txt"

Set rst = CurrentDb.OpenRecordset(QryName, dbOpenDynaset)

Set f= CreateObject("Scripting.FileSystemObject").OpenTextFile(filename, 8, True)
Do Until rst.EOF
  v = rst.Fields(fldName).Value
  f.WriteLine v & ", " & (Asc(v) - 96)
  rst.MoveNext
Loop
f.Close
“唯一”在VBScript中是指。因此,请使用一个,如中所示:

>> Set d = CreateObject("Scripting.Dictionary")
>> For Each c In Split("a b b b c c d")
>>     If Not d.Exists(c) Then
>>        d(c) = 1 + d.Count
>>     End If
>> Next
>> For Each c In Split("a b b b c c d")
>>     WScript.Echo c, d(c)
>> Next
>>
a 1
b 2
b 2
b 2
c 3
c 3
d 4

其中“c3”的意思是:“c是在源集合中找到的第三个唯一项”。

您可以使用SQL查询和少量VBA来实现这一点

使用以下代码将VBA模块插入Access:

'Module level variables; values will persist between function calls
Dim lastValue As String 
Dim currentIndex As Integer

Public Function GetIndex(Value) As Integer
    If Value <> lastValue Then currentIndex = currentIndex + 1
    GetIndex = currentIndex
End Function

Public Sub Reset()
    lastValue = ""
    currentIndex = 0
End Sub
只需确保每次运行查询前都调用
Reset
;否则上次运行查询时的最后一个值仍将保留


当以后的值重复出现时(例如,
a
b
a
),以前的代码会将它们视为新值。如果希望相同的值在整个查询长度内返回相同的索引,可以使用
字典

Dim dict As New Scripting.Dictionary

Public Function GetIndex(Value As String) As Integer
    If Not dict.Exists(Value) Then dict(Value) = UBound(dict.Keys) + 1 'starting from 1
    GetIndex = dict(Value)
End Function

Public Sub Reset()
    Set dict = New Scripting.Dictionary
End Sub

不太清楚你想用代码实现什么。数数什么?插入哪里?代码应该做什么?另外,你的代码是Access VBA,而不是VBScript。这两种语言不一样。数据来自一个整天不断运行的Access查询。我想在相邻字段中插入一个函数来传递cou如图所示。计数器使用查询中的其他参数在串联值中使用。但是,这是困难的部分。是的,这是复杂的,但它确实有效。我更希望有一个优雅的解决方案,而不是我生成的混乱。谢谢,但我正在尝试构建函数QrySeqCPM()因此,我可以为生成的每个记录传递参数。它内置于Access查询中。因此,我没有预定义的“a b c d”列表。我还刚刚确定字典在Access 2010中不是标准的。我需要分发此VBA,因此我无法使用它。@jurban1997
字典在过去15年左右的时间里是所有Windows计算机上的标准。在VBA中,请转到工具->参考…并选择Microsoft脚本运行时。谢谢Zev。我一定会检查C找出将使用此选项的其他Access实例,以确定我是否可以启用字典。这将需要几天的时间进行跟踪。请继续关注!@jurban1997如果您想通知某人有关评论,请使用
@
符号和屏幕名(如上所述)。有关何时何地执行此操作的详细信息,请参阅。我正在尝试向查询中每个记录中的特定字段返回一个值。查询结果不断变化。a、b、b、b、c值示例是查询返回给我引用的字段的值。相邻字段需要一个序列号,并且仅当新值找到e。输出用于标识具有公共值的记录,以便可以顺序导入。我是流程的上游,这是下游开发人员对我的要求。实际字段更复杂,但此函数是其中的关键组件。
Dim dict As New Scripting.Dictionary

Public Function GetIndex(Value As String) As Integer
    If Not dict.Exists(Value) Then dict(Value) = UBound(dict.Keys) + 1 'starting from 1
    GetIndex = dict(Value)
End Function

Public Sub Reset()
    Set dict = New Scripting.Dictionary
End Sub