Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > microsoft.public.excel.programming > #110935 > unrolled thread
| Started by | Matthew Dyer <matthew.e.dyer@gmail.com> |
|---|---|
| First post | 2019-05-21 12:39 -0700 |
| Last post | 2019-06-07 11:23 -0400 |
| Articles | 5 — 3 participants |
Back to article view | Back to microsoft.public.excel.programming
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
| From | Matthew Dyer <matthew.e.dyer@gmail.com> |
|---|---|
| Date | 2019-05-21 12:39 -0700 |
| Subject | Array 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]
| From | GS <gs@v.invalid> |
|---|---|
| Date | 2019-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]
| From | GS <gs@v.invalid> |
|---|---|
| Date | 2019-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]
| From | Rich D'Angelo <Rich.DAngelo.174012b9@excelbanter.com> |
|---|---|
| Date | 2019-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]
| From | GS <gs@v.invalid> |
|---|---|
| Date | 2019-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