ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Issue with arrays (https://www.excelbanter.com/excel-programming/421613-issue-arrays.html)

johnmasvou

Issue with arrays
 
I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx

joel

Issue with arrays
 
You can pass the variable to a SUB using BYREF


Sub Main()

Dim a(10)
For i = 0 To 9
a(i) = i
Next i
Call arraya(a)

End Sub
Sub arraya(ByRef a As Variant)


Call arrayb(a)


End Sub
Sub arrayb(ByRef arraya As Variant)

arraya(5) = 100

End Sub



"johnmasvou" wrote:

I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx


johnmasvou

Issue with arrays
 
My end goal is to develop a UDF that builds a certain probabilty distribution
which the user can call directly in the spreadsheet. Hence, I dont believe a
sub procedure is an option.

Could I do sth similar to what you suggest, using function procedures?

If this is not possible, as an alternative, is there any easy way to first
generate m individual vector arrays by runnig the loop for m times (I can do
this part) and then merge them to one mxm matrix (need some help with this
one) ?

thx




"Joel" wrote:

You can pass the variable to a SUB using BYREF


Sub Main()

Dim a(10)
For i = 0 To 9
a(i) = i
Next i
Call arraya(a)

End Sub
Sub arraya(ByRef a As Variant)


Call arrayb(a)


End Sub
Sub arrayb(ByRef arraya As Variant)

arraya(5) = 100

End Sub



"johnmasvou" wrote:

I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx


joel

Issue with arrays
 
I put the following on a worksheet

=MAX(myArray())

Then created the following function

Function MyArray() As Variant

MyArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

End Function


This worked fine. The worksheet function returned a 9

The problem with VBA is you have to be careful how you dimension arrays and
copy arrays.

Here are some examples of arry assignments. It is best to use variants and
not to hard code the size of the array with a dim MyArray(6). Instead use
Dim MyArray() and then use a REDIM like the code below.

Sub MyArray1()
Dim MyArray2()
Dim MyArray3(10)
Dim MyArray4()
Dim MyArray5()

/MyArray is a variant because it is not delared
MyArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
MyArray2 = MyArray

'This doesn't work because MyArray3 isn't an array.
'MyArray3 = MyArray

This works because MyArray4 is a variant and delared an Array.
MyArray4 = MyArray

ReDim MyArray5(6)
For i = 0 To 5
MyArray5(i) = i
Next i
End Sub





"johnmasvou" wrote:

My end goal is to develop a UDF that builds a certain probabilty distribution
which the user can call directly in the spreadsheet. Hence, I dont believe a
sub procedure is an option.

Could I do sth similar to what you suggest, using function procedures?

If this is not possible, as an alternative, is there any easy way to first
generate m individual vector arrays by runnig the loop for m times (I can do
this part) and then merge them to one mxm matrix (need some help with this
one) ?

thx




"Joel" wrote:

You can pass the variable to a SUB using BYREF


Sub Main()

Dim a(10)
For i = 0 To 9
a(i) = i
Next i
Call arraya(a)

End Sub
Sub arraya(ByRef a As Variant)


Call arrayb(a)


End Sub
Sub arrayb(ByRef arraya As Variant)

arraya(5) = 100

End Sub



"johnmasvou" wrote:

I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx


Dave Peterson

Issue with arrays
 
I'm not quite sure what you're doing, but you may be able to use
application.index() to slice through the matrix:

Option Explicit
Sub testme()
Dim myArr1 As Variant
Dim myArr2 As Variant
Dim myArr3 As Variant

'4x5 matrix
myArr1 = ActiveSheet.Range("a1:e4").Value

'second row of myarr1
myArr2 = Application.Index(myArr1, 2)

'third col of myarr1
myArr3 = Application.Index(myArr1, , 3)

End Sub

But you can loop:

Option Explicit
Sub testme2()

Dim myArr1 As Variant
Dim myArr2 As Variant
Dim rCtr As Long
Dim cCtr As Long

'4x5 matrix
myArr1 = ActiveSheet.Range("a1:e4").Value

'pick off row 2
ReDim myArr2(LBound(myArr1, 2) To UBound(myArr1, 2))
rCtr = 2 'row 2
For cCtr = LBound(myArr1, 2) To UBound(myArr1, 2)
myArr2(cCtr) = myArr1(rCtr, cCtr)
Next cCtr

'pick off column 3
ReDim myArr3(LBound(myArr1, 1) To UBound(myArr1, 1))
cCtr = 3
For rCtr = LBound(myArr1, 1) To UBound(myArr1, 1)
myArr3(rCtr) = myArr1(rCtr, cCtr)
Next rCtr

End Sub

If you're picking up the values from a range, you could do something like:

Option Explicit
Sub testme3()

Dim myRng As Range
Dim myArr2 As Variant
Dim myArr3 As Variant

'4x5 cells
Set myRng = ActiveSheet.Range("a1:e4")

'second row of range
myArr2 = myRng.Rows(2).Value

'third col of range
myArr3 = myRng.Columns(3).Value

End Sub




johnmasvou wrote:

I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx


--

Dave Peterson

johnmasvou

Issue with arrays
 
Dave,

Thanks for the tip with the index function.

i found a way to fix my problem

Cheers,


"Dave Peterson" wrote:

I'm not quite sure what you're doing, but you may be able to use
application.index() to slice through the matrix:

Option Explicit
Sub testme()
Dim myArr1 As Variant
Dim myArr2 As Variant
Dim myArr3 As Variant

'4x5 matrix
myArr1 = ActiveSheet.Range("a1:e4").Value

'second row of myarr1
myArr2 = Application.Index(myArr1, 2)

'third col of myarr1
myArr3 = Application.Index(myArr1, , 3)

End Sub

But you can loop:

Option Explicit
Sub testme2()

Dim myArr1 As Variant
Dim myArr2 As Variant
Dim rCtr As Long
Dim cCtr As Long

'4x5 matrix
myArr1 = ActiveSheet.Range("a1:e4").Value

'pick off row 2
ReDim myArr2(LBound(myArr1, 2) To UBound(myArr1, 2))
rCtr = 2 'row 2
For cCtr = LBound(myArr1, 2) To UBound(myArr1, 2)
myArr2(cCtr) = myArr1(rCtr, cCtr)
Next cCtr

'pick off column 3
ReDim myArr3(LBound(myArr1, 1) To UBound(myArr1, 1))
cCtr = 3
For rCtr = LBound(myArr1, 1) To UBound(myArr1, 1)
myArr3(rCtr) = myArr1(rCtr, cCtr)
Next rCtr

End Sub

If you're picking up the values from a range, you could do something like:

Option Explicit
Sub testme3()

Dim myRng As Range
Dim myArr2 As Variant
Dim myArr3 As Variant

'4x5 cells
Set myRng = ActiveSheet.Range("a1:e4")

'second row of range
myArr2 = myRng.Rows(2).Value

'third col of range
myArr3 = myRng.Columns(3).Value

End Sub




johnmasvou wrote:

I have two functions.

Function A should return a matrix array (mxm) and at some point it calls
function B which has one agrument, a vector array (1xm). The output of
function B should be a vector array (1xm).

Using (probably) a loop, how can I assign each time the output of B as one
row on the matrix of function A?

Something like A(i,)=B(Zi) would work in other languages but what about in VB?

thx


--

Dave Peterson



All times are GMT +1. The time now is 12:34 PM.

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