Giúp mình tách số ra khỏi chuỗi thành số riêng trong từng ô

Liên hệ QC

hung1981

Thành viên mới
Tham gia
20/12/06
Bài viết
15
Được thích
3
có thể giúp em vấn đề này được không:
hôm trước trên diễn đàn có bài tách số ra khỏi chuỗi nhưng các số sau khi tách lại không tách riêng ra
Em có chuỗi sau muốn tạo 1 macro tách nó ra:
"jsjdfjsjajfjdsjk x=1212312 jssjkjk y= 121212 dkjskj z=12121212 jkljklsdjkajkjk"
thành
1212312 nằm trên 1 ô
121212 nằm trên 1 ô khác
12121212 nằm trên 1 ô khác
có thể giúp em được không
 
Bạn hãy sử dụng Code sau:
Mã:
Option Explicit
'
Private Function SuperTrim(TheStr As String)
Dim Temp As String, DoubleSpase As String
DoubleSpase = Chr(32) & Chr(32)
Temp = Trim(TheStr)
Temp = Replace(Temp, DoubleSpase, Chr(32))
Do Until InStr(Temp, DoubleSpase) = 0
    Temp = Replace(Temp, DoubleSpase, Chr(32))
Loop
SuperTrim = Temp
End Function
'
Public Sub Tach_So()
Dim strText As String, strText_1 As String
Dim subText() As String, so() As Double
Dim i As Integer, j As Integer, k As Integer, m As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
strText = ActiveCell.Text
strText = SuperTrim(strText)
subText = Split(strText, " ")
For i = 0 To UBound(subText)
    For j = 1 To Len(subText(i))
        k = 0
        If IsNumeric(Mid(subText(i), j, 1)) Then
            k = j
            Exit For
        End If
    Next j
    If k <> 0 Then
        m = m + 1
        strText_1 = Val(Mid(subText(i), k))
        Cells(ActiveCell.Row, ActiveCell.Column + m) = strText_1
    End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Cách sử dụng:
Vào VBA, Insert Module rồi thêm đoạn code trên
Trở về MS Excel, chọn ô hoạt động là ô chứa dòng văn bẳn cần lấy số
Nhấn Alt+F8, chạy Macro Tach_so
 
Bạn thử dùng hàm này xem:

Function ExtractNumber(rCell As Range, _
Optional Take_decimal As Boolean, Optional Take_negative As Boolean) As Double

Dim iCount As Integer, i As Integer, iLoop As Integer
Dim sText As String, strNeg As String, strDec As String
Dim lNum As String
Dim vVal, vVal2

''''''''''''''''''''''''''''''''''''''''''
'Written by OzGrid Business Applications
'www.ozgrid.com

'Extracts a number from a cell containing text and numbers.
''''''''''''''''''''''''''''''''''''''''''
sText = rCell
If Take_decimal = True And Take_negative = True Then
strNeg = "-" 'Negative Sign MUST be before 1st number.
strDec = "."
ElseIf Take_decimal = True And Take_negative = False Then
strNeg = vbNullString
strDec = "."
ElseIf Take_decimal = False And Take_negative = True Then
strNeg = "-"
strDec = vbNullString
End If
iLoop = Len(sText)

For iCount = iLoop To 1 Step -1
vVal = Mid(sText, iCount, 1)


If IsNumeric(vVal) Or vVal = strNeg Or vVal = strDec Then
i = i + 1
lNum = Mid(sText, iCount, 1) & lNum
If IsNumeric(lNum) Then
If CDbl(lNum) < 0 Then Exit For
Else
lNum = Replace(lNum, Left(lNum, 1), "", , 1)
End If
End If

If i = 1 And lNum <> vbNullString Then lNum = CDbl(Mid(lNum, 1, 1))
Next iCount


ExtractNumber = CDbl(lNum)

End Function
Chuổi text Công thức Kết quả
a-bg-12909- =ExtractNumber(A1,,TRUE) -12909
a-bg-12909- =ExtractNumber(A2) 12909
a.a1.2... =ExtractNumber(A3,TRUE) 1.2
a.a1.2... =ExtractNumber(A4) 12
a.a-1.2.... =ExtractNumber(A5,TRUE,TRUE) -1.2
abg1290.11 =ExtractNumber(A6,TRUE) 1290.11
abg129013Agt =ExtractNumber(A7) 129013
abg129012 =ExtractNumber(A8) 129013
 
tách số khỏi chuỗi

nvson đã viết:
Bạn hãy sử dụng Code sau:
Mã:
Option Explicit
'
Private Function SuperTrim(TheStr As String)
Dim Temp As String, DoubleSpase As String
DoubleSpase = Chr(32) & Chr(32)
Temp = Trim(TheStr)
Temp = Replace(Temp, DoubleSpase, Chr(32))
Do Until InStr(Temp, DoubleSpase) = 0
    Temp = Replace(Temp, DoubleSpase, Chr(32))
Loop
SuperTrim = Temp
End Function
'
Public Sub Tach_So()
Dim strText As String, strText_1 As String
Dim subText() As String, so() As Double
Dim i As Integer, j As Integer, k As Integer, m As Integer
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
strText = ActiveCell.Text
strText = SuperTrim(strText)
subText = Split(strText, " ")
For i = 0 To UBound(subText)
    For j = 1 To Len(subText(i))
        k = 0
        If IsNumeric(Mid(subText(i), j, 1)) Then
            k = j
            Exit For
        End If
    Next j
    If k <> 0 Then
        m = m + 1
        strText_1 = Val(Mid(subText(i), k))
        Cells(ActiveCell.Row, ActiveCell.Column + m) = strText_1
    End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Cách sử dụng:
Vào VBA, Insert Module rồi thêm đoạn code trên
Trở về MS Excel, chọn ô hoạt động là ô chứa dòng văn bẳn cần lấy số
Nhấn Alt+F8, chạy Macro Tach_so
Cám ơn bạn mình đã thử và thấy tốt
nhưng nó có 2 vấn đề là:
+Không thể lấy ra số âm mà chỉ cho ra số dương
+Nếu mình có nhiều chuỗi cần tách số mà mỗi chuỗi mình phải chạy macro 1 lần thì rất tốn thời gian . Bạn có thể chỉ cho mình cách tạo ra 1 add ins để sử dụng nó như 1 hàm bình thường được không
cám ơn nhiều
 
Mình thì nghĩ giải quyết vấn đề theo cách khác :
Do 2 số bao giờ cũng cách nhau (ít nhất) 1
dấu cách. Do đó ta làm ba bước
1. Dùng công cụ Text to Columns để tách các số (có cả chữ) ra thành các ô riêng biệt.
2. Dùng biện pháp thay thế : Bất cứ ký tự nào trừ các con sốdấu âm (đk là phải đứng trước liền kề con số) đều trở thành rỗng "".
3.Gom các số lại.

Không biết như vậy có hợp lý không? Mong cao thủ chỉ giáo.

Thân!
 
hung1981 đã viết:
Cám ơn bạn mình đã thử và thấy tốt
nhưng nó có 2 vấn đề là:
+Không thể lấy ra số âm mà chỉ cho ra số dương
+Nếu mình có nhiều chuỗi cần tách số mà mỗi chuỗi mình phải chạy macro 1 lần thì rất tốn thời gian . Bạn có thể chỉ cho mình cách tạo ra 1 add ins để sử dụng nó như 1 hàm bình thường được không
cám ơn nhiều
Bạn thử đoạn code sau:
Mã:
Option Explicit
'
Private Function SuperTrim(TheStr As String)
Dim Temp As String, DoubleSpase As String
DoubleSpase = Chr(32) & Chr(32)
Temp = Trim(TheStr)
Temp = Replace(Temp, DoubleSpase, Chr(32))
Do Until InStr(Temp, DoubleSpase) = 0
    Temp = Replace(Temp, DoubleSpase, Chr(32))
Loop
SuperTrim = Temp
End Function
'
Public Function Tach_So(strText As String, index As Byte)
Dim strText_1 As String
Dim subText() As String, so() As Double
Dim i As Integer, j As Integer, k As Integer, m As Integer
strText = SuperTrim(strText)
subText = Split(strText, " ")
For i = 0 To UBound(subText)
    For j = 1 To Len(subText(i))
        k = 0
        If IsNumeric(Mid(subText(i), j, 1)) _
        Or (Mid(subText(i), j, 1) = "-" And IsNumeric(Mid(subText(i), j + 1, 1))) Then
            k = j
            Exit For
        End If
    Next j
    If k <> 0 Then
        m = m + 1
        strText_1 = Val(Mid(subText(i), k))
        ReDim Preserve so(1 To m) As Double
        so(m) = strText_1
    End If
Next i
If index > 0 And index <= m Then
    Tach_So = so(index)
Else
    Tach_So = ""
End If
End Function
+Nếu bạn muốn sử dụng thành Add-Ins thì:
Save as file đó sang dạng *.xla, rồi nhấn Tools/ Add-Ins/ Browse để chọn file *.xla mà bạn vừa tạo.
Nhấn OK.
Bây giờ bạn đã có hàm Tach_so rồi.
+Cách sử dụng hàm Tach_so:
Cú pháp:
Tach_So(strText As String, index As Byte)
Trong đó:
strText là chuỗi văn bản chứa số
index là vị trí của số (vì trong một chuỗi có thể có rất nhiều số)
+Ví dụ:
=tach_so("jsjdfjsjajfjdsjk x=1212.312a jssjkjk y= -1212.12 dkjskj z=-12121212cxczxc jkljklsdjkajkjk -990032",2)
sẽ cho kết quả là -1212.12
 
Cái này có áp dụng cho một vùng chọn không Bác nvson ơi ? VD : A1:A100.
 
MrHieu đã viết:
Cái này có áp dụng cho một vùng chọn không Bác nvson ơi ? VD : A1:A100.
Bạn sửa lại một chút Macro ở bài số 2 là được thôi mà!
 
không cần phức tạp thế

hung1981 đã viết:
có thể giúp em vấn đề này được không:
hôm trước trên diễn đàn có bài tách số ra khỏi chuỗi nhưng các số sau khi tách lại không tách riêng ra
Em có chuỗi sau muốn tạo 1 macro tách nó ra:
"jsjdfjsjajfjdsjk x=1212312 jssjkjk y= 121212 dkjskj z=12121212 jkljklsdjkajkjk"
thành
1212312 nằm trên 1 ô
121212 nằm trên 1 ô khác
12121212 nằm trên 1 ô khác
có thể giúp em được không

tigertiger thấy các bài trên có vẻ giải quyết vấn đề phức tạp wa (có thể tôi hiểu lầm, sorry). Theo tigertiger nếu chuẩn hóa chuỗi ký tụ như trên thì chỉ cần dùng công thức (không cần VBA) bình thường là đượcrồi ví dụ sau minh họa:

Có chuỗi kt
ô C4 = "jsjdfjsjajfjdsjk x=1212312 jssjkjk y= 121212 dkjskj z=12121212 jkljklsdjkajkjk"
tại các ô muốn lấy giá trị
X: D4 =VALUE(MID(C4,FIND("x=",C4)+2,FIND(" ",C4,3+FIND("x=",C4))-FIND("x=",C4)-2))

Y: E4 =VALUE(MID(C4,FIND("y=",C4)+2,FIND(" ",C4,3+FIND("y=",C4))-FIND("y=",C4)-2))

Z: F4 =VALUE(MID(C4,FIND("z=",C4)+2,FIND(" ",C4,3+FIND("z=",C4))-FIND("z=",C4)-2))



Chúc thành công,
 
Lần chỉnh sửa cuối:
Đã là tách số ra từ chuỗi thì ko nên dựa vào bất cứ ký hiệu nào đễ FIND cã... như thế sẽ rất dễ sai nếu như trong chuỗi ko có ký hiệu đó...
Theo tôi thì nên dựa vào hàm ISNUMBER là ăn chắc nhất... yêu cầu số phải nằm liền nhau...
Tôi làm như sau:
Đặt name:
Mã:
KT=ISNUMBER(MID(Sheet1!$A2,ROW(INDIRECT("1:"&LEN(Sheet1!$A2))),1)*1)
VT=MATCH(TRUE,KT,0)
Dai=SUM((KT)*1)
Cuối cùng là công thức:
Mã:
=IF(Dai=0,0,MID(Sheet1!$A2,VT,Dai)*1)
Xin xem file cụ thễ
Mến
ANH TUẤN
 

File đính kèm

  • Tachso_03.zip
    1.6 KB · Đọc: 537
Mr Okebab đã viết:
Mình thì nghĩ giải quyết vấn đề theo cách khác :
Do 2 số bao giờ cũng cách nhau (ít nhất) 1
dấu cách. Do đó ta làm ba bước
1. Dùng công cụ Text to Columns để tách các số (có cả chữ) ra thành các ô riêng biệt.
2. Dùng biện pháp thay thế : Bất cứ ký tự nào trừ các con sốdấu âm (đk là phải đứng trước liền kề con số) đều trở thành rỗng "".
3.Gom các số lại.

Không biết như vậy có hợp lý không? Mong cao thủ chỉ giáo.

Thân!

Mình đánh giá cao giải pháp này . Rất đơn giản và quan trọng là dữ liệu không bị thay đổi định dạng do đó sau khi xử lí rất thuận tiện cho các phép tính khác . Hơn nữa cách làm này còn tỏ ra hiệu quả khi phải xử lí một lượng dữ liệu rất lớn mà không làm nặng thêm file .
 
Mr Okebab đã viết:
Mình thì nghĩ giải quyết vấn đề theo cách khác :
........

2. Dùng biện pháp thay thế : Bất cứ ký tự nào trừ các con sốdấu âm (đk là phải đứng trước liền kề con số) đều trở thành rỗng "".

Không biết như vậy có hợp lý không? Mong cao thủ chỉ giáo.

Thân!
Vậy bạn Dùng biện pháp thay thế : Bất cứ ký tự nào trừ các con sốdấu âm (đk là phải đứng trước liền kề con số) đều trở thành rỗng "". như thế nào mong bạn ( các bạn ) chỉ giáo cho
 
anhtuan1066 đã viết:
Đã là tách số ra từ chuỗi thì ko nên dựa vào bất cứ ký hiệu nào đễ FIND cã... như thế sẽ rất dễ sai nếu như trong chuỗi ko có ký hiệu đó...
Theo tôi thì nên dựa vào hàm ISNUMBER là ăn chắc nhất... yêu cầu số phải nằm liền nhau...
Tôi làm như sau:
Đặt name:
Mã:
KT=ISNUMBER(MID(Sheet1!$A2,ROW(INDIRECT("1:"&LEN(Sheet1!$A2))),1)*1)
VT=MATCH(TRUE,KT,0)
Dai=SUM((KT)*1)
Cuối cùng là công thức:
Mã:
=IF(Dai=0,0,MID(Sheet1!$A2,VT,Dai)*1)
Xin xem file cụ thễ
Mến
ANH TUẤN

Oh, atuan... lại lôi vấn đề cũ lại thế ah?
cái chuỗi ký tự đo -trông là biết người hỏi copy từ lệnh List lấy tọa độ đối tượng trong CAD rồi - và luôn có đặc điểm như vậy
vì thế thì ta dùng DAO NHỎ là đủ mổ nó rồi,
.
 
Nguyễn Xuân Sơn đã viết:
Vậy bạn Dùng biện pháp thay thế : Bất cứ ký tự nào trừ các con sốdấu âm (đk là phải đứng trước liền kề con số) đều trở thành rỗng "". như thế nào mong bạn ( các bạn ) chỉ giáo cho

Chắc chắn phải dùng VBA rồi
bạn có thể theo dõi chủ đề sau, cùng xây dựng nhé, có nhiều cái hay đó:

http://www.giaiphapexcel.com/forum/showthread.php?p=50953#post50953

hy vọng bạn đóng góp và xd cùng
 
Bác anhtuan1066 ơi. Sao mình down file của bạn về xong mà không tài nào xem được nhỉ. Mở ra thì toàn ký tự lạ.
 
Brutal đã viết:
Bác anhtuan1066 ơi. Sao mình down file của bạn về xong mà không tài nào xem được nhỉ. Mở ra thì toàn ký tự lạ.
Trong topic này chỉ có 1 file là cũa tôi, mà nó cũng xài font Unicode cơ mà... sao lại có thể ko đọc dc? Hay bạn đang nói đến file nào khác?
ANH TUẤN
 
Công thức của bác hay nhưng Bác ơi cái chuỗi "56hk16" thì báo lỗi value bác ạ!Hic! Không tách số"5616" ra được.
 
Anh ơi , khi ta dung cú pháp này : thì chuỗi 1234abcd sẽ thành 1234, nhưng nếu có thêm số 0 nữa nghĩa là : 01234abcd thì nó ko lấy cả số 0, vẫn 1234. Anh giúp em với ^^
 
Anh ơi , khi ta dung cú pháp này : thì chuỗi 1234abcd sẽ thành 1234, nhưng nếu có thêm số 0 nữa nghĩa là : 01234abcd thì nó ko lấy cả số 0, vẫn 1234. Anh giúp em với ^^

Bạn làm theo cú pháp gì vậy??? bạn muốn tách ra là 01234 một chuỗi và abcd một chuỗi ?
 
Web KT
Back
Top Bottom