View Single Post
  #2   Report Post  
Posted to microsoft.public.excel.programming
Rob van Gelder[_4_] Rob van Gelder[_4_] is offline
external usenet poster
 
Posts: 1,236
Default Handling ubound on an uninitialised array

I do the On Error Resume Next thing to determine the length of an array...
I've seen others do it to.

To wipe an array use the Erase statement.

Sub test()
Dim arr() As String, lng As Long

' ReDim arr(0)

lng = -1
On Error Resume Next
lng = UBound(arr)
On Error GoTo 0

MsgBox "array length is " & IIf(lng = -1, "empty", lng)

Erase arr
End Sub

Just a note. If I were you, I would start working in Option Base 0. It is
more compatible with other programming languages.


--
Rob van Gelder - http://www.vangelder.co.nz/excel


"Mike NG" wrote in message
...
Two part question....

I have the following code driver to show the example

The Links array will have been populated with values
I then want to call my Filter subroutine, to find links which match
sFilter, and add them to the Target array - called filter

The code below works, but I'd like to avoid the "On error" if I could.
In the debugger I see first time in that sTarget has a value of Nothing,
but I can't work out how to test for this. Both
if sTarget is Nothing and
if sTarget() is Nothing
fail. What do I need to do to solve this

Option Explicit
Option Base 1

Type LinkInfo
href As String
InnerText As String
End Type

Dim Links() As LinkInfo
Dim Filtered() As LinkInfo
Sub Setup()

ReDim Links(4)
Links(1).href = "AAAAA"
Links(2).href = "ABBBA"
Links(3).href = "AAACCC"
Links(4).href = "ADDDA"

Filter Links, Filtered, "AA"
Filter Links, Filtered, "DDD"
Links(4).href = "ADDDA"

End Sub
Sub Filter(sSource() As LinkInfo, sTarget() As LinkInfo, sFilter As
String)

Dim iIndex As Integer
Dim iLength As Integer

On Error Resume Next
iLength = UBound(sTarget)
On Error GoTo 0

For iIndex = 1 To UBound(sSource)
If sSource(iIndex).href Like "*" & sFilter & "*" Then
iLength = iLength + 1

If iLength = 1 Then
ReDim sTarget(1)
Else
ReDim Preserve sTarget(iLength)
End If

sTarget(iLength) = sSource(iIndex)
End If
Next

End Sub


Part Two...
Suppose Filtered() was a global variable.
How would I "clear it down" so that I could manipulate a further set of
links and effectively start over?
The only code that will work is
ReDim Filtered(1)


so I suppose all of the above is going to point to me using an option
base of 0 - and wasting that element of the array. This will then
provide a solution for my uninitialised array in my Filter routine. Is
that what you reckon?
--
Mike
Please post replies to newsgroup to benefit others
Replace dead spam with ntl world to reply by email