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

时间:2018-06-25 05:51:31

标签: excel vba unique-id

首先,我想对未显示任何代码表示抱歉,但现在我需要一些有关如何提取字符串的唯一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

继承了dataStruct的dList:

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

孔列表如何显示:

struct

1 个答案:

答案 0 :(得分:1)

我强烈建议使用字典。查找项目不仅更快(我认为它是通过某种哈希实现的),而且在添加或删除项目时具有很大的优势。

当您有一个数组并要添加一个项目时,要么总是必须使用确实昂贵的redim preserve,要么您定义的数组要比最初需要的大,并且必须始终保持信息多少个项目真的很用而且从数组中删除项目相当复杂。

不能将类型化的变量作为项值添加到字典中,但是可以添加对象。因此,不用创建Type定义,而是创建一个仅包含这些行的简单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