Redimming (preserve) a 3D array

K

ker_01

This is a repost of an earlier question that didn't recieve responses (my
question may have been too obscure).

I have a 3D array which I'll call myarray(1 to 10, 1 to 100, 1 to 3)

I would like to reduce the number of parameters to turn it into a 2D array
which I'll call mynewarray(1 to 10, 1 to100) while keeping the data that is
already in the array.

Redim/preserve only allows you to mess with the last dimension (1 to 3),
which is fine- but from help:
"Similarly, when you use Preserve, you can change the size of the array only
by changing the upper bound; changing the lower bound causes an error"

The data I'd like to preserve is in the middle, e.g. mynewarray(x, y) =
myarray(x,y,2)

Is there a better method, or will I be forced to loop through and build
mynewarray one value at a time? The real problem is that in my larger loop
of code, myarray is dynamic and is updated frequently, and I'll have to pull
current copies of mynewarray fairly often, and that seems like a lot of
processing overhead. If there is a way to redim the array directly, that
would save me all kinds of time.

Thanks!

Keith
 
R

Rick Rothstein \(MVP - VB\)

Since your data is already in the 3-D array, can't you just leave it there;
and when you need the data "in the middle", just fix the last index to 2,
and loop through the rest as you would if it were in the 2-D array? That
way, you won't have to move any data around and yet you can get to the
information you need.

Rick
 
C

Charles Williams

Copying arrays element by element is pretty fast (Redim Preserve also uses
array copying under the covers, but possible more efficiently).
Depending on exactly what you want to do two alternative approaches might be
to

- change the sequence of the dimensions to (1 to 3, 1 to 10, 1 to 100) so
that the one you want to Redim Preserve is last
- use jagged arrays of variants
Jagged array method works something like this:

OPtion Base 1

Dim Var1 as variant
dim Var2 as variant
dim Var3 as variant

dim varJagged(3) as variant

Var1 = Range("A1:A10").Value
Var2 = Range("D10:D100").Value
Var3 = Range("F5:F250").Value

varJagged(1)=Var1
varJagged(2)=Var2
varJagged(3)=Var3

msgbox varJagged(2) (54,1)
Charles__________________________________________________The Excel
Calculation Sitehttp://www.decisionmodels.com"ker_01"
 
A

Alan Beban

ker_01 said:
This is a repost of an earlier question that didn't recieve responses (my
question may have been too obscure).

I have a 3D array which I'll call myarray(1 to 10, 1 to 100, 1 to 3)

I would like to reduce the number of parameters to turn it into a 2D array
which I'll call mynewarray(1 to 10, 1 to100) while keeping the data that is
already in the array.

Redim/preserve only allows you to mess with the last dimension (1 to 3),
which is fine- but from help:
"Similarly, when you use Preserve, you can change the size of the array only
by changing the upper bound; changing the lower bound causes an error"

The data I'd like to preserve is in the middle, e.g. mynewarray(x, y) =
myarray(x,y,2)

Is there a better method, or will I be forced to loop through and build
mynewarray one value at a time? The real problem is that in my larger loop
of code, myarray is dynamic and is updated frequently, and I'll have to pull
current copies of mynewarray fairly often, and that seems like a lot of
processing overhead. If there is a way to redim the array directly, that
would save me all kinds of time.

Thanks!

Keith
I'm not sure I understand what you want to pare down to; nevertheless,
if the functions in the freely downloadable file at
http://home.pacbell.net/beban are available to your workbook, you might
see whether the following gets you there:

my2Darray=TwoD(my3Darray)

Alan Beban
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top