Accessing substrings quickly

R

Robert Crandal

Do I need to use the "Mid" function each time I want
to access a substring??

For example, rather than using the following:

mysubstring = Mids(src, 5, 1) ' get 5th character/string

can't I use some other array/index notation
like the following:

mysubstring = src(5)


I get the impression that my code would run a lot faster
if I could access my substrings by an index, rather than
making calls to functions such as Mids(), Instr(), etc....

thank u
 
R

Rick Rothstein

The Mid function is one of VB's fastest executing functions... you won't
find a faster way to extract a character from a string than it.
 
C

Charles Williams

If you need to access several of the individual characters in the string, or
handle the characters as numbers, it can be faster to use a Byte array:

Private Sub somebytes()

Dim aBytes() As Byte
Dim StrLongString As String
Dim strChar As String

StrLongString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
aBytes = StrLongString
strChar = Chr(aBytes(8))
MsgBox strChar

End Sub

Charles
___________________________________
The Excel Calculation Site
http://www.decisionmodels.com
 
R

Rick Rothstein

This may be a duplicate posting as I can't see the first one I sent
=====================================================================

I think you need to convert this statement...

aBytes = StrLongString

to this...

aBytes = StrConv(StrLongString, vbFromUnicode)

in order to get your method to work. Also note that the Byte array that is
produced will always be zero-based even if you have your Option Base set to
1, so if you want the 8th character in the text, you have to remember to use
7 as the index to the array.
 
R

Rick Rothstein

This may be a triplicate posting as I can't see the first two I posted.
I removed your original message in case that was the problem.
=======================================================================

I think you need to convert this statement...

aBytes = StrLongString

to this...

aBytes = StrConv(StrLongString, vbFromUnicode)

in order to get your method to work. Also note that the Byte array that is
produced will always be zero-based even if you have your Option Base set to
1, so if you want the 8th character in the text, you have to remember to use
7 as the index to the array.
 
C

Charles Williams

Rick,

Both methods work, but in a slightly different way:

aBytes = StrLongString

gives you a zero-based Byte array containing two bytes for each character
(character number, unicode code page number),
so Chr(aBytes(8)) gives you the 5th character (E) as in the OP's example

aBytes = StrConv(StrLongString, vbFromUnicode)

gives you a zero-based byte array containing one byte for each character
(character number in the current default code page)
so Chr(Abytes(4)) gives you the 5th character (E) as in the OP's example

I favour the 2-byte approach because its easier to recreate
strings/substrings by reassigning the Byte array to a string
strChar = aBytes
gives you back the string from the byte array

Private Sub somebytes()

Dim aBytes() As Byte
Dim StrLongString As String
Dim strChar As String

StrLongString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
aBytes = StrLongString
strChar = aBytes
MsgBox strChar

End Sub

Charles
___________________________________
The Excel Calculation Site
http://www.decisionmodels.com
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top