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