Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Excel / Programming / September 2007

Tip: Looking for answers? Try searching our database.

Array Pointer

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Mike H. - 07 Sep 2007 17:30 GMT
Is there an array pointer available in VBA?  I use it in other languages to
easily and quickly sort and search arrays.  My problem is I have two very
large spreadsheets and want to get data from one to the other based on a link
and the arraypointer would make this easier in my opinion.  A simple vlookup
formula in the spreadsheet is very slow for a large qty of numbers so I don't
really want to use it.  Any ideas?
Bernie Deitrick - 07 Sep 2007 17:55 GMT
Mike,

VBA does not use pointers.

A better explanation of what you are doing may lead to some suggestions on ways to improve speed....

HTH,
Bernie
MS Excel MVP

> Is there an array pointer available in VBA?  I use it in other languages to
> easily and quickly sort and search arrays.  My problem is I have two very
> large spreadsheets and want to get data from one to the other based on a link
> and the arraypointer would make this easier in my opinion.  A simple vlookup
> formula in the spreadsheet is very slow for a large qty of numbers so I don't
> really want to use it.  Any ideas?
Mike H. - 07 Sep 2007 18:44 GMT
Here is what I do.  I read into Dataarray() all my entries in a spreadsheet
(about 5000).  The array is like this:  Dataarray(REC#,1)=Account #
DataArray(Rec#,2)=Account description if there is one (if it is a valid
account).  To fill in the second element I do this:

Windows("Chart of Accounts.xls").Activate
Sheets("Entire Chart").Select
Let Counterx = 0
For YY = 1 To X
   Let XX = 0
   Set myRange = Range("A1:A65000")
   flag = 0
   For Each c In myRange
       Let XX = XX + 1
       If c.Value = DataArray(YY, 1) Then flag = 1
       If flag = 1 Then
           Exit For
       End If
   Next
   If flag = 1 Then
       DataArray(YY, 2) = Cells(XX, 2)
   Else
       Let Counterx = Counterx + 1
       BadAccts(Counterx, 1) = DataArray(YY, 1)
       'MsgBox ("Account " & DataArray(YY, 1) & " is not in the chart of
accounts!")
   End If
Next

This code takes about 45 minutes to go through 5000 records.  Any
suggestions would be welcomed.
Bernie Deitrick - 07 Sep 2007 19:14 GMT
Mike,

Not sure where your Account#/Account desc table is, but assuming that it is in columns A and B

For i = LBound(DataArray) To UBound(DataArray)
DataArray(i, 2) = Application.WorksheetFunction.VLookup(DataArray(i, 1), Range("A:B"), 2, False)
Next i

But why are you putting this into an array?  You could just use the VLOOKUP whenever you want the
value.

HTH,
Bernie
MS Excel MVP

> Here is what I do.  I read into Dataarray() all my entries in a spreadsheet
> (about 5000).  The array is like this:  Dataarray(REC#,1)=Account #
[quoted text clipped - 27 lines]
> This code takes about 45 minutes to go through 5000 records.  Any
> suggestions would be welcomed.
Mike H. - 07 Sep 2007 19:22 GMT
I don't have to put it into an array.  I just want the description for the
account in my journal entry file so that I can verify it is a valid account
before I upload it.  I will see how this goes.  Thanks.
Mike H. - 10 Sep 2007 13:02 GMT
Bernie, This works tremendously!  Instead of 45 minutes, it takes less than
45 seconds.  Just one question, the LBound and UBound, does that stand for
lower and upper boundary or something like that?  

> Mike,
>
[quoted text clipped - 42 lines]
> > This code takes about 45 minutes to go through 5000 records.  Any
> > suggestions would be welcomed.
Bernie Deitrick - 10 Sep 2007 14:08 GMT
Mike,

LBound and UBound are used to read the lower and upper bounds of arrays whose size you don't know.

If you had coded

Dim DataArray(1 to 5000) As Double

then it would be okay to use

For i = 1 To 5000

But a lot of operations return arrays of unknown size, so using LBound and UBound to read the size
makes sense.  There is one other complication - Option Base, which can be used to set the Lower
bound of arrays automatically...

HTH,
Bernie
MS Excel MVP

> Bernie, This works tremendously!  Instead of 45 minutes, it takes less than
> 45 seconds.  Just one question, the LBound and UBound, does that stand for
[quoted text clipped - 46 lines]
>> > This code takes about 45 minutes to go through 5000 records.  Any
>> > suggestions would be welcomed.
Mike H. - 10 Sep 2007 14:16 GMT
Why would the lower bound not always be one?   Would not an array be
populated from 1 to x?  

> Mike,
>
[quoted text clipped - 66 lines]
> >> > This code takes about 45 minutes to go through 5000 records.  Any
> >> > suggestions would be welcomed.
Gary Keramidas - 10 Sep 2007 14:25 GMT
try this:
Sub test()
Dim arr As Variant
arr = Array("A", "B", "C")
MsgBox arr(0)
End Sub

Signature

Gary

> Why would the lower bound not always be one?   Would not an array be
> populated from 1 to x?
[quoted text clipped - 76 lines]
>> >> > This code takes about 45 minutes to go through 5000 records.  Any
>> >> > suggestions would be welcomed.
Mike H. - 10 Sep 2007 15:08 GMT
On the msgbox() line, I get runtime error 9, subscript out of range.

> try this:
> Sub test()
[quoted text clipped - 83 lines]
> >> >> > This code takes about 45 minutes to go through 5000 records.  Any
> >> >> > suggestions would be welcomed.
Gary Keramidas - 10 Sep 2007 17:36 GMT
even if you try it in a new workbook?
do you have option base 1 at the top of your module?
try this and see if you get the same result:

Option Base 0
Sub test()
Dim arr As Variant
arr = Array("A", "B", "C")
MsgBox arr(0)
End Sub
Signature


Gary

> On the msgbox() line, I get runtime error 9, subscript out of range.
>
[quoted text clipped - 92 lines]
>> >> >> > This code takes about 45 minutes to go through 5000 records.  Any
>> >> >> > suggestions would be welcomed.
Mike H. - 10 Sep 2007 17:46 GMT
In an empty sheet, I get "A".
Mike H. - 10 Sep 2007 17:46 GMT
In an empty sheet, I get "A".
Bernie Deitrick - 10 Sep 2007 14:31 GMT
> Would not an array be populated from 1 to x?

No. Many arrays are 0 based by default, which is from indexing in binary (0 to 7 can be done using
the same number of bits, 1 to 8 requires one more bit than that):

Sub CompareArrays()
Dim FileArray As Variant
Dim myArray As Variant

myArray = Array(4, 5, 6)

FileArray = Application.GetOpenFilename(MultiSelect:=True)
If IsArray(FileArray) Then
 MsgBox "The lower bound of the file array is " & LBound(FileArray)
End If
MsgBox "The lower bound of the constant array is " & LBound(myArray)

End Sub

But then try the same macro with this at the top of your codemodule

Option Base 1

and then again with

Option Base 0

And, IF you use

Dim myArray(1 to 3) As Variant

Then you have to use this

myArray(1) = 4
myArray(2) = 5
myArray(3) = 6

instead of just estting the variant to an array.

HTH,
Bernie
MS Excel MVP

> Why would the lower bound not always be one?   Would not an array be
> populated from 1 to x?
[quoted text clipped - 73 lines]
>> >> > This code takes about 45 minutes to go through 5000 records.  Any
>> >> > suggestions would be welcomed.
Chip Pearson - 25 Sep 2007 22:11 GMT
> Why would the lower bound not always be one?   Would not an array be
> populated from 1 to x?

You can have any lower and upper bound you want.

Dim Arr(-100 To 100) As Long
Debug.Print LBound(Arr), UBound(Arr)

Signature

Cordially,
Chip Pearson
Microsoft MVP  - Excel
Pearson Software Consulting
www.cpearson.com
(email on the web site)

> Why would the lower bound not always be one?   Would not an array be
> populated from 1 to x?
[quoted text clipped - 80 lines]
>> >> > This code takes about 45 minutes to go through 5000 records.  Any
>> >> > suggestions would be welcomed.
Richard Winstone - 08 Sep 2007 18:01 GMT
Take a look at this link:
http://www.ozgrid.com/News/LookUpMatchIndexVBAFind.htm

One of the FindBillyBrown() routines look close to what you want.

>Is there an array pointer available in VBA?  I use it in other languages to
>easily and quickly sort and search arrays.  My problem is I have two very
>large spreadsheets and want to get data from one to the other based on a link
>and the arraypointer would make this easier in my opinion.  A simple vlookup
>formula in the spreadsheet is very slow for a large qty of numbers so I don't
>really want to use it.  Any ideas?

Richard
--
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.