pulling out Numbers

G

Guest

hi,
how can I pull out numbers from a string?like:
aa012985 to 012985
12ab-059 to 12059
the letters or characters might be either at the first, middle or at the end
of a string.
thanx in advance.
 
G

Guest

With a macro:-

Sub removeletters()
For Each cell In Selection
For a = 1 To Len(cell)
If Asc(Mid(cell, a, 1)) > 47 And Asc(Mid(cell, a, 1)) < 59 Or _
Asc(Mid(cell, a, 1)) > 64 And Asc(Mid(cell, a, 1)) < 91 Then _
newstring = newstring & Mid(cell, a, 1)
Next
cell.Value = newstring
ActiveCell.NumberFormat = "General"
newstring = ""
Next
End Sub

Select the cells to convert and run this

Mike
 
R

Ron Rosenfeld

hi,
how can I pull out numbers from a string?like:
aa012985 to 012985
12ab-059 to 12059
the letters or characters might be either at the first, middle or at the end
of a string.
thanx in advance.

You can use a UDF.

To enter the UDF, <alt-F11> opens the VB Editor.

Ensure your project is highlighted in the Project Explorer window, then
Insert/Module and paste the code below into the window that opens.

To use this UDF, enter =ExtrNums(cell_ref) into some cell.

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

Function ExtrNums(str As String)
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = "\D"
ExtrNums = re.Replace(str, "")
End Function
================================


--ron
 
G

Guest

thank you so much.that's great!!!!!!!!!!

Ron Rosenfeld said:
You can use a UDF.

To enter the UDF, <alt-F11> opens the VB Editor.

Ensure your project is highlighted in the Project Explorer window, then
Insert/Module and paste the code below into the window that opens.

To use this UDF, enter =ExtrNums(cell_ref) into some cell.

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

Function ExtrNums(str As String)
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = "\D"
ExtrNums = re.Replace(str, "")
End Function
================================


--ron
 
G

Guest

Another way.

I'm a bit cofused why the previous method only removed th dash but try this

Sub anotherway()
For Each cell In Selection
For a = 1 To Len(cell)
Select Case Mid(cell, a, 1)
Case "0" To "9"
newstring = newstring & Mid(cell, a, 1)
End Select
Next a
cell.Value = newstring
ActiveCell.NumberFormat = "General"
newstring = ""
Next cell
End Sub

Mike
 
G

Guest

thanx mike,it works.I really appreciate it.


Mike H said:
Another way.

I'm a bit cofused why the previous method only removed th dash but try this

Sub anotherway()
For Each cell In Selection
For a = 1 To Len(cell)
Select Case Mid(cell, a, 1)
Case "0" To "9"
newstring = newstring & Mid(cell, a, 1)
End Select
Next a
cell.Value = newstring
ActiveCell.NumberFormat = "General"
newstring = ""
Next cell
End Sub

Mike
 
G

Guest

Ron,

Excellent. any chance of a quick rundown on how it works or a web reference
please?

Mike H
 
R

Ron Rosenfeld

With a macro:-

Sub removeletters()
For Each cell In Selection
For a = 1 To Len(cell)
If Asc(Mid(cell, a, 1)) > 47 And Asc(Mid(cell, a, 1)) < 59 Or _
Asc(Mid(cell, a, 1)) > 64 And Asc(Mid(cell, a, 1)) < 91 Then _
newstring = newstring & Mid(cell, a, 1)
Next
cell.Value = newstring
ActiveCell.NumberFormat = "General"
newstring = ""
Next
End Sub


Your For/Next loop can be simplified:


For a = 1 To Len(cell)
If Mid(cell, a, 1) Like "#" Then
newstring = newstring & Mid(cell, a, 1)
End If
Next


--ron
 
G

Guest

hi Mike,
the problem is , it removes the zero at the begining of a numbers after
pulling out them,like:
aab0125 turns to 125 instead of 0125
 
G

Guest

hi Ron,
the problem in Mikes macro is , it removes the zero at the begining of a
numbers after pulling out them,like:
aab0125 turns to 125 instead of 0125
 
R

Ron Rosenfeld

Mike,

It uses "Regular Expressions" which is a feature included with VBA.

The CreateObject method sets up the reference to Microsoft VBScript Regular
Expressions 5.5. Instead of that method, one can also select Tools/References
(from the VBEditor top menu) and select that as a reference. This latter
method has the advantage that properties will pop up when you are writing the
macro, as they do for other objects.

The Pattern "\D" means "match every character that is not a digit (not 0..9).
The replace method then looks at "str" and replaces every match with nothing
(""), thereby removing all the non-digits.

http://support.microsoft.com/default.aspx?scid=kb;en-us;818802&Product=vbb
http://msdn2.microsoft.com/en-us/library/1400241x.aspx



Ron,

Excellent. any chance of a quick rundown on how it works or a web reference
please?

Mike H

--ron
 
S

Sandy Mann

I think that it does remove leading zeros Mike. Is it not necause you
format the cell as General?

--
Regards,

Sandy
In Perth, the ancient capital of Scotland
and the crowning place of kings

(e-mail address removed)
Replace @mailinator.com with @tiscali.co.uk
 
G

Guest

Thanks Ron,

I'm only on my 4th read of John Walkenbach's 2003 bible so perhaps some way
off this yet.

Mike
 
R

Ron Rosenfeld

Thanks Ron,

I'm only on my 4th read of John Walkenbach's 2003 bible so perhaps some way
off this yet.

Mike

Regular expressions are extremely powerful tools for string manipulation.
Harlan Grove turned me on to them, and I've found them quite worthwhile,
although I'm still a novice in their use.
--ron
 
R

Ron Rosenfeld

hi Ron,
Can we do it reverse.pulling out only letters.
aa125df36 to aadf????
thank you

It's pretty simple. In the code I posted, you just need to change the "\D",
which selects all non-digits for removal, to a "\d" which selects all digits
for removal.

But for more flexibility, you could include the arguments for what to find, and
what to replace it with, in the function code.

For example, with this UDF:

=====================================
Option Explicit
Function ReSub(str As String, FindText As String, ReplaceWith As String)
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = FindText
ReSub = re.Replace(str, ReplaceWith)
End Function
======================================

You could use this formula to replace all digits with a null string, resulting
in pulling out only letters:

=resub(A1,"\d","")

If you wanted to pull out only digits, then:

=resub(A1,"\D","")

If you wanted to replace the digits with a tilde, you could use:

=resub(A1,"\d","~")

If you wanted to replace all of the letters with the word Peyman, with leading
and ending spaces, then:

=resub(A6,"\D"," Peyman ")

And many other solutions

--ron
 
G

Guest

thanx Ron.It's excellent

Ron Rosenfeld said:
It's pretty simple. In the code I posted, you just need to change the "\D",
which selects all non-digits for removal, to a "\d" which selects all digits
for removal.

But for more flexibility, you could include the arguments for what to find, and
what to replace it with, in the function code.

For example, with this UDF:

=====================================
Option Explicit
Function ReSub(str As String, FindText As String, ReplaceWith As String)
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = FindText
ReSub = re.Replace(str, ReplaceWith)
End Function
======================================

You could use this formula to replace all digits with a null string, resulting
in pulling out only letters:

=resub(A1,"\d","")

If you wanted to pull out only digits, then:

=resub(A1,"\D","")

If you wanted to replace the digits with a tilde, you could use:

=resub(A1,"\d","~")

If you wanted to replace all of the letters with the word Peyman, with leading
and ending spaces, then:

=resub(A6,"\D"," Peyman ")

And many other solutions

--ron
 

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