ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   update collection of arrays (https://www.excelbanter.com/excel-programming/348908-update-collection-arrays.html)

RB Smissaert

update collection of arrays
 
Is it possible to update the value of an array element if that array is held
by a collection?
It seems not:


Sub test2()

Dim oColl As Collection
Dim arr(1 To 10)

Set oColl = New Collection

arr(1) = 5

oColl.Add arr, "a"

MsgBox oColl(1)(1)

oColl(1)(1) = 6

MsgBox oColl(1)(1)

End Sub


Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and to
have a robust
linkage between the nodes and the stored data.


RBS


Norman Jones

update collection of arrays
 
Hi Bart,

A collection only has three methods: Add, Remove and Item, so I do not think
that a that a collection element can be changed, irrespective of whether an
array is involved or not.

---
Regards,
Norman



"RB Smissaert" wrote in message
...
Is it possible to update the value of an array element if that array is
held by a collection?
It seems not:


Sub test2()

Dim oColl As Collection
Dim arr(1 To 10)

Set oColl = New Collection

arr(1) = 5

oColl.Add arr, "a"

MsgBox oColl(1)(1)

oColl(1)(1) = 6

MsgBox oColl(1)(1)

End Sub


Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to have a robust
linkage between the nodes and the stored data.


RBS




Jim Cone

update collection of arrays
 
RBS,

You can do something close to what you want with the
Scripting Dictionary object...
'-------------
Sub test3()
'Requires project reference to "MicrosoftScriptingRuntime"
'Note that the order of the Key and Item arguments are the reverse
'of those in a Collection.
Dim oDic As Scripting.Dictionary
Dim arr(1 To 10)
Set oDic = New Scripting.Dictionary

arr(1) = 5
oDic.Add "a", arr()
MsgBox oDic("a")(1)

arr(1) = 6
oDic("a") = arr()
MsgBox oDic("a")(1)

Set oDic = Nothing
End Sub
'------------------------
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware



"RB Smissaert"
wrote in message

Is it possible to update the value of an array element if that array is held
by a collection?
It seems not:

Sub test2()
Dim oColl As Collection
Dim arr(1 To 10)
Set oColl = New Collection
arr(1) = 5
oColl.Add arr, "a"
MsgBox oColl(1)(1)

oColl(1)(1) = 6
MsgBox oColl(1)(1)
End Sub

Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and to
have a robust
linkage between the nodes and the stored data.

RBS

RB Smissaert

update collection of arrays
 
Jim,

Yes, I had a look at the dictionary object, but what is misses is the option
to add an item after a known other
item and that is what I need as it has to be in the same order as the nodes
in the treeview.

Will look again in putting the data as a 1-D array in node tags. That would
be the most robust linkage with the
nodes and would save me having a routine for clearing data after a node was
deleted.
The other option I can think of now is storing it in a sheet.

RBS

"Jim Cone" wrote in message
...
RBS,

You can do something close to what you want with the
Scripting Dictionary object...
'-------------
Sub test3()
'Requires project reference to "MicrosoftScriptingRuntime"
'Note that the order of the Key and Item arguments are the reverse
'of those in a Collection.
Dim oDic As Scripting.Dictionary
Dim arr(1 To 10)
Set oDic = New Scripting.Dictionary

arr(1) = 5
oDic.Add "a", arr()
MsgBox oDic("a")(1)

arr(1) = 6
oDic("a") = arr()
MsgBox oDic("a")(1)

Set oDic = Nothing
End Sub
'------------------------
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware



"RB Smissaert"
wrote in message

Is it possible to update the value of an array element if that array is
held
by a collection?
It seems not:

Sub test2()
Dim oColl As Collection
Dim arr(1 To 10)
Set oColl = New Collection
arr(1) = 5
oColl.Add arr, "a"
MsgBox oColl(1)(1)

oColl(1)(1) = 6
MsgBox oColl(1)(1)
End Sub

Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to
have a robust
linkage between the nodes and the stored data.

RBS



RB Smissaert

update collection of arrays
 
Norman,

Yes, you are right, the arrays just confused the fundamental issue here.

RBS


"Norman Jones" wrote in message
...
Hi Bart,

A collection only has three methods: Add, Remove and Item, so I do not
think that a that a collection element can be changed, irrespective of
whether an array is involved or not.

---
Regards,
Norman



"RB Smissaert" wrote in message
...
Is it possible to update the value of an array element if that array is
held by a collection?
It seems not:


Sub test2()

Dim oColl As Collection
Dim arr(1 To 10)

Set oColl = New Collection

arr(1) = 5

oColl.Add arr, "a"

MsgBox oColl(1)(1)

oColl(1)(1) = 6

MsgBox oColl(1)(1)

End Sub


Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to have a robust
linkage between the nodes and the stored data.


RBS





RB Smissaert

update collection of arrays
 
I think using the node tag looks the simplest option:

Sub AddNodeTag(oNode As Node)

Dim arr(1 To 2, 1 To 35)

With oNode
arr(1, 1) = .KEY
arr(2, 2) = .KEY
.Tag = arr
End With

End Sub



And then when adding a node for example:

Dim arrTag

Set nodX = _
.TreeView1.Nodes.Add(, tvwFirst, LNK, "New Report", 1)

AddNodeTag nodX

arrTag = nodX.Tag

arrTag(2, 10) = "testing"

nodX.Tag = arrTag


The important bit here is to update the tag array values indirectly as doing
the updates directly like this:

nodX.Tag(2, 10) = "testing"

doesn't work. I remember it crashed Excel when I tried this a while ago, but
it doesn't do that now, but the
array values are not updated.


RBS



"RB Smissaert" wrote in message
...
Is it possible to update the value of an array element if that array is
held by a collection?
It seems not:


Sub test2()

Dim oColl As Collection
Dim arr(1 To 10)

Set oColl = New Collection

arr(1) = 5

oColl.Add arr, "a"

MsgBox oColl(1)(1)

oColl(1)(1) = 6

MsgBox oColl(1)(1)

End Sub


Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to have a robust
linkage between the nodes and the stored data.


RBS



Dana DeLouis[_3_]

update collection of arrays
 
...the option to add an item after a known other
item and that is what I need...


Hi. For Collections, one technique is to store the "Key" name as part of
the data. It's not ideal, but can be a work-around.
You will need some error checking with mixed data types in the collection.

Sub Demo()
Dim oColl As Collection
Dim arr(0 To 10)
Dim p As Long

Set oColl = New Collection

arr(0) = "a" ' Index 0 for key...
arr(1) = 5

oColl.Add arr, "a"
oColl.Add 3.14, "Pi"
oColl.Add 1.23, "Sales"

'// Update "a"
arr(1) = 6
For p = 1 To oColl.Count
If oColl(p)(0) = "a" Then
oColl.Remove ("a")
oColl.Add arr, "a", Befo=p
Exit For
End If
Next
End Sub

Another technique is to store the key name and your data array inside
another array...
oColl.Add Array("a", arr), "a"

Hope this helps. :)
--
Dana DeLouis
Win XP & Office 2003


"RB Smissaert" wrote in message
...
Jim,

Yes, I had a look at the dictionary object, but what is misses is the
option to add an item after a known other
item and that is what I need as it has to be in the same order as the
nodes in the treeview.

Will look again in putting the data as a 1-D array in node tags. That
would be the most robust linkage with the
nodes and would save me having a routine for clearing data after a node
was deleted.
The other option I can think of now is storing it in a sheet.

RBS

"Jim Cone" wrote in message
...
RBS,

You can do something close to what you want with the
Scripting Dictionary object...
'-------------
Sub test3()
'Requires project reference to "MicrosoftScriptingRuntime"
'Note that the order of the Key and Item arguments are the reverse
'of those in a Collection.
Dim oDic As Scripting.Dictionary
Dim arr(1 To 10)
Set oDic = New Scripting.Dictionary

arr(1) = 5
oDic.Add "a", arr()
MsgBox oDic("a")(1)

arr(1) = 6
oDic("a") = arr()
MsgBox oDic("a")(1)

Set oDic = Nothing
End Sub
'------------------------
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware



"RB Smissaert"
wrote in message

Is it possible to update the value of an array element if that array is
held
by a collection?
It seems not:

Sub test2()
Dim oColl As Collection
Dim arr(1 To 10)
Set oColl = New Collection
arr(1) = 5
oColl.Add arr, "a"
MsgBox oColl(1)(1)

oColl(1)(1) = 6
MsgBox oColl(1)(1)
End Sub

Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to
have a robust
linkage between the nodes and the stored data.

RBS





RB Smissaert

update collection of arrays
 
Thanks for the tip.
I think storing the arrays with in the node tag works fine and it can't be
any more robust linkage with the nodes.
Will try this for now.

RBS

"Dana DeLouis" wrote in message
...
...the option to add an item after a known other
item and that is what I need...


Hi. For Collections, one technique is to store the "Key" name as part of
the data. It's not ideal, but can be a work-around.
You will need some error checking with mixed data types in the collection.

Sub Demo()
Dim oColl As Collection
Dim arr(0 To 10)
Dim p As Long

Set oColl = New Collection

arr(0) = "a" ' Index 0 for key...
arr(1) = 5

oColl.Add arr, "a"
oColl.Add 3.14, "Pi"
oColl.Add 1.23, "Sales"

'// Update "a"
arr(1) = 6
For p = 1 To oColl.Count
If oColl(p)(0) = "a" Then
oColl.Remove ("a")
oColl.Add arr, "a", Befo=p
Exit For
End If
Next
End Sub

Another technique is to store the key name and your data array inside
another array...
oColl.Add Array("a", arr), "a"

Hope this helps. :)
--
Dana DeLouis
Win XP & Office 2003


"RB Smissaert" wrote in message
...
Jim,

Yes, I had a look at the dictionary object, but what is misses is the
option to add an item after a known other
item and that is what I need as it has to be in the same order as the
nodes in the treeview.

Will look again in putting the data as a 1-D array in node tags. That
would be the most robust linkage with the
nodes and would save me having a routine for clearing data after a node
was deleted.
The other option I can think of now is storing it in a sheet.

RBS

"Jim Cone" wrote in message
...
RBS,

You can do something close to what you want with the
Scripting Dictionary object...
'-------------
Sub test3()
'Requires project reference to "MicrosoftScriptingRuntime"
'Note that the order of the Key and Item arguments are the reverse
'of those in a Collection.
Dim oDic As Scripting.Dictionary
Dim arr(1 To 10)
Set oDic = New Scripting.Dictionary

arr(1) = 5
oDic.Add "a", arr()
MsgBox oDic("a")(1)

arr(1) = 6
oDic("a") = arr()
MsgBox oDic("a")(1)

Set oDic = Nothing
End Sub
'------------------------
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware



"RB Smissaert"
wrote in message

Is it possible to update the value of an array element if that array is
held
by a collection?
It seems not:

Sub test2()
Dim oColl As Collection
Dim arr(1 To 10)
Set oColl = New Collection
arr(1) = 5
oColl.Add arr, "a"
MsgBox oColl(1)(1)

oColl(1)(1) = 6
MsgBox oColl(1)(1)
End Sub

Is there any solution for this?
The whole purpose is to store data with nodes of a treeview control and
to
have a robust
linkage between the nodes and the stored data.

RBS







All times are GMT +1. The time now is 03:10 PM.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
ExcelBanter.com