Option Explicit
Private Declare Function SendMessagebyString Lib _
"user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As String) As Long
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Sub Command1_Click()
Dim strSource As String, strItem() As String, i As Long, n As Long
List1.Clear
For i = 0 To UBound(strItem)
n = SendMessagebyString(List1.hWND, LB_FINDSTRINGEXACT, -1, strItem(i))
If n = -1 Then
List1.AddItem strItem(i)
List1.ItemData(List1.NewIndex) = 1
Else
List1.ItemData(n) = List1.ItemData(n) + 1
End If
Next i
ReDim strItem(List1.ListCount - 1)
For i = 0 To List1.ListCount - 1
strItem(i) = "["
For n = 1 To List1.ItemData(i) - 1
strItem(i) = strItem(i) & List1.List(i) & ","
Next n
strItem(i) = strItem(i) & List1.List(i) & "]"
Debug.Print strItem(i)
Next i
Debug.Print Join(strItem, ",")
End Sub
Private Type MembList
BuffSize As Long
MembNum As Long
DataBuff() As Long
End Type
Private Type GroupInfo
ListSize As Long
GroupNum As Long
GroupList() As MembList
End Type
' *** 按“下標從0開始”處理陣列 ***
Private stcDataGroup As GroupInfo ' 分組資訊管理變數
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' * * 將一組資料進行分組
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Private Sub Grouping(DataList() As Long)
Dim objDict As Dictionary
Dim p As Long, n As Long, v As Long
Dim i As Long
' 初始化分組資訊
stcDataGroup.ListSize = 16
stcDataGroup.GroupNum = 0
ReDim stcDataGroup.GroupList(stcDataGroup.ListSize - 1)
' 開始處理資料
Set objDict = New Dictionary
For i = 0 To UBound(DataList)
v = DataList(i)
If (objDict.Exists(v)) Then
p = objDict.Item(v)
With stcDataGroup.GroupList(p)
p = .MembNum
If (p = .BuffSize) Then
n = p + 4 ' 擴充串列長度。如果串列長度多數較大,宜取稍大的值。
ReDim Preserve .DataBuff(n - 1)
.BuffSize = n
End If
.DataBuff(p) = v
.MembNum = p + 1 '
End With
Else
p = stcDataGroup.GroupNum
objDict.Add v, p
'n = stcdatagroup.GroupList(p).MembNum
If (p = stcDataGroup.ListSize) Then '增加組數
n = p + 8
' 每次擴充8個,可按你的需要改。組數多,宜取稍大的值。
' 每次擴充數大些,運行效率高點。
stcDataGroup.ListSize = n
ReDim Preserve stcDataGroup.GroupList(n - 1)
End If
' 初始化新分組
With stcDataGroup.GroupList(p)
n = 16 '設定每組初始大小。分組長度大,就宜取稍大的值。
.BuffSize = n
ReDim .DataBuff(n - 1)
.MembNum = 1
.DataBuff(0) = v
End With
stcDataGroup.GroupNum = p + 1
End If
Next
objDict.RemoveAll
End Sub
For i = 0 To stcDataGroup.GroupNum - 1
Debug.Print "第 " & i + 1 & " 組資料:"
For j = 0 To stcDataGroup.GroupList(i).MembNum - 1
Debug.Print stcDataGroup.GroupList(i).DataBuff(j);
Next
Debug.Print
Next
End Sub
Private Sub Command1_Click()
Dim aData() As Long
Dim i&, sTxtBuf$()
sTxtBuf = Split("1,2,3,4,5,4,4,4,2,2,1,1,6", ",")
ReDim aData(UBound(sTxtBuf))
For i = 0 To UBound(sTxtBuf)
aData(i) = sTxtBuf(i)
Next
Call Grouping(aData) ' 資料分組
Call ListGroup ' 輸出結果示例
End Sub
Private Type MembList
MembNum As Long
Value As Long
End Type
Private Type GroupInfo
ListSize As Long
GroupNum As Long
GroupList() As MembList
End Type
' *** 按“下標從0開始”處理陣列 ***
Private stcDataGroup As GroupInfo ' 分組資訊管理變數
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' * * 將一組資料進行分組
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Private Sub Grouping(DataList() As Long)
Dim objDict As Dictionary
Dim p As Long, n As Long, v As Long
Dim i As Long
' 初始化分組資訊
stcDataGroup.ListSize = 16
stcDataGroup.GroupNum = 0
ReDim stcDataGroup.GroupList(stcDataGroup.ListSize - 1)
' 開始處理資料
Set objDict = New Dictionary
For i = 0 To UBound(DataList)
v = DataList(i)
If (objDict.Exists(v)) Then
With stcDataGroup.GroupList(objDict.Item(v))
.MembNum = .MembNum + 1
End With
Else
p = stcDataGroup.GroupNum
objDict.Add v, p
If (p = stcDataGroup.ListSize) Then '增加組數
n = p + 8
' 每次擴充8個,可按你的需要改。組數多,宜取稍大的值。
' 每次擴充數大些,運行效率高點。
stcDataGroup.ListSize = n
ReDim Preserve stcDataGroup.GroupList(n - 1)
End If
' 新分組資料記錄
stcDataGroup.GroupList(p).MembNum = 1
stcDataGroup.GroupList(p).Value = v
stcDataGroup.GroupNum = p + 1
End If
Next
objDict.RemoveAll
End Sub
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' * * 將分組資料輸出示例(分組資訊調取示例)
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Private Sub ListGroup()
Dim i&, j&
For i = 0 To stcDataGroup.GroupNum - 1
Debug.Print "第 " & i + 1 & " 組資料:"
For j = 1 To stcDataGroup.GroupList(i).MembNum
Debug.Print stcDataGroup.GroupList(i).Value;
Next
Debug.Print
Next
End Sub
Private Sub Command1_Click()
Dim aData() As Long
Dim i&, sTxtBuf$()
sTxtBuf = Split("1,2,3,4,5,4,4,4,2,2,1,1,6", ",")
ReDim aData(UBound(sTxtBuf))
For i = 0 To UBound(sTxtBuf)
aData(i) = sTxtBuf(i)
Next
Call Grouping(aData) ' 資料分組
Call ListGroup ' 輸出結果示例
End Sub
uj5u.com熱心網友回復:
Private Sub Grouping(DataList() As Long) 中, n As Long, 可以不要了。
后面放大分組數那兒這樣改下:
If (p = stcDataGroup.ListSize) Then '增加組數
stcDataGroup.ListSize = p + 8
ReDim Preserve stcDataGroup.GroupList(p + 7)
End If
uj5u.com熱心網友回復:
VB.NET只要1行:
Dim Result = "1,2,3,4,5,4,4,4,2,2,1,1,6".Split(",").GroupBy(Function(x) x)