ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Get First Letter of each word (https://www.excelbanter.com/excel-programming/406339-get-first-letter-each-word.html)

Les Stout[_2_]

Get First Letter of each word
 
Hi all,

I am trying to do get the first letter of each word to create it's
individual Identifier with code to use further on in my script. Examples
of the string below and then the Identifier.

Shatterprufe - Rear Window = SRW
Rehau - W/Shield Cvr & Package = RWCP
Shatterprufe - Side Glass = SSG
Rehau - Frt. Air Duct = RFAD

Thank you in advance for any help....


Best regards,

Les Stout

*** Sent via Developersdex http://www.developersdex.com ***

Ron Rosenfeld

Get First Letter of each word
 
On Wed, 20 Feb 2008 07:02:23 -0800, Les Stout wrote:

Hi all,

I am trying to do get the first letter of each word to create it's
individual Identifier with code to use further on in my script. Examples
of the string below and then the Identifier.

Shatterprufe - Rear Window = SRW
Rehau - W/Shield Cvr & Package = RWCP
Shatterprufe - Side Glass = SSG
Rehau - Frt. Air Duct = RFAD

Thank you in advance for any help....


Best regards,

Les Stout

*** Sent via Developersdex http://www.developersdex.com ***



Here are two methods that return a string consisting of the first letter in the
string and every subsequent letter that follows a <space.

One version uses regular expressions; the other takes advantage of VBA's Split
function. The Split function appeared, I believe, in XL2002.

========================================
Option Explicit
Function ID(str As String) As String
Dim re As Object, mc As Object, m As Object
Set re = CreateObject("vbscript.regexp")
re.ignorecase = True
re.Global = True
re.Pattern = "(^|\s)([A-Z])"
re.ignorecase = True
Set mc = re.Execute(str)
For Each m In mc
ID = ID & UCase(m.submatches(1))
Next m
End Function
'-------------------------------------------
Function IDa(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(str)

For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i

End Function
===========================================
--ron

Peter T

Get First Letter of each word
 
Just a heads up -

The Split function appeared, I believe, in XL2002.


Split and a number of other string functions first appeared in XL2000,
alternatives required for XL97

Regards,
Peter T



Les Stout[_2_]

Get First Letter of each word
 
Thanks so much Ron..

Best regards,

Les Stout

*** Sent via Developersdex http://www.developersdex.com ***

Les Stout[_2_]

Get First Letter of each word
 
Hi Ron, I am batteling a bit with the way to call this function, could
you give me an example please...

Thanks

Best regards,

Les Stout

*** Sent via Developersdex http://www.developersdex.com ***

Rick Rothstein \(MVP - VB\)[_1305_]

Get First Letter of each word
 
Hi Ron, I am batteling a bit with the way to call this function,
could you give me an example please...


Let's assume in **your** code, you have two variables named OriginalString
and FirstLettersOfEachWord, then...

' Not sure how your program is processing the orignal
' strings, but this line assumes they are, or can be, stored
' in a variable
OriginalString = "Shatterprufe - Rear Window"
' To use the ID function (which gives you the first letters of
' each word), simple pass the variable containing the original
' string of text into the function and use its return value
FirstLettersOfEachWord = ID(OriginalString)
' Show that the function worked
MsgBox FirstLettersOfEachWord

Rick


Rick Rothstein \(MVP - VB\)[_1306_]

Get First Letter of each word
 
Function IDa(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(str)

For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i

End Function


Just a point of information... using the UCase function in the If-Then
statement above (to parse upper and lower case letters) will work as shown,
but this should be more efficient:

If sTemp(i) Like "[a-zA-Z]*" Then

Rick


Ron Rosenfeld

Get First Letter of each word
 
On Wed, 20 Feb 2008 12:04:03 -0500, "Rick Rothstein \(MVP - VB\)"
wrote:

Function IDa(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(str)

For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i

End Function


Just a point of information... using the UCase function in the If-Then
statement above (to parse upper and lower case letters) will work as shown,
but this should be more efficient:

If sTemp(i) Like "[a-zA-Z]*" Then

Rick


Well, I wondered about checking that. So I ran a routine identical except for
the comparison statement (see code below).

For 10,000 repetitions, the UCase variation took 0.4375 seconds, whereas the
[a-zA-Z] variant took 1.125 seconds. So it would appear the UCase is the more
"efficient".

=================================
Option Explicit

Sub test()
Const Str As String = "Rehau - w/Shield Cvr & Package "
Dim sTemp() As String
sTemp = Split(Str)
Dim IDa As String
Dim dTimer As Double
Dim i As Long
Dim j As Long
Const lReps As Long = 10000

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If sTemp(i) Like "[a-zA-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

End Sub
===========================
0.4375
1.125
=========================

--ron

Ron Rosenfeld

Get First Letter of each word
 
On Wed, 20 Feb 2008 07:58:51 -0800, Les Stout wrote:

Hi Ron, I am batteling a bit with the way to call this function, could
you give me an example please...

Thanks

Best regards,

Les Stout

*** Sent via Developersdex http://www.developersdex.com ***


You mentioned using it in your "script" so I assume you have a macro, or other
function, running in which you want to call this.

So let's assume your string is in located in A1 of the active worksheet:

======================
Sub foo()
'Generate ID Code from string in A1
Dim IDCode As String

IDCode = ID(Range("A1"))
Debug.Print Range("a1"), IDCode

End Sub
=======================

And somewhere else in the module you have whichever of the two functions I
suggested.
--ron

Jim Cone

Get First Letter of each word
 
Ron,
Try my modified version of your code and see what you get.
~ 1.19 vs. 0.73
--
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware
(Excel Add-ins / Excel Programming)
'---

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Sub test()
Const Str As String = "Rehau - w/Shield Cvr & Package "
Dim sTemp() As String
sTemp = Split(Str)
Dim IDa As String
Dim dTimer As Long
Dim i As Long
Dim j As Long
Const lReps As Long = 100000 '<<<

dTimer = timeGetTime
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
IDa = vbNullString '<<<Note
Next j
MsgBox (timeGetTime - dTimer) / 1000

IDa = vbNullString
dTimer = timeGetTime
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If sTemp(i) Like "[a-zA-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
IDa = vbNullString '<<<Note
Next j
MsgBox (timeGetTime - dTimer) / 1000
End Sub
'---


"Ron Rosenfeld"
wrote in message
Well, I wondered about checking that. So I ran a routine identical except for
the comparison statement (see code below).

For 10,000 repetitions, the UCase variation took 0.4375 seconds, whereas the
[a-zA-Z] variant took 1.125 seconds. So it would appear the UCase is the more
"efficient".

=================================
Option Explicit

Sub test()
Const Str As String = "Rehau - w/Shield Cvr & Package "
Dim sTemp() As String
sTemp = Split(Str)
Dim IDa As String
Dim dTimer As Double
Dim i As Long
Dim j As Long
Const lReps As Long = 10000

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If sTemp(i) Like "[a-zA-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

End Sub
===========================
0.4375
1.125
=========================

--ron

Peter T

Get First Letter of each word
 
"Ron Rosenfeld" wrote in message
...
On Wed, 20 Feb 2008 12:04:03 -0500, "Rick Rothstein \(MVP - VB\)"
wrote:

Function IDa(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(str)

For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i

End Function


Just a point of information... using the UCase function in the If-Then
statement above (to parse upper and lower case letters) will work as

shown,
but this should be more efficient:

If sTemp(i) Like "[a-zA-Z]*" Then

Rick


Well, I wondered about checking that. So I ran a routine identical except

for
the comparison statement (see code below).

For 10,000 repetitions, the UCase variation took 0.4375 seconds, whereas

the
[a-zA-Z] variant took 1.125 seconds. So it would appear the UCase is the

more
"efficient".

=================================
Option Explicit

Sub test()
Const Str As String = "Rehau - w/Shield Cvr & Package "
Dim sTemp() As String
sTemp = Split(Str)
Dim IDa As String
Dim dTimer As Double
Dim i As Long
Dim j As Long
Const lReps As Long = 10000

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If sTemp(i) Like "[a-zA-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

End Sub
===========================
0.4375
1.125
=========================

--ron


Hi Ron,

I don't think those comparative tests are quite right.
Len(IDa) increases from 0-40000 in the first test, and continues up to 80000
in the second. Try reversing the order of the tests and the timings are
reversed (roughly)

If I reset IDa at the start of each loop -
For j = 1 To lReps
IDa = ""

I find both timings improve significantly with Like "[a-zA-Z]*" about twice
as quick as Ucase.

However if I comment this line
' IDa = IDa & UCase(Left(sTemp(i), 1))
the relative difference is much greater still in favour of Like "[a-zA-Z]*"
vs UCase

Regards,
Peter T




Rick Rothstein \(MVP - VB\)[_1309_]

Get First Letter of each word
 
Function IDa(str As String) As String
Dim sTemp() As String
Dim i As Long
sTemp = Split(str)

For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i

End Function


Just a point of information... using the UCase function in the If-Then
statement above (to parse upper and lower case letters) will work as
shown,
but this should be more efficient:

If sTemp(i) Like "[a-zA-Z]*" Then

Rick


Well, I wondered about checking that. So I ran a routine identical except
for
the comparison statement (see code below).

For 10,000 repetitions, the UCase variation took 0.4375 seconds, whereas
the
[a-zA-Z] variant took 1.125 seconds. So it would appear the UCase is the
more
"efficient".

=================================
Option Explicit

Sub test()
Const Str As String = "Rehau - w/Shield Cvr & Package "
Dim sTemp() As String
sTemp = Split(Str)
Dim IDa As String
Dim dTimer As Double
Dim i As Long
Dim j As Long
Const lReps As Long = 10000

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If UCase(sTemp(i)) Like "[A-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

dTimer = Timer
For j = 1 To lReps
For i = 0 To UBound(sTemp)
If sTemp(i) Like "[a-zA-Z]*" Then
IDa = IDa & UCase(Left(sTemp(i), 1))
End If
Next i
Next j

Debug.Print Timer - dTimer

End Sub
===========================
0.4375
1.125
=========================


As Peter pointed out, reverse the two tests and you get roughly the same
results, but now not using UCase comes out better. This may have something
to do with the increasing memory fragmentation taking place from all those
cumulative concatenation operations (the loops are so fast I am guessing
garbage collection is delayed until they have completed). In any event, just
looking at it logically, using the UCase function involves an extra function
call whereas once the Like operator's underlying code is kicked off, it
would seem that it would have very little extra to do to account for the
"a-z" check on top of the "A-Z" check... I can't see how executing the extra
function call would execute faster than running code without it, given that
both routines are making use of the Like operator.

Rick


Peter T

Get First Letter of each word
 
Hi Jim,

For some reason your message wasn't visible to me when I posted mine some 20
min later. Had it been I wouldn't have duplicated with pretty much the same
observation (reset the variable IDa in each loop gives significantly
different results).

Regards,
Peter T



Jim Cone

Get First Letter of each word
 

Hi Peter,
Guess I had better pay that bill my ISP sent me. <g
Regards,
Jim Cone


"Peter T"
<peter_t@discussions
wrote in message
Hi Jim,
For some reason your message wasn't visible to me when I posted mine some 20
min later. Had it been I wouldn't have duplicated with pretty much the same
observation (reset the variable IDa in each loop gives significantly
different results).
Regards,
Peter T



Peter T

Get First Letter of each word
 
Perhaps you could pay mine too whilst you're at it <g

Regards,
Peter T

"Jim Cone" wrote in message
...

Hi Peter,
Guess I had better pay that bill my ISP sent me. <g
Regards,
Jim Cone


"Peter T"
<peter_t@discussions
wrote in message
Hi Jim,
For some reason your message wasn't visible to me when I posted mine some

20
min later. Had it been I wouldn't have duplicated with pretty much the

same
observation (reset the variable IDa in each loop gives significantly
different results).
Regards,
Peter T





Ron Rosenfeld

Get First Letter of each word
 
On Wed, 20 Feb 2008 11:14:45 -0800, "Jim Cone" wrote:

Ron,
Try my modified version of your code and see what you get.
~ 1.19 vs. 0.73
--
Jim Cone
San Francisco, USA
http://www.realezsites.com/bus/primitivesoftware
(Excel Add-ins / Excel Programming)


Jim,

I see what you are doing and didn't realize that would happen.

~ 1.19 vs. 0.73


I get 0.739 vs 0.44

So the Ucase is definitely slower.

Thanks for that.
--ron

Ron Rosenfeld

Get First Letter of each word
 
On Wed, 20 Feb 2008 15:05:16 -0500, "Rick Rothstein \(MVP - VB\)"
wrote:

As Peter pointed out, reverse the two tests and you get roughly the same
results, but now not using UCase comes out better. This may have something
to do with the increasing memory fragmentation taking place from all those
cumulative concatenation operations (the loops are so fast I am guessing
garbage collection is delayed until they have completed). In any event, just
looking at it logically, using the UCase function involves an extra function
call whereas once the Like operator's underlying code is kicked off, it
would seem that it would have very little extra to do to account for the
"a-z" check on top of the "A-Z" check... I can't see how executing the extra
function call would execute faster than running code without it, given that
both routines are making use of the Like operator.

Rick


See Jim Cone's post and my response to him. In brief, the Ucase *IS* slower.
--ron


All times are GMT +1. The time now is 11:02 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com