Lấy số từ dãy ký tự

  • Thread starter Thread starter joankim
  • Ngày gửi Ngày gửi
Liên hệ QC

joankim

Thành viên mới
Tham gia
1/2/08
Bài viết
8
Được thích
0
Cho em hỏi hàm nào có thể cho phép lấy số từ 1 dãy ký tự
Vd: Ô A1 có nội dung là "Hôm nay là ngày 11 tháng 04 năm 2008"
Ở ô B1 em muốn lấy ra các số 11,04,2008 từ ô A1 thì em phải làm thế nào.
Nhờ các bác giúp em với!
Thanks nhiều.
 
Lấy ra 1 cái gì đó từ trong đống hổn độn thì trước tiên phải biết dc quy luật của đống hổn độn này... Chẳng hạn có phải sau chử ngày sẽ là số, sau chử tháng sẽ là số ???.. vân vân...
Vì thế mà tốt nhất nên có file thực tế bạn à! Mất công làm xong bạn lại thay đổi yêu cầu!
ANH TUẤN
 
File của mình cột A có dữ liệu thuộc dạng text và luôn có số trong dãy chữ (thường chỉ một số thôi), mình muốn lấy số đó ra để vào cột B để mà sắp xếp và tính toán.
Ví dụ: Cột A của mính bao gồm các dòng:
A1: Tiết kiệm Kỳ hạn 02 th lãi cuối kỳ
A2: Tiết kiệm dự thưởng kỳ hạn 02 th lãi hàng tháng
A3: Tiết kiệm hấp dẫn kỳ hạn 03 th lãi cuối kỳ
A4: Tiết kiệm lũy tiến kỳ hạn 06 tháng lãi hàng quý
... rất nhiều nữa
nói chung là các số trong cột A không bao giờ nằm ở một vị trí nhất định, nếu nằm ở một vị trí nhất định thì mình dùng hàm MID lấy được rồi.
Nhờ các bạn chỉ giáo
 
Dù là số ko nằm ở vị trí nhất định nhưng nó phải có đặc điểm gì đó chứ! Bạn vui lòng xác định dùm mấy món sau:
1> Số có nằm gần 1 chử gì cố định ko?
2> Trong dảy có 1 số hay nhiều số?
Tại theo như bạn vừa cho ví dụ thì tôi thấy trong dảy chỉ có 1 số, và đặc biết nó luôn nằm gần chử "hạn"...
Bạn thấy sao?
Mà nè: sao bạn ko đưa file lên cho dể làm?
ANH TUẤN
 
Thứ nhất: Xin lỗi mình không có quyền gửi file, cái này mình cũng muốn hỏi mấy bạn là có phải do mình là thành viên mới hay sao mà không được phép gửi và tải file.
Thứ hai: Dãy đó là mình ví dụ một số hàng thôi, chứ nó không có quy luật gì hết bạn ơi, thế mới chán chứ.
Ví dụ: có hành thì như thế này
Tiền gửi 03 tháng lãi háng quý
hay
TGTK 3th lãi cuối kỳ
TG TK CKH 6 tháng lãi hàng tháng
Tiết kiệm 24 tháng lãi 6 tháng

nói chung là không có quy luật và mình muốn láy số đầu tiên (tức là kỳ hạn) thôi
Mình diễn tả như thể chắc đã rõ
Rất mong nhận được sự giúp đỡ.
Chán quá, sao mà chẳng cho mình gửi file
 
Lấy số từ chuỗi ký tự bất kỳ

Thứ nhất: Xin lỗi mình không có quyền gửi file, cái này mình cũng muốn hỏi mấy bạn là có phải do mình là thành viên mới hay sao mà không được phép gửi và tải file.
Thứ hai: Dãy đó là mình ví dụ một số hàng thôi, chứ nó không có quy luật gì hết bạn ơi, thế mới chán chứ.
Ví dụ: có hành thì như thế này
Tiền gửi 03 tháng lãi háng quý
hay
TGTK 3th lãi cuối kỳ
TG TK CKH 6 tháng lãi hàng tháng
Tiết kiệm 24 tháng lãi 6 tháng

nói chung là không có quy luật và mình muốn láy số đầu tiên (tức là kỳ hạn) thôi
Mình diễn tả như thể chắc đã rõ
Rất mong nhận được sự giúp đỡ.
Chán quá, sao mà chẳng cho mình gửi file


Bạn xem thử có đúng ý bạn không? Bạn cho con trỏ vào ô A1 (hoặc con trỏ vào nơi có dữ liệu cần trích) xong ấn nút <Loc So>, các messagebox từ từ hiện ra, bạn cứ OK cho tới khi ra kết quả nhé (mục đích của messagebox là cho bạn thấy thứ tự làm việc của đoạn code này).

Bạn lấy ví dụ cho số nằm tùm lum chen lẫn các ký tự chữ cái, khoản trắng rồi test cho đã. Tuy nhiên lưu ý độ dài chuỗi mình set const là 1000 ký tự thôi, thích thì bạn sửa lại.

Các anh chị góp ý cho đoạn code này nhé. Thanks in advance.
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn gữi vào địa chỉ mail của tôi nhé:
yeulachet1066@yahoo.com
Cho biết luôn bạn muốn lấy mấy số ấy và đặt ra cell khác như thế nào?
Ví dụ: Nếu chuổi có 2 số thì tách ra thành 2 cell hay như thế nào?
ANH TUẤN
 
Nếu bạn muốn xử lýcho nhiều dòng thì cho nguyên đoạn code của mình vào một vòng lặp nữa.
 
Chào JoanKim,
Bạn dùng hàm VBA này, mở rộng tới mọi chuỗi ký tự: có dấu thập phân là chấm, hoặc phẩy, có nhiều nhóm số từ 1 đến hết, số có dấu phân cách hàng ngàn, số âm. Điều kiện là giữa các nhóm phải có ký tự, dấu thập phân phải đồng nhất.
Cấu trúc hàm: = CtoNPus(Chuoi, SttSo, DauTP)
SttSo là Số thứ tự nhóm số nằm trong chuỗi
 

File đính kèm

Tôi nhận dc mail của bạn rồi! Đây là file của bạn đấy!
ANH TUẤN
 

File đính kèm

Tôi nhận dc mail của bạn rồi! Đây là file của bạn đấy!
ANH TUẤN

Bạn JoanKim xem thử hàm LocSo mình viết thử xem như vầy có đúng ý bạn chưa. Mình đổi từ thủ tục sang một hàm (formula), như vậy bạn dễ làm hơn phải không.
Cú pháp là:

Mã:
=LocSo([Ô/giá trị cần trích lọc],[ký tự ngăn cách])

Bạn xem ở file đính kèm.
 

File đính kèm

Ví dụ: có hành thì như thế này
Tiền gửi 03 tháng lãi háng quý
hay
TGTK 3th lãi cuối kỳ
TG TK CKH 6 tháng lãi hàng tháng
Tiết kiệm 24 tháng lãi 6 tháng

nói chung là không có quy luật và mình muốn láy số đầu tiên (tức là kỳ hạn) thôi
Mình diễn tả như thể chắc đã rõ
Rất mong nhận được sự giúp đỡ.
Chán quá, sao mà chẳng cho mình gửi file
To ca_dafi: Hình như công thức bạn làm chưa đáp ứng được yêu cầu của joankim rồi. Bạn cần dừng vòng lặp ngay khi tìm được con số đầu tiên và cho ra kết quả.
VD:
TG TK CKH 6 tháng lãi hàng tháng --> kq = 6
Tiết kiệm 24 tháng lãi 6 tháng --> kq = 24
 
Em xin góp 1 function:
=LSO(Dữ liệu cần lọc số)
 

File đính kèm

Nếu thích, chỉ cần ấn tổ hợp phím,

Macro sau sẽ làm tất thẩy các việc còn lại
PHP:
Option Explicit
Sub KyHan()
 Dim lRow As Long, jW As Long
 
 lRow = Range("A65432").End(xlUp).Row
 For jW = 2 To lRow
    With Range("A" & jW)
        .Offset(, 4) = LSO(.Value)
    End With
 Next jW
End Sub
Chú í:
* Macro gọi hàm của bạn angduca; Nên dĩ nhiên phải có hàm đó trong module
* Macro đang gán kỳ hạn vô cột 'D'; nếu thích đổi, thì sử lại theo í.
* Nhớ rung đùi, sau khi nhấn tổ hợp phím!
 
To ca_dafi: Hình như công thức bạn làm chưa đáp ứng được yêu cầu của joankim rồi. Bạn cần dừng vòng lặp ngay khi tìm được con số đầu tiên và cho ra kết quả.
VD:
TG TK CKH 6 tháng lãi hàng tháng --> kq = 6
Tiết kiệm 24 tháng lãi 6 tháng --> kq = 24

Thanks bạn, mình thì lại dựa theo ý này:
Cho em hỏi hàm nào có thể cho phép lấy số từ 1 dãy ký tự
Vd: Ô A1 có nội dung là "Hôm nay là ngày 11 tháng 04 năm 2008"
Ở ô B1 em muốn lấy ra các số 11,04,2008 từ ô A1 thì em phải làm thế nào.
Nhờ các bác giúp em với!
Thanks nhiều.

Nếu làm theo cách của bạn cũng được, nhưng phải thêm vào:
Mã:
=mid(LocSo(Text,"-"),1,find("-",LocSo(Text,"-"),1)-1)


 
Bạn ca_dafi ơi, code của bạn mang tính hàn lâm cao quá, nhìn vào mình chẳng hiểu gì cả _)()(-
Bạn có thể giải thích ý nghĩa các đoạn code cho mình được không?
Thanks in advance.
 
Chào bạn, mình cũng là dân mới làm quen với VBA thôi, chứ chẳng phải hàn lâm như bạn nghĩ đâu, mình xin mạng phép có đôi lời như sau:
PHP:
Function LocSo(TargetText As String, Optional Signal As String)
Dim ResultText As String
Dim TextLenth As Integer
Dim ZPoint(1000, 1) As Variant
IZ = -1
TextLenth = Len(TargetText) 'Đếm số ký tự trong chuỗi cần lọc

If TextLenth = 0 Then
LocSo = 0
Else

'Quét các ký tự từ trái qua phải, ký tự nào là số thì cho vào cột 1 của mảng ZPoint, 
'Cột 0 của Mảng ZPoint lưu số thự tự của ký tự số trong chuỗi (biến ZZ)

For ZZ = 1 To TextLenth
    If IsNumeric(Mid(TargetText, ZZ, 1)) Then
    ResultText = ResultText + Mid(TargetText, ZZ, 1)     'Thay thế kết quả bằng kết quả lần trước nối với ký tự kế tiếp tìm được
    IZ = IZ + 1   'Chỗ này là thể hiện Row number của Mảng ZPoint
    ZPoint(IZ, 0) = ZZ      'Ghi lại số thứ tự của ký tự số tìm được trong chuỗi, gán vào cột 0
    ZPoint(IZ, 1) = Mid(TargetText, ZZ, 1)   ' Gán ký tự số tìm được vào cột 1 của mảng ZPoint
    End If
Next ZZ     
'Hoàn tất việc lọc các ký tự số
'----------------------------------------------------------

'Trả kết quả về ký tự số đầu tiên tìm được, mục đích để chèn vào ký hiệu phân cách (biến Signal)
ResultText = ZPoint(0, 1)

'Nối lần lượt các giá trị số tìm được theo thứ tự , cách nhau bởi ký hiệu phân cách "Signal":
'Thuật toán như sau: Mảng Zpoint có Cột 0 là cột lưu thứ tự của ký tự số trong chuỗi, 
'Nếu hai ký tự số đứng kế nhau trong chuỗi thì hiệu số của hai vị trí này là 1, 
'Nếu Hiệu số là 1 thì kết quả = kết quả nối với ký tự số kế tiếp đó, 
'Nếu hiệu số <> 1 thì kết quả = kết quả + ký hiệu phân cách + ký tự số kế tiếp

For JZ = 1 To IZ   
If ZPoint(JZ, 0) - ZPoint(JZ - 1, 0) = 1 Then
ResultText = ResultText + ZPoint(JZ, 1)
Else
ResultText = ResultText + Signal + ZPoint(JZ, 1)
End If
'a = MsgBox(ResultText, , "tip")
Next JZ
'a = MsgBox("Ket qua la: " & ResultText, , "tip")
LocSo = ResultText
End If

End Function
Mình nghĩ còn nhiều anh chị trên GPE còn có nhiều cách giải hay hơn mình đấy. Thân
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom