Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > microsoft.public.excel.programming > #110935 > unrolled thread

Array Logic Test

Started byMatthew Dyer <matthew.e.dyer@gmail.com>
First post2019-05-21 12:39 -0700
Last post2019-06-07 11:23 -0400
Articles 5 — 3 participants

Back to article view | Back to microsoft.public.excel.programming


Contents

  Array Logic Test Matthew Dyer <matthew.e.dyer@gmail.com> - 2019-05-21 12:39 -0700
    Re: Array Logic Test GS <gs@v.invalid> - 2019-05-21 20:06 -0400
      Re: Array Logic Test GS <gs@v.invalid> - 2019-05-21 20:09 -0400
        Re: Array Logic Test Rich D'Angelo <Rich.DAngelo.174012b9@excelbanter.com> - 2019-06-07 13:26 +0100
          Re: Array Logic Test GS <gs@v.invalid> - 2019-06-07 11:23 -0400

#110935 — Array Logic Test

FromMatthew Dyer <matthew.e.dyer@gmail.com>
Date2019-05-21 12:39 -0700
SubjectArray Logic Test
Message-ID<876e349f-cfd2-4832-aee2-0fa9d010498d@googlegroups.com>
For whatever reason, I'm stuck on this problem. 

I know how to loop through an Array and then 'do things' if my test item is in the array:

Dim Arr(1 to 4) as String, Element as Variant
'code assigning values to Arr(1 to 4) here

For Each Element in Arr
   If InStr(StartString, Element) > 0 Then Call 'subroutine here
Next


What I'm trying to do is to do things if Element is Not in StartString. I've thought about putting a nested Boolean in the loop, default it to False, loop through the entire array and swap it to True if there's a hit, then test the Boolean to determine to take the next action or not:


Dim Tester as Boolean, Element as Variant, Arr(1 to 4) as String
'code assigning values to Arr(1 to 4) here

Tester = False
For Each Element in Arr
  If InStr(StartString, Element) > 0 Then Tester = True
Next

If Tester = True Then Call 'subroutine here


Is there a more effective/efficient way to accomplish this? Am I trying to overcomplicate it and this is the best route to take?

[toc] | [next] | [standalone]


#110936

FromGS <gs@v.invalid>
Date2019-05-21 20:06 -0400
Message-ID<qc23qu$j0l$1@dont-email.me>
In reply to#110935
> For whatever reason, I'm stuck on this problem. 
>
> I know how to loop through an Array and then 'do things' if my test item is 
> in the array:
>
> Dim Arr(1 to 4) as String, Element as Variant
> 'code assigning values to Arr(1 to 4) here
>
> For Each Element in Arr
>    If InStr(StartString, Element) > 0 Then Call 'subroutine here
> Next
>
>
> What I'm trying to do is to do things if Element is Not in StartString. I've 
> thought about putting a nested Boolean in the loop, default it to False, loop 
> through the entire array and swap it to True if there's a hit, then test the 
> Boolean to determine to take the next action or not:
>
>
> Dim Tester as Boolean, Element as Variant, Arr(1 to 4) as String
> 'code assigning values to Arr(1 to 4) here
>
> Tester = False
> For Each Element in Arr
>   If InStr(StartString, Element) > 0 Then Tester = True
> Next
>
> If Tester = True Then Call 'subroutine here
>
>
> Is there a more effective/efficient way to accomplish this? Am I trying to 
> overcomplicate it and this is the best route to take?

A few Q's:
  Why are you sizing 1 to 4, specifically rather than using a zero-based array?

  Why are you using a For Each loop rather than a counter loop (For...Next)?

  Do you need to know the position if the element is in StartString?

  What is StartString?
    Could it be better named to more accurately depict/suggest its purpoase?
    (InStr takes Start as its 1st arg and so this var name is somewhat
     misleading)

If InStr(StartString, Element) = 0 Then 'it's not there!
  so...  Tester = (InStr(StartString, Element) > 0)
  ..will result true if its there, false if not!

I prefer a different approach...

Const sCheckString$ = "some text that might contain certain sub-texts"
Assumes array values are not from a worksheet:
  Dim iPos%, n&, vData(4)
  'code to load array
  vData(0) = 'value
  vData(1) = 'value
  vData(2) = 'value
  vData(3) = 'value

  'loop the array
  For n = LBound(vData) to UBound(vData)
    iPos = InStr(CheckString, vData(n))
    If iPos = 0 Then 'not there
      'do this
    Else 'is there
      'do this
    End If 'iPos = 0
  Next '

Assumes array values are from a worksheet:
  Dim iPos%, n&, vData
  vData = ActiveSheet.Range("A1:A4) 'dump it into a 2D array in one shot

  'loop the array
  For n = LBound(vData) to UBound(vData)
    iPos = InStr(CheckString, vData(n, 1)) 'specify the (row, col)
    If iPos = 0 Then 'not there
      'do this
    Else 'is there
      'do this
    End If 'iPos = 0
  Next '

Assumes array values are from a text file:
  Dim iPos%, n&, vData, sTextIn$, sFile$

  sFile = Get_FileToOpen: If sFile = "" Then Exit Sub
  sTextIn = ReadTextFile(sFile): vData = Split(sTextIn, vbCrLf)

  'loop the array
  For n = LBound(vData) to UBound(vData)
    iPos = InStr(CheckString, vData(n))
    If iPos = 0 Then 'not there
      'do this
    Else 'is there
      'do this
    End If 'iPos = 0
  Next '


Function Get_FileToOpen$(Optional FileTypes$)
  Dim vFile
  If FileTypes = "" Then FileTypes = "All Files ""*.*"", *.*"
  vFile = Application.GetOpenFileName(FileTypes)
  Get_FileToOpen = IIf(vFile = False, "", vFile)
End Function

'The helper functions...

Sub Test_ReadTextFile()
  Dim vTextIn As Variant, lNumLines As Long
  Dim oTimer As New cHiResTimer
  oTimer.StartTimer
  vTextIn = Split(ReadTextFile("c:\vbastuff\combinedvbastuff.txt"), vbCrLf)
  lNumLines = UBound(vTextIn) + 1
  oTimer.StopTimer
  Debug.Print "ElapsedTime: " & Format(oTimer.Elapsed, "#.0000") & " seconds;" 
& " Line Count: " & Format(lNumLines, "#,000")
  Set oTimer = Nothing
End Sub

-- 
Garry

Free usenet access at http://www.eternal-september.org
Classic VB Users Regroup!
  comp.lang.basic.visual.misc
  microsoft.public.vb.general.discussion

[toc] | [prev] | [next] | [standalone]


#110937

FromGS <gs@v.invalid>
Date2019-05-21 20:09 -0400
Message-ID<qc240k$jtt$1@dont-email.me>
In reply to#110936
Oops.., some typos...
>
> A few Q's:
>   Why are you sizing 1 to 4, specifically rather than using a zero-based 
> array?
>
>   Why are you using a For Each loop rather than a counter loop (For...Next)?
>
>   Do you need to know the position if the element is in StartString?
>
>   What is StartString?
>     Could it be better named to more accurately depict/suggest its purpoase?
>     (InStr takes Start as its 1st arg and so this var name is somewhat
>      misleading)
>
> If InStr(StartString, Element) = 0 Then 'it's not there!
>   so...  Tester = (InStr(StartString, Element) > 0)
>   ..will result true if its there, false if not!
>
> I prefer a different approach...
>
> Const sCheckString$ = "some text that might contain certain sub-texts"
> Assumes array values are not from a worksheet:
>   Dim iPos%, n&, vData(4)
>   'code to load array
>   vData(0) = 'value
>   vData(1) = 'value
>   vData(2) = 'value
>   vData(3) = 'value
>
>   'loop the array
>   For n = LBound(vData) to UBound(vData)
      iPos = InStr(sCheckString, vData(n))
>     If iPos = 0 Then 'not there
>       'do this
>     Else 'is there
>       'do this
>     End If 'iPos = 0
>   Next '
>
> Assumes array values are from a worksheet:
>   Dim iPos%, n&, vData
>   vData = ActiveSheet.Range("A1:A4) 'dump it into a 2D array in one shot
>
>   'loop the array
>   For n = LBound(vData) to UBound(vData)
      iPos = InStr(sCheckString, vData(n, 1)) 'specify the (row, col)
>     If iPos = 0 Then 'not there
>       'do this
>     Else 'is there
>       'do this
>     End If 'iPos = 0
>   Next '
>
> Assumes array values are from a text file:
>   Dim iPos%, n&, vData, sTextIn$, sFile$
>
>   sFile = Get_FileToOpen: If sFile = "" Then Exit Sub
>   sTextIn = ReadTextFile(sFile): vData = Split(sTextIn, vbCrLf)
>
>   'loop the array
>   For n = LBound(vData) to UBound(vData)
      iPos = InStr(sCheckString, vData(n))
>     If iPos = 0 Then 'not there
>       'do this
>     Else 'is there
>       'do this
>     End If 'iPos = 0
>   Next '
>
>
> Function Get_FileToOpen$(Optional FileTypes$)
>   Dim vFile
>   If FileTypes = "" Then FileTypes = "All Files ""*.*"", *.*"
>   vFile = Application.GetOpenFileName(FileTypes)
>   Get_FileToOpen = IIf(vFile = False, "", vFile)
> End Function
>
> 'The helper functions...
>
> Sub Test_ReadTextFile()
>   Dim vTextIn As Variant, lNumLines As Long
>   Dim oTimer As New cHiResTimer
>   oTimer.StartTimer
>   vTextIn = Split(ReadTextFile("c:\vbastuff\combinedvbastuff.txt"), vbCrLf)
>   lNumLines = UBound(vTextIn) + 1
>   oTimer.StopTimer
>   Debug.Print "ElapsedTime: " & Format(oTimer.Elapsed, "#.0000") & " 
> seconds;" & " Line Count: " & Format(lNumLines, "#,000")
>   Set oTimer = Nothing
> End Sub

-- 
Garry

Free usenet access at http://www.eternal-september.org
Classic VB Users Regroup!
  comp.lang.basic.visual.misc
  microsoft.public.vb.general.discussion

[toc] | [prev] | [next] | [standalone]


#110975

FromRich D'Angelo <Rich.DAngelo.174012b9@excelbanter.com>
Date2019-06-07 13:26 +0100
Message-ID<Rich.DAngelo.174012b9@excelbanter.com>
In reply to#110937
Possibly you left out the "=" in this line...

If InStr(StartString, Element) 0 Then Tester = True




-- 
Rich D'Angelo

[toc] | [prev] | [next] | [standalone]


#110976

FromGS <gs@v.invalid>
Date2019-06-07 11:23 -0400
Message-ID<qddvh3$gq8$1@dont-email.me>
In reply to#110975
> Possibly you left out the "=" in this line...
>
> If InStr(StartString, Element) 0 Then Tester = True

Hey Rich,
Possibly you replied to the wrong thread! Also, that line reads...

  If InStr(StartString, Element) > 0 Then Tester = True

..where your line omits the greater than character before 0.

-- 
Garry

Free usenet access at http://www.eternal-september.org
Classic VB Users Regroup!
  comp.lang.basic.visual.misc
  microsoft.public.vb.general.discussion

[toc] | [prev] | [standalone]


Back to top | Article view | microsoft.public.excel.programming


csiph-web