VBA - 创建字符串/哈希的唯一 ID

VBA - create unique ID of String / Hash

首先,我想对没有显示任何代码表示抱歉,但现在我需要一些关于如何取出字符串的唯一 ID 的指南。

所以我有一些关于如何组织数据的问题。假设数据经过组织,每个 dataID 都有其唯一的名称。我将数据收集到一个包含它的数组中。

我现在遇到的问题是我想要一种简单的方法来搜索这些 nameID。想象一下,数据要大得多并且包含数百种不同的 nameID 的唯一组合。因此,我认为搜索 id 本身并不合适,我正在考虑创建一个可以使用算法来搜索数组的散列。我想这样做是因为稍后我将比较名称并将值添加到相应的 nameID。请记住,nameID 大多数时候将具有相同的结构,但最终可以实现一个像 total_air 这样的新名称,然后我需要在数组中搜索以获得正确的值。

已更新:

从excel收集数据的代码示例:

For Each targetSheet In wb.Worksheets
    With targetSheet
    'Populate the array
        xData(0) = Application.Transpose(Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Value2)
        cnt = UBound(xData(0))
    End With
    Call dData.init(cnt)
    'Populate the objectarray
    dData.setNameArray = xData(0)
Next targetSheet

类型对象:

Private index As Integer
Private id As String
Private nameID() As Variant
Private data() As Variant
Private cnt As Integer

Public Sub init(value As Integer)
    index = 0
    cnt = value
    id = ""
    ReDim nameID(0 To cnt)
    ReDim data(0 To cnt)
End Sub

Property Let setID(value As String)
    id = value
End Property

Property Let setNameArray(value As Variant)
    nameID = value
End Property

dList 继承了 dataStruct:

Private xArray() As dataStruct
Private listInd As Integer

Public Sub init(cnt As Integer)
    ReDim xArray(1 To cnt)
    Dim num As Integer
    For num = 1 To cnt
        Set xArray(num) = New dataStruct
    Next
    listInd = 1
End Sub
Property Let addArray(value As dataStruct)
    Set xArray(listInd) = value
    listInd = listInd + 1
End Property

洞列表的样子:

我强烈主张使用字典。它不仅可以更快地找到一个项目(我假设它是通过某种哈希实现的),而且在添加或删除项目时具有很大的优势。

当你有一个数组并想要添加一个项目时,你要么总是使用非常昂贵的 redim preserve,要么你定义的数组比最初需要的更大,并且总是必须保持信息如何很多东西都是真的用过。从数组中删除一个项目相当复杂。

您不能将类型化变量作为项值添加到字典中,但可以添加对象。因此,而不是你的 Type 定义,创建一个简单的 class 模块,只包含这些行(当然你可以创建 class 属性, getter 和 setter 但这与此示例无关)

Public id As Long
Public name As String
Public value As Long

然后,处理字典就相当简单了(请注意,您必须添加对 Microsoft Scripting Runtime

的引用
Option Explicit

Dim myList As New Dictionary

Sub AddItemValues(id As Long, name As String, value As Long)
    Dim item As New clsMyData
    With item
        .id = id
        .name = name
        .value = value
    End With
    Call AddItem(item)
End Sub

Sub AddItem(item As clsMyData)
    If myList.Exists(item.id) Then
        set myList(item.id) = item
    Else
        Call myList.Add(item.id, item)
    End If
End Sub

Function SearchItem(id As Long) As clsMyData
    If myList.Exists(id) Then
        Set SearchItem = myList(id)
    Else
        Set SearchItem = Nothing
    End If
End Function

Function SearchName(name As String) As clsMyData
    Dim item As Variant
    For Each item In myList.Items
        If item.name = name Then
            Set SearchName = item
            Exit Function
        End If
    Next item
    Set SearchName = Nothing
End Function

因此,只要您处理 Id,字典就会为您完成所有工作。只有当你搜索 name 时,你必须遍历字典的所有项目,这就像遍历数组一样简单。

一些测试(当然你应该添加一些错误处理)

Sub test()
    Call AddItemValues(32, "input_air", 0)
    Call AddItemValues(45, "air_Procent", 99)
    Call AddItemValues(89, "output_air", 34)

    Debug.Print SearchItem(45).name
    Debug.Print SearchName("output_air").value

    ' Change value of output_air
    Call AddItemValues(89, "output_air", 1234)
    Debug.Print SearchName("output_air").value
End Sub