VB/VBA 中,數組部分元素被修改後,若需知悉哪些下標被修改並關聯處理其餘元素,可通過自定義結構體 + ByRef 參數實現。
' 定義結構體
Type ArrayTracker
Data() As Variant ' 原始數據
ModifiedIndexes As Collection ' 存儲被修改的下標
End Type
' 修改函數:ByRef 傳遞結構體,記錄下標
Sub ModifyArray(ByRef tracker As ArrayTracker, index As Long, newValue As Variant)
If index >= LBound(tracker.Data) And index <= UBound(tracker.Data) Then
tracker.Data(index) = newValue
tracker.ModifiedIndexes.Add index ' 記錄修改下標
End If
End Sub
' 使用示例
Dim tracker As ArrayTracker
ReDim tracker.Data(1 To 10)
Set tracker.ModifiedIndexes = New Collection
' 初始化
For i = 1 To 10: tracker.Data(i) = i: Next
' 修改部分元素
ModifyArray tracker, 3, 99
ModifyArray tracker, 7, 88
' 獲取修改下標
Dim idx As Variant
For Each idx In tracker.ModifiedIndexes
Debug.Print "Modified index: " & idx & ", New value: " & tracker.Data(idx)
Next
' 其餘元素關聯處理(如乘 2)
For i = LBound(tracker.Data) To UBound(tracker.Data)
If Not IsInCollection(tracker.ModifiedIndexes, i) Then
tracker.Data(i) = tracker.Data(i) * 2
End If
Next
Function IsInCollection(col As Collection, val As Long) As Boolean
On Error Resume Next
Dim dummy As Variant
dummy = col.Item(CStr(val)) ' Collection 用鍵存取,需轉字符串
IsInCollection = (Err.Number = 0)
On Error GoTo 0
End Function
更面向對象的方式:創建 CArrayWrapper 類,封裝數組、修改日誌、事件通知,支持 WithEvents 實時響應修改。