/ / Preenchendo a coleção com matrizes - vb.net, vba, vb6, excel-vba, excel

Preenchendo a coleção com matrizes - vb.net, vba, vb6, excel-vba, excel

Dim A As Collection
Set A = New Collection

Dim Arr2(15, 5)
Arr2(1,1) = 0
" ...

A.Add (Arr2)

Como posso acessar o Arr2 através A? Por exemplo, quero fazer o seguinte:

A.Item(1) (1,1) = 15

Então, o acima mudaria o primeiro elemento da primeira matriz bidimensional dentro da coleção ...

Respostas:

7 para resposta № 1

Hmmm ...a sintaxe parece legal o suficiente sem ter VBA na minha frente. Estou certo de que o seu problema é que o seu código "compila" e executa sem gerar um erro, mas que o array da coleção nunca muda? Se assim for, acho que é porque o seu A.Item (1) pode estar retornando um cópia de da matriz que você armazenou na coleção. Você acessa e modifica o elemento escolhido muito bem, mas ele não está tendo o efeito desejado porque é a instância da matriz errada.

Em geral, as Coleções do VBA funcionam melhor quando são armazenadasobjetos. Então eles vão trabalhar como você quer porque eles armazenam referências. Eles são bons para armazenar valores, mas eu acho que eles sempre os copiam, até mesmo grandes como variantes de array, o que significa que você não pode mudar o conteúdo de um arquivo armazenado. array.

Considere esta resposta apenas uma especulação até que alguém que sabe o material subjacente COM pesa melhor. Um ... paginação Joel Spolsky?

EDITAR: Depois de testar isso no Excel VBA, acho que estou certo. Colocar uma variante de array em uma coleção faz uma cópia, e também a remoção de uma. Portanto, não parece ser uma maneira direta de codificar o que você tem realmente pediu.

Parece que o que você realmente quer é um 3-Darray, mas o fato de que você estava tentando usar uma coleção para a primeira dimensão significa que você deseja alterar o tamanho dessa dimensão. O VBA só permitirá alterar o tamanho da última dimensão de uma matriz ( veja "redim preserve" na ajuda). posso coloque seus arrays 2D dentro de uma matriz 1-D que você pode mudar o tamanho de, embora:

ReDim a(5)
Dim b(2, 2)
a(2) = b
a(2)(1, 1) = 42
ReDim Preserve a(6)

Note que a é declarado com ReDim, não Dim neste caso.

Finalmente, é bem possível que alguma outra abordagem a qualquer coisa que você esteja tentando fazer seja melhor. Matrizes crescentes e mutáveis ​​são complexas e propensas a erros, para dizer o mínimo.


4 para resposta № 2

@jtolle está correto. Se você executar o código abaixo e inspecionar os valores (Quick Watch é Shift-F9) de Arr2 e x, você verá que eles são diferentes:

Dim A As Collection
Set A = New Collection
Dim Arr2(15, 5)

Arr2(1, 1) = 99

" ...

A.Add (Arr2) " adds a copy of Arr2 to teh collection

Arr2(1, 1) = 11  " this alters the value in Arr2, but not the copy in the collection

Dim x As Variant

x = A.Item(1)
x(1, 1) = 15  " this does not alter Arr2

1 para resposta № 3

Talvez o VBA faça uma cópia do array quando o atribui à coleção? VB.net não faz isso. Após este código, a (3,3) é 20 em vba e 5 em vb.net.

Dim c As New Collection
Dim a(10, 10) As Integer

a(3, 3) = 20
c.Add(a)
c(1)(3, 3) = 5

1 para resposta № 4

Recentemente tive esse problema exato. Eu consegui arredondá-lo preenchendo uma matriz com a matriz de itens em questão, fazendo a alteração para essa matriz, excluindo a matriz de itens da coleção e adicionando a matriz alterada à coleção. Não é bonito, mas funcionou ... e eu não consigo encontrar outro jeito.


0 para a resposta № 5

Se você quiser que a coleção tenha uma cópia da matriz e não uma referência à matriz, use o método array.clone: ​​-

Dim myCollection As New Collection
Dim myDates() as Date
Dim i As Integer

Do
i = 0
Array.Resize(myDates, 0)
Do
Array.Resize(myDates, i + 1)
myDates(i) = Now
...
i += 1
Loop
myCollection.Add(myDates.Clone)
Loop

No final, myCollection irá conter a coleção acumulativa de myDates ().